forked from corosolto/client
-
Notifications
You must be signed in to change notification settings - Fork 0
171 lines (162 loc) · 7.17 KB
/
Copy pathci.yml
File metadata and controls
171 lines (162 loc) · 7.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
name: pr-fast
on:
push:
branches: [main]
tags: ['v*']
pull_request:
concurrency:
group: pr-fast-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: 22
cache: npm
- run: npm ci
- name: Python CI scripts syntax
run: python3 -m py_compile scripts/ci/*.py
- name: Bash scripts syntax
run: bash -n scripts/*.sh
- name: Fronteira de confiança dos workflows
run: python3 scripts/ci/workflow_security_check.py --selftest
- name: Contrato do release (nome, créditos e DCO do bot)
run: npm run eval:release
- name: Syntax check do jogo (public/js)
run: npm run syntax
- name: Telemetria wired, idempotente, atômica e monitorada
run: npm run eval:telemetry
- name: Proveniência de erros externos
run: npm run eval:error-origin
- name: UUID compatível com navegadores antigos
run: npm run eval:uuid
- name: Acúmulo de armas no chão tem teto
run: npm run eval:drop
# Pendurar a régua só no `check:fast` a faria rodar na máquina de quem lembra
# de rodar, e NÃO no portão: este job lista cada `npm run eval:*` explicitamente.
- name: Todo mapa devolve o que o game.js consome
run: npm run eval:mapcontrato
- name: Veículos do estacionamento em escala de fábrica
run: npm run eval:escala
- name: Orçamento de shader WebGL1
run: npm run eval:shaderbudget
# O ARCH.md (índice por linha + tabela de conflito) é GERADO. Escrito à
# mão ele desatualiza no primeiro commit, e uma tabela de conflito com
# linha errada é pior que não ter tabela: dois agentes acham que estão em
# regiões diferentes e não estão.
- name: Documentação gerada está em dia
run: npm run docs:check
- name: ARCH.md gerado está em dia
run: npm run arch:check
# Precisa de rede, por isso NÃO entra no check:deploy (que roda dentro do
# build da Vercel). Vulnerabilidade nova em dep de produção reprova aqui.
- name: Dependência de produção sem vulnerabilidade nova
run: npm run eval:deps
- name: Manifesto de wallpapers está em dia
run: npm run media:check
- name: Texto público sem travessão
run: npm run travessao:check
# Hash das skills de terceiros confere com o skills-lock.json (issue #42):
# lock que ninguém verifica não detecta conteúdo trocado depois de travado.
- name: Skills de terceiros conferem com o lock
run: npm run verify:skills
# O auditor de VM escreve o JSON consumido pelas invariantes; a ordem é contrato.
- name: Enquadramento do viewmodel por arma (26 armas, GLB real)
run: node tools/eval/vm-mint-audit.mjs
- name: Invariantes (portão — falha crítica reprova o PR)
run: node tools/eval/invariants.mjs
- name: Coice do viewmodel (near plane + pitch em rajada)
run: node tools/eval/vm-kick-sim.mjs
- name: Navegação dos bots (60 s × 5 mapas, sementes fixas)
run: node tools/eval/botsim.mjs 60 all
- name: Astro build
run: npm run build
# PORTÃO DO SITE. `astro build` verde não prova nada sobre as rotas:
# /ranking pode dar 500, /sitemap.xml pode sair vazio e o build passa em
# todos os casos. Roda DEPOIS do build porque o arnês sobe o `astro dev`,
# que precisa das deps instaladas — e checa o caminho de degradação SEM
# Supabase, que é exatamente o estado do CI.
- name: Smoke do site (13 rotas, contrato + JSON-LD)
run: node tools/eval/site-smoke.mjs
# O bloco de autoria sai do shortlog e o squash reescreve o autor: num PR ele não é
# derivável (ver tools/eval/docs-autoria-check.mjs). Aqui, na main, é — e só aqui reprova.
# fetch-depth: 0 é obrigatório: com clone raso o gerador PULA esse bloco e o portão fica cego.
autoria-na-main:
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
with:
fetch-depth: 0
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: 22
cache: npm
- run: npm ci
- name: Bloco de autoria em dia (derivável só depois do merge)
run: npm run docs:check:autoria
dco:
runs-on: ubuntu-latest
timeout-minutes: 5
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
with:
fetch-depth: 0
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
with:
python-version: '3.13'
# Régua se prova antes de medir o PR: portão quebrado passa calado.
- name: Autoteste das réguas de CI
run: |
python3 scripts/ci/ensure_labels.py --selftest
python3 scripts/ci/autofix_allowlist.py --selftest
python3 scripts/ci/dco_check.py --selftest
python3 scripts/ci/agente_check.py --selftest
- name: Check Signed-off-by
run: |
printf '{"baseRefOid":"%s","headRefOid":"%s"}' \
"${{ github.event.pull_request.base.sha }}" \
"${{ github.event.pull_request.head.sha }}" > /tmp/dco.json
python3 scripts/ci/dco_check.py < /tmp/dco.json
# A régua se prova antes de medir o PR: sem isto, portão quebrado passa calado.
- name: Check trailer Agent
run: python3 scripts/ci/agente_check.py < /tmp/dco.json
release:
if: startsWith(github.ref, 'refs/tags/v')
needs: build
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: write
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
- name: Extrair notas do CHANGELOG
run: |
TAG="${GITHUB_REF_NAME#v}"
awk "/^## \\[$TAG\\]/{f=1;next}/^## \\[/{f=0}f" CHANGELOG.md > release-body.md
- name: Criar GitHub Release
run: |
EXTRA=()
if [ -s release-body.md ]; then
EXTRA=(--notes "$(cat release-body.md)")
fi
# Idempotente: o release.yml do push na main e este job do push da
# TAG criam a mesma release numa corrida de segundos — o perdedor
# levava 422 "tag_name already exists" e pintava o run de vermelho
# (alpha.154, 18/08). Release que já existe NÃO SE TOCA: o `edit`
# com --notes do CHANGELOG APAGAVA a seção "What's Changed" com os
# colaboradores que o vencedor gerou (alpha.156-.158, 19/08).
TAG="${{ github.ref_name }}"
if gh release view "$TAG" >/dev/null 2>&1; then
echo "release $TAG já existe (vencedor da corrida) — nada a fazer"
exit 0
fi
gh release create "$TAG" --generate-notes "${EXTRA[@]}" --title "CSBR $TAG"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}