feat(release): workflow reutilizável fechar-release.yml e template do chamador [INFRA-71902] #166

Merged
tmf-ia merged 2 commits from feat/INFRA-71902-workflow-fechar-release into develop 2026-11-04 00:45:19 -03:00
Owner

O que muda

Última peça do "fechar release" no ci-shared (ADR 0022; epic TMFP-60560): o workflow reutilizável e o chamador do produto. Ele usa a porta Forgejo (#161), o bloco release: (#162) e o orquestrador (#164).

  • .forgejo/workflows/fechar-release.yml (workflow_call): sem bloco secrets: (INFRA-64944), shell: bash com pipefail, actions pinadas, tokens mascarados. Os passos rodam nesta ordem:
    1. checkouts do produto e do ci-shared;
    2. config (ci_config.py fechar-release);
    3. resolução do SHA: vazio vale a ponta de origin/<dispatch_branch>, e com publish_workflow um SHA diferente da ponta reprova antes de escrever;
    4. segredos do Infisical;
    5. guarda de identidade (scripts/release/guarda-fechar-release.py): só faz GET /user, e outro login ou 403 por falta de read:user reprova ali;
    6. orquestrador, o único passo que escreve. O resumo vai para o job summary.
  • templates/fechar-release-chamador.yml: workflow_dispatch com version e issues, chamando @main, com concurrency por versão.
  • scripts/conferir-ci-identico.sh: passa a cobrir o fechar-release.yml do produto. É opcional; se o arquivo existir, tem de ser idêntico ao template.
  • scripts/ci_config.py fechar-release: na CLI, escreve também infisical_project/env/path/host. Quem chama a função não muda.
  • docs/guia-de-adocao.md e CHANGELOG.md.

Token do bot

  • Caminho provisório (pendência do ADR 0022): segredo TMF_IA_FORGEJO_TOKEN no infisical_project do ci-config, ambiente infisical_env (padrão prod), pasta /release.
  • Overrides: os inputs bot_token_infisical_project/env/path trocam isso sem editar o chamador.
  • Escopos necessários: o token precisa de read:user e de escrita no repo. O token atual do bot não tem read:user, então a guarda reprova até o operador emitir um novo.

Prova local

tests/fechar-release        33 OK  (contrato: inputs, sem secrets:, shell: bash, pin; chamador idêntico ao template;
                                    identidade diferente de tmf-ia reprova antes de escrever, rodando o run: real do passo
                                    contra um Forgejo falso — única requisição é GET /user)
tests/release-orquestrador  22 OK
tests/release-provider      27 OK
tests/pin-actions            8 OK
tests/release              458 OK
tests/ci-unico             153 OK
tests/ci-config            206, 2 falhas de antes (test_heavy_fora_do_pr, sem pytest local)

Não verificado

  • O workflow ainda não rodou no act_runner.
  • O caminho /release do token ainda não existe no Infisical.
  • Não testei expressão com || em with: de action composta, nem if: com inputs.* em workflow_call.
  • A ponta da dispatch_branch pode andar entre a resolução do SHA e o dispatch. Nesse caso a publicação fica pendente (exit 1) e a reexecução retoma.

Toca workflow *release* (CI de entrega): precisa do parecer security-reviewer: CLEAN <sha> ou da aprovação do operador.

INFRA-71902

🤖 Generated with Claude Code

https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2

## O que muda Última peça do "fechar release" no ci-shared (ADR 0022; epic TMFP-60560): o workflow reutilizável e o chamador do produto. Ele usa a porta Forgejo (#161), o bloco `release:` (#162) e o orquestrador (#164). - **`.forgejo/workflows/fechar-release.yml`** (`workflow_call`): sem bloco `secrets:` (INFRA-64944), `shell: bash` com pipefail, actions pinadas, tokens mascarados. Os passos rodam nesta ordem: 1. checkouts do produto e do ci-shared; 2. config (`ci_config.py fechar-release`); 3. resolução do SHA: vazio vale a ponta de `origin/<dispatch_branch>`, e com `publish_workflow` um SHA diferente da ponta reprova antes de escrever; 4. segredos do Infisical; 5. guarda de identidade (`scripts/release/guarda-fechar-release.py`): só faz `GET /user`, e outro login ou 403 por falta de `read:user` reprova ali; 6. orquestrador, o único passo que escreve. O resumo vai para o job summary. - **`templates/fechar-release-chamador.yml`**: `workflow_dispatch` com `version` e `issues`, chamando `@main`, com `concurrency` por versão. - **`scripts/conferir-ci-identico.sh`**: passa a cobrir o `fechar-release.yml` do produto. É opcional; se o arquivo existir, tem de ser idêntico ao template. - **`scripts/ci_config.py fechar-release`**: na CLI, escreve também `infisical_project/env/path/host`. Quem chama a função não muda. - `docs/guia-de-adocao.md` e `CHANGELOG.md`. ## Token do bot - **Caminho provisório** (pendência do ADR 0022): segredo `TMF_IA_FORGEJO_TOKEN` no `infisical_project` do ci-config, ambiente `infisical_env` (padrão `prod`), pasta `/release`. - **Overrides:** os inputs `bot_token_infisical_project/env/path` trocam isso sem editar o chamador. - **Escopos necessários:** o token precisa de `read:user` e de escrita no repo. O token atual do bot não tem `read:user`, então a guarda reprova até o operador emitir um novo. ## Prova local ``` tests/fechar-release 33 OK (contrato: inputs, sem secrets:, shell: bash, pin; chamador idêntico ao template; identidade diferente de tmf-ia reprova antes de escrever, rodando o run: real do passo contra um Forgejo falso — única requisição é GET /user) tests/release-orquestrador 22 OK tests/release-provider 27 OK tests/pin-actions 8 OK tests/release 458 OK tests/ci-unico 153 OK tests/ci-config 206, 2 falhas de antes (test_heavy_fora_do_pr, sem pytest local) ``` ## Não verificado - O workflow ainda não rodou no act_runner. - O caminho `/release` do token ainda não existe no Infisical. - Não testei expressão com `||` em `with:` de action composta, nem `if:` com `inputs.*` em `workflow_call`. - A ponta da `dispatch_branch` pode andar entre a resolução do SHA e o dispatch. Nesse caso a publicação fica pendente (exit 1) e a reexecução retoma. Toca workflow `*release*` (CI de entrega): precisa do parecer `security-reviewer: CLEAN <sha>` ou da aprovação do operador. INFRA-71902 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
feat(release): workflow reutilizável fechar-release.yml e template do chamador [INFRA-71902]
Some checks failed
PR checks (ci-shared) / testes (pull_request) Has been cancelled
97cbb557d4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
fix(release): guardas de ref, dispatch_branch, infisical_host e ref do ci-shared no fechar-release.yml [INFRA-71902]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 5m18s
1465bdb1a9
Achados do security-reviewer no head 97cbb55: o dispatch só roda na branch padrão
(1º passo), dispatch_branch tem de ser ela, infisical_host só da allowlist fixa e a
ref do ci-shared só main ou vX.Y.Z, sem fallback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
Author
Owner

Parecer do agente security-reviewer no head atual, depois da correção dos achados do parecer anterior (NÃO CLEAN em 97cbb55).

  • ALTO, exfiltração das credenciais do Infisical: fechado. O 1º passo reprova fora de refs/heads/<default_branch>, e branch padrão vazia também reprova. A allowlist do infisical_host roda antes das actions do Infisical.
  • ALTO, ref do ci-shared controlada por quem dispara: fechado. A ref vem da branch padrão, ignora comentários, não tem fallback e só aceita main ou vX.Y.Z.
  • MÉDIO, falta de guarda de ref: fechado. dispatch_branch tem de ser igual à branch da ref, antes do SHA e dos segredos.
  • Ordem dos passos: nada é escrito antes da guarda de identidade. Nenhuma guarda falha aberta e não há injeção nova.
  • BAIXO, aceitos: infisical-secrets@main (branch protegida do próprio repo) e a falta de permissions: (padrão do repo).
  • Não verificado: se o act_runner preenche github.event.repository.default_branch no workflow_call. Se não preencher, o workflow para sempre por falha fechada. Vale testar no primeiro dispatch real.
  • O mesmo padrão no release.yml virou a INFRA-71909.

security-reviewer: CLEAN 1465bdb1a9

Parecer do agente security-reviewer no head atual, depois da correção dos achados do parecer anterior (NÃO CLEAN em 97cbb55). - **ALTO, exfiltração das credenciais do Infisical:** fechado. O 1º passo reprova fora de `refs/heads/<default_branch>`, e branch padrão vazia também reprova. A allowlist do `infisical_host` roda antes das actions do Infisical. - **ALTO, ref do ci-shared controlada por quem dispara:** fechado. A ref vem da branch padrão, ignora comentários, não tem fallback e só aceita `main` ou `vX.Y.Z`. - **MÉDIO, falta de guarda de ref:** fechado. `dispatch_branch` tem de ser igual à branch da ref, antes do SHA e dos segredos. - **Ordem dos passos:** nada é escrito antes da guarda de identidade. Nenhuma guarda falha aberta e não há injeção nova. - **BAIXO, aceitos:** `infisical-secrets@main` (branch protegida do próprio repo) e a falta de `permissions:` (padrão do repo). - **Não verificado:** se o act_runner preenche `github.event.repository.default_branch` no `workflow_call`. Se não preencher, o workflow para sempre por falha fechada. Vale testar no primeiro dispatch real. - O mesmo padrão no `release.yml` virou a INFRA-71909. security-reviewer: CLEAN 1465bdb1a9a048061a7a78b18ef3e4cbcf895c9a
tmf-ia merged commit 746842798c into develop 2026-11-04 00:45:19 -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!166
No description provided.