OPS62 — CI: fail-fast estrutural por job único sequencial (X1) #75
Loading…
Reference in a new issue
No description provided.
Delete branch "OPS62-ci-cancelar-jobs-irmaos-quando-um-job-falha-fail-fast-"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #59
O que muda
ci-pr.ymleci.ymldeixam de ter jobs irmãos: 1 job únicocheckssequencial (guards → lint → format → typecheck → knip → cycles → unit → int → build → e2e). Step vermelho interrompe o job → run falha → slot do runner liberado imediatamente. Fail-fast estrutural: sem API de cancel (o Forgejo 9.0.3 não tem), sem watchdog, sem upgrade do Forgejo no homeserver.ci-scope.mjsviram o stepid: scope(outputs →if:nos steps pesados).PLAYWRIGHT_WORKERS=4(substitui 2 shards × 2 workers).run_id— o job único segura as duas portas pelo run inteiro e runs concorrentes colidiriam em portas fixas.CI (PR) / checkspreservado (job idchecks— contrato do automergerwaitForChecks/branch protection, OPS61).deploy(OPS53) segue gated emneeds: [checks].e2eShardConfig+ outpute2e_shardsdo classifier./simplify3 reviewers aplicados (P1:set -euo pipefailno scope — crash com outputs vazios silenciaria skips; portas por run. P2: pins ancorados em chaves YAML, pin do wiringid: scope/if: e2e_mode == 'full', comentário morto do sharding noplaywright.config.ts/TESTING.md). Débito anotado: timeout dowaitForChecks(30 min) × job (50 min).Decisão
A intenção previa watchdog + upgrade do Forgejo 16 (API de cancel). Gate de execução (humano): X1 — job único sequencial, que elimina a dependência de infra (upgrade de produção no homeserver) com o mesmo aceite de produto: run vermelho termina no ato, sem esperar o fim dos demais, logs preservados, suíte verificada idêntica (só o envelope muda).
Impl:
docs/plans/ops62-ci-fail-fast-forgejo-impl.md(a intenção fica como histórico do gate). Changelog:docs/changelog/2026-08-18-ops62.md.Validação ao vivo
O ci-pr deste PR já é o envelope novo: o run verde prova a suíte inteira no job único; medição de parede registrada no run. Sem migration/access/Consent/UI.
Achado ao vivo (run 730): a expressão ${{ 5433 + (github.run_id % 100) }} no ports do service não é avaliada pelo Forgejo 9 — o literal ia ao runner e o job falhava em 1s. E portas fixas colidiriam entre runs concorrentes (o job único segura os services pelo run inteiro). Correção: services sem publish host, alcançados por nome na rede do job (postgres-int/postgres-build:5432) — solução canônica do Actions, mata a colisão de raiz. Guards fail-closed (LOCAL_HOSTS + assertTestDatabase) admitem os nomes dos services (hosts internos do runner; hosts remotos continuam rejeitados); pins novos em localHosts.unit.spec.ts e ciSkipInvariants (sem ports:, URLs por nome).1a2b1169a8to659f25f076