fix(ci): verificar-docs-produto recebe ORG_LEITURA_TOKEN (input/secret do caller), sem FORGEJO_TOKEN [INFRA-68379] #45

Merged
tarcisio merged 2 commits from fix/verificar-docs-token-infisical into develop 2026-10-05 07:49:08 -03:00
Owner

Causa real (achada pela sessão ORG)

O verificar-docs nunca passou em produto algum: o Forgejo recusa secret com prefixo FORGEJO_ (reservado). Então secrets.FORGEJO_TOKEN no reusable era o token automático do job, que só enxerga o próprio repo, e o clone do TMF/ORG dava "target couldn't be found". Nenhum produto poderia ter esse secret.

O que muda

verificar-docs-produto.yml recebe o token de leitura do TMF/ORG, nesta ordem:

  1. input org_leitura_token: o caller passa with: org_leitura_token: ${{ secrets.ORG_LEITURA_TOKEN }};
  2. secrets.ORG_LEITURA_TOKEN de caller que usa secrets:;
  3. Infisical INFRA/prod/ci, CVE_OS_EXCECOES_TOKEN (o mesmo token só-leitura da lista única de CVE; passo continue-on-error, só roda se o input não veio);
  4. nenhum: falha com mensagem clara, sem chamar o git.

FORGEJO_TOKEN saiu da cadeia (o log do erro explica por quê). Clone por git puro dentro de um passo só; o token não vira output nem é impresso.

⚠️ Desvio da proposta, com motivo

A proposta era declarar ORG_LEITURA_TOKEN em on.workflow_call.secrets. Não declarei: o repo inteiro documenta e testa que o bloco secrets: em workflow_call faz o Forgejo rejeitar o arquivo ("Failing after 0s", INFRA-64944; tests/ci-unico/test_ci.py trava isso no ci.yml). Segui o padrão do hub-issue-sync (input + secrets.X de caller legado, sem declaração). O caller que prefere secrets: ORG_LEITURA_TOKEN: ... também funciona (caminho 2); o do input é o mais seguro.

Prova

tests/ci-unico/test_verificar_docs_token.py (8 testes + trava): git falso, ordem input > secret > cofre, falha sem token sem chamar o git, valor nunca no log, sem bloco secrets:, sem FORGEJO_TOKEN. Contra a versão anterior do PR: 6 falham. Depois: ci-unico 52 OK; ci-config, infisical-secrets, soberania OK.

Erro meu pego na revisão: a mensagem de erro tinha ${{ secrets.ORG_LEITURA_TOKEN }} dentro do run:, que o runner avaliaria antes do shell (injetaria o valor). Removido e travado por teste (a trava foi escrita depois da correção; não a vi vermelha).

