feat(ci): ci.yml idêntico em todos os produtos + ci-config.yml por repo [INFRA-65726] #19

Merged
tarcisio merged 6 commits from feat/INFRA-65726-ci-identico into main 2026-09-30 10:44:20 -03:00
Owner

Decisão do operador (30/09): o CI é único e o arquivo é o mesmo em todos os produtos, exceto TMF7 e TMF9. O Forgejo 15 não tem workflow de organização, então cada repo tem a MESMA cópia de .forgejo/workflows/ci.yml, sem with:, e o que diverge fica em .forgejo/ci-config.yml.

O que entra:

  • O reusable ci.yml lê o ci-config.yml. O schema reprova chave desconhecida; sem o arquivo, valem os padrões; os with: legados continuam aceitos.
  • Chaves novas, todas pedidas pelos produtos:
    • backend_install_cmd, backend_test_cmd, backend_pre_test_cmd, backend_workdir e extra_gates_cmd;
    • frontend_typecheck_cmd, frontend_test_cmd, frontend_build_cmd, frontend_lint e package_manager (pnpm);
    • postgres_service (user, db, args, init_sql), redis_service e test_env;
    • alembic_dirs, fetch_depth, ruff e uv_index_name;
    • audit_ignores, por pacote, com motivo e data de validade.
  • O gates ganha ruff format --check, py_compile, pip-audit (OSV) e npm/pnpm audit ao lado do Trivy, que passa a usar --ignorefile explícito. Isso fecha a INFRA-67610.
  • Proteções contra gate verde que não verifica nada:
    • tsc sem tsconfig reprova;
    • smoke_import não tem mais padrão;
    • ruff sem caminho declarado reprova;
    • passo do meio que falha deixa o gate vermelho, corrigindo o set -e em contexto de condição;
    • job que não se aplica aparece como NÃO SE APLICA.
  • O template dispara PR também para epic/** e release/**.
  • scripts/conferir-ci-identico.sh: o próprio CI reprova cópia editada do ci.yml ou do hub-issue-sync.
  • O hub-issue-sync.yml perde o secrets: do workflow_call (INFRA-64944). Fica provisório até o webhook de organização Forgejo → Hub.
  • Postgres e Redis sobem pela API do daemon, e não por services: (que derruba o runner, TH-56672). As imagens vêm de tmf/base-images, porque o mirror ainda não tem pgvector nem redis; há TODO.

Validado localmente: 86 testes, 145 subtestes, shellcheck, bash -n em 45 blocos run: e um controle positivo real (pyjwt==2.13.0 reprova no pip-audit contra o OSV).
Só se prova rodando no Forgejo: o clone pela ref do uses:, outputs em fetch-depth, GITHUB_ENV, corepack/pnpm no container, serviços via socket, o índice privado e o nome dos checks. O HelpCor adota primeiro e prova esses pontos.

⚠️ Muda também quem já chama com with:: smoke_import fica sem padrão, e ruff format/py_compile passam a vir ligados.

🤖 Generated with Claude Code

Decisão do operador (30/09): o CI é único e o arquivo é o mesmo em todos os produtos, exceto TMF7 e TMF9. O Forgejo 15 não tem workflow de organização, então cada repo tem a MESMA cópia de .forgejo/workflows/ci.yml, sem with:, e o que diverge fica em .forgejo/ci-config.yml. O que entra: - O reusable ci.yml lê o ci-config.yml. O schema reprova chave desconhecida; sem o arquivo, valem os padrões; os with: legados continuam aceitos. - Chaves novas, todas pedidas pelos produtos: - backend_install_cmd, backend_test_cmd, backend_pre_test_cmd, backend_workdir e extra_gates_cmd; - frontend_typecheck_cmd, frontend_test_cmd, frontend_build_cmd, frontend_lint e package_manager (pnpm); - postgres_service (user, db, args, init_sql), redis_service e test_env; - alembic_dirs, fetch_depth, ruff e uv_index_name; - audit_ignores, por pacote, com motivo e data de validade. - O gates ganha ruff format --check, py_compile, pip-audit (OSV) e npm/pnpm audit ao lado do Trivy, que passa a usar --ignorefile explícito. Isso fecha a INFRA-67610. - Proteções contra gate verde que não verifica nada: - tsc sem tsconfig reprova; - smoke_import não tem mais padrão; - ruff sem caminho declarado reprova; - passo do meio que falha deixa o gate vermelho, corrigindo o set -e em contexto de condição; - job que não se aplica aparece como NÃO SE APLICA. - O template dispara PR também para epic/** e release/**. - scripts/conferir-ci-identico.sh: o próprio CI reprova cópia editada do ci.yml ou do hub-issue-sync. - O hub-issue-sync.yml perde o secrets: do workflow_call (INFRA-64944). Fica provisório até o webhook de organização Forgejo → Hub. - Postgres e Redis sobem pela API do daemon, e não por services: (que derruba o runner, TH-56672). As imagens vêm de tmf/base-images, porque o mirror ainda não tem pgvector nem redis; há TODO. Validado localmente: 86 testes, 145 subtestes, shellcheck, bash -n em 45 blocos run: e um controle positivo real (pyjwt==2.13.0 reprova no pip-audit contra o OSV). Só se prova rodando no Forgejo: o clone pela ref do uses:, outputs em fetch-depth, GITHUB_ENV, corepack/pnpm no container, serviços via socket, o índice privado e o nome dos checks. O HelpCor adota primeiro e prova esses pontos. ⚠️ Muda também quem já chama com with:: smoke_import fica sem padrão, e ruff format/py_compile passam a vir ligados. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
- scripts/ci_config.py: lê .forgejo/ci-config.yml (subconjunto estrito de
  YAML, só stdlib), valida contra schemas/ci-config.schema.json (chave
  desconhecida reprova com o nome) e publica um output por chave.
  Precedência ci-config > with: legado > padrão.
- scripts/conferir-ci-identico.sh: sha256 do ci.yml e do hub-issue-sync.yml
  contra os templates + validação do ci-config (modos estrito e ci).
- scripts/auditar_deps.py: pip-audit (OSV) e npm/pnpm audit com supressão
  por pacote e prazo; vencida reprova [INFRA-67610].
- scripts/servicos-efemeros.sh: Postgres/Redis pela API do daemon (sem
  services:, TH-56672), com DATABASE_URL/REDIS_URL.
- tests/ci-config: schema válido/inválido, defaults, verificador com controle
  negativo e positivo, pyjwt==2.13.0 reprova de verdade, passo do meio que
  falha deixa o gate vermelho.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- ci.yml: changes (imagem Python) baixa o ci-shared na mesma ref do uses:,
  resolve a config, confere a cópia idêntica e publica outputs; gates,
  backend e frontend usam os outputs nos passos (jobs sempre rodam).
- Modo derivado do evento (smoke no push de develop). Novas chaves:
  backend_install/pre_test/test_cmd, backend_workdir, extra_gates_cmd,
  alembic_dirs, postgres/redis efêmeros, test_env, uv_index_name,
  ruff/ruff_format/py_compile, pip/npm audit + audit_ignores,
  package_manager, frontend_lint/typecheck/test/build_cmd, fetch_depth.
- Trivy com --ignorefile .trivyignore explícito [INFRA-67610].
- Job desligado aparece como NÃO SE APLICA; comando customizado vai ao log.
- templates/ci-chamador.yml canônico (PR também em epic/** e release/**);
  templates/hub-issue-sync-chamador.yml como 2º arquivo idêntico;
  templates/ci-config.exemplo.yml com todas as chaves.
- hub-issue-sync.yml sem secrets: em workflow_call (INFRA-64944): token por
  input hub_token, secret de chamador legado ou Infisical.
- Descrições de input sem exemplo por produto.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Reescreve a seção de adoção: tabela de chaves, cópia idêntica conferida pelo
próprio CI, passo 0 de auditoria local sem supressão, cobertura como
responsabilidade do produto, job ao lado obrigatório na branch protection,
TMF7 e TMF9 fora por decisão do operador. hub-issue-sync marcado como
provisório até o webhook de organização.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Achado do tmf-platform: venv novo escapa do teto da imagem e resolve SQLAlchemy 2.1.1.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sem uv.lock nem requirements, o gates adia e o job backend audita o ambiente instalado (PIPAPI_PYTHON_LOCATION). Achado do tmf-platform: o gate passava verde sem auditar as deps dos 10 backs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A ref precisa ser a que está rodando (TMF_CI_SHARED_REF). Qualquer outra edição continua reprovando. Bloqueio achado pelo DANI antes da primeira run.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
tarcisio deleted branch feat/INFRA-65726-ci-identico 2026-09-30 10:44:20 -03:00
Sign in to join this conversation.
No reviewers
No labels
seguranca
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
TMF/ci-shared!19
No description provided.