⚠️ Limites

  • Só testei contra git falso. Não rodei o reusable num runner real: o input recebendo ${{ secrets.X }} e o secrets.ORG_LEITURA_TOKEN não declarado seguem o precedente do hub-issue-sync, mas não os vi funcionar neste reusable.
  • Não destrava ninguém sozinho: o operador precisa cadastrar ORG_LEITURA_TOKEN em DANI e helpcor-admin, e os callers (verificar-docs.yml do DANI #827 e do HelpCor) precisam passar o input. O reusable é chamado por @main: vale só depois do release develop→main do ci-shared (só do operador).
  • O passo do Infisical não foi verificado contra a identity real dos runners (INFRA/prod).
  • Base develop.

Refs: INFRA-68379, INFRA-68311, DAIS-68002.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UdMSC8CGmShbesE5rfVNfe

## Causa real (achada pela sessão ORG) O verificar-docs **nunca passou em produto algum**: o Forgejo recusa secret com prefixo `FORGEJO_` (reservado). Então `secrets.FORGEJO_TOKEN` no reusable era o **token automático do job**, que só enxerga o próprio repo, e o clone do TMF/ORG dava "target couldn't be found". Nenhum produto poderia ter esse secret. ## O que muda `verificar-docs-produto.yml` recebe o token de leitura do TMF/ORG, nesta ordem: 1. **input `org_leitura_token`**: o caller passa `with: org_leitura_token: ${{ secrets.ORG_LEITURA_TOKEN }}`; 2. **`secrets.ORG_LEITURA_TOKEN`** de caller que usa `secrets:`; 3. **Infisical** `INFRA/prod/ci`, `CVE_OS_EXCECOES_TOKEN` (o mesmo token só-leitura da lista única de CVE; passo `continue-on-error`, só roda se o input não veio); 4. nenhum: **falha com mensagem clara, sem chamar o git**. `FORGEJO_TOKEN` saiu da cadeia (o log do erro explica por quê). Clone por git puro dentro de um passo só; o token não vira output nem é impresso. ### ⚠️ Desvio da proposta, com motivo A proposta era declarar `ORG_LEITURA_TOKEN` em `on.workflow_call.secrets`. **Não declarei**: o repo inteiro documenta e testa que o bloco `secrets:` em `workflow_call` faz o Forgejo **rejeitar o arquivo** ("Failing after 0s", INFRA-64944; `tests/ci-unico/test_ci.py` trava isso no `ci.yml`). Segui o padrão do `hub-issue-sync` (input + `secrets.X` de caller legado, sem declaração). O caller que prefere `secrets: ORG_LEITURA_TOKEN: ...` também funciona (caminho 2); o do input é o mais seguro. ## Prova `tests/ci-unico/test_verificar_docs_token.py` (8 testes + trava): `git` falso, ordem input > secret > cofre, falha sem token sem chamar o git, valor nunca no log, sem bloco `secrets:`, sem `FORGEJO_TOKEN`. Contra a versão anterior do PR: **6 falham**. Depois: `ci-unico` 52 OK; `ci-config`, `infisical-secrets`, `soberania` OK. Erro meu pego na revisão: a mensagem de erro tinha `${{ secrets.ORG_LEITURA_TOKEN }}` dentro do `run:`, que o runner avaliaria antes do shell (injetaria o valor). Removido e travado por teste (a trava foi escrita depois da correção; não a vi vermelha). ## ⚠️ Limites - **Só testei contra `git` falso.** Não rodei o reusable num runner real: o input recebendo `${{ secrets.X }}` e o `secrets.ORG_LEITURA_TOKEN` não declarado seguem o precedente do `hub-issue-sync`, mas não os vi funcionar **neste** reusable. - **Não destrava ninguém sozinho:** o operador precisa cadastrar `ORG_LEITURA_TOKEN` em DANI e helpcor-admin, e os **callers** (`verificar-docs.yml` do DANI #827 e do HelpCor) precisam passar o input. O reusable é chamado por `@main`: **vale só depois do release `develop`→`main` do ci-shared** (só do operador). - O passo do Infisical não foi verificado contra a identity real dos runners (INFRA/prod). - Base `develop`. Refs: INFRA-68379, INFRA-68311, DAIS-68002. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01UdMSC8CGmShbesE5rfVNfe
Causa real de o verificar-docs nunca ter passado: o Forgejo reserva o prefixo FORGEJO_,
então secrets.FORGEJO_TOKEN no reusable era o token AUTOMATICO do job (so enxerga o proprio
repo) e o clone do TMF/ORG falhava. Ordem agora: input org_leitura_token, secrets.ORG_LEITURA_TOKEN
do caller, CVE_OS_EXCECOES_TOKEN do Infisical INFRA/prod/ci; sem nenhum, falha com mensagem
clara SEM chamar o git. Sem bloco secrets: em workflow_call (INFRA-64944).

Teste: 8 checagens com git falso (6 vermelhas contra a versao anterior), mais trava de que o
run do clone nao tem expressao ${{ }} (injetaria o secret na mensagem).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UdMSC8CGmShbesE5rfVNfe
merge: origin/develop -> fix/verificar-docs-token-infisical
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 2m44s
687fff2b4e
Atualiza a branch com a base (pr.py atualizar: merge --no-commit + commit como tmf-ia).
Owner

Continuação do #44: ele foi mergeado às 06:40 só com o 1º commit (token do Infisical + fallback FORGEJO_TOKEN). Este PR traz o desenho correto sobre ele e SUBSTITUI a cadeia do #44 (input org_leitura_token, secrets.ORG_LEITURA_TOKEN do caller, Infisical; sem FORGEJO_TOKEN). Até este PR entrar, a develop ainda tem a cadeia antiga, que não funciona (FORGEJO_TOKEN é o token automático do job).

Continuação do #44: ele foi mergeado às 06:40 só com o 1º commit (token do Infisical + fallback FORGEJO_TOKEN). Este PR traz o desenho correto sobre ele e SUBSTITUI a cadeia do #44 (input org_leitura_token, secrets.ORG_LEITURA_TOKEN do caller, Infisical; sem FORGEJO_TOKEN). Até este PR entrar, a develop ainda tem a cadeia antiga, que não funciona (FORGEJO_TOKEN é o token automático do job).
tarcisio merged commit 4b909cc845 into develop 2026-10-05 07:49:08 -03:00
tarcisio deleted branch fix/verificar-docs-token-infisical 2026-10-05 07:49:08 -03:00
Sign in to join this conversation.
No reviewers
No labels
seguranca
No milestone
No project
No assignees
2 participants
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!45
No description provided.