feat(ci): chamador falha alto se um reusable apontar para repo privado [INFRA-64942] #52

Merged
tarcisio merged 2 commits from feat/INFRA-64942-reusable-so-de-repo-publico into develop 2026-10-06 08:06:57 -03:00
Owner

O que muda

INFRA-64942. O Forgejo só resolve um reusable de outro repositório se ele for público; apontar para um privado faz o job morrer em 0 s, sem mensagem, e o gate some em silêncio.

  • scripts/conferir_reusable_publico.py: para cada uses: de reusable de outro repo (owner/repo/.forgejo/workflows/x.yml@ref ou a forma URL), consulta anonimamente GET /api/v1/repos/{owner}/{repo}. 200 + private=false passa. Reprova com ::error:: se for privado, inexistente (404/403) ou de host externo. Rede fora: ::warning::, nunca derruba o CI.
  • Ligado ao conferir-ci-identico.sh, que roda no job changes do CI único de todo produto: o chamador falha alto.
  • README: a regra, o motivo medido e por que os reusables não podem ir para o TMF/ORG (precisa ser privado).
  • tests/reusable-publico (13 testes, consulta HTTP simulada): público passa; privado/404/403 reprovam; local ./ e actions não entram; URL completa entra; host externo reprova sem consultar; rede fora só avisa; cada repo é consultado uma vez. Controle: uses: TMF/infra/... reprova e o mesmo com TMF/ci-shared passa. Controle com rede real: TMF/infra e TMF/ORG respondem 404 anônimo e reprovam; TMF/ci-shared passa; local e actions ignoradas.

Varredura da frota (somente leitura, 05/10/2026)

14 repositórios (tmf9, tmf-management, tmf-platform, infra, ci-shared, tmf-video, DANI, helpcor-admin, fina, Priceshow, tennis-tracking, tmf-server-core, TMF_Claude_Specs, design-tokens), develop e main: todo reusable de outro repo é TMF/ci-shared (55 na forma curta, 18 na forma URL), que é público. Nenhuma violação hoje: o gate é preventivo.

⚠️ Limites

  • Só vale no produto depois que a develop do ci-shared for à main (/deploy-safe): o conferir-ci-identico.sh roda a partir do ci-shared na ref que o chamador usa.
  • Não valida a existência do arquivo nem a ref (@main) do reusable, só a visibilidade do repositório.
  • Observação fora de escopo: a varredura também mostrou actions de terceiros nos workflows da frota (android-actions/setup-android, r0adkll/upload-google-play, ruby/setup-ruby): outra questão de soberania, não tratada aqui.

🤖 Generated with Claude Code

https://claude.ai/code/session_019nhmgPciDjRhb5KSiZrePM

## O que muda INFRA-64942. O Forgejo só resolve um reusable de **outro** repositório se ele for **público**; apontar para um privado faz o job morrer em 0 s, sem mensagem, e o gate some em silêncio. - `scripts/conferir_reusable_publico.py`: para cada `uses:` de reusable de outro repo (`owner/repo/.forgejo/workflows/x.yml@ref` ou a forma URL), consulta **anonimamente** `GET /api/v1/repos/{owner}/{repo}`. `200` + `private=false` passa. **Reprova** com `::error::` se for privado, inexistente (`404`/`403`) ou de host externo. Rede fora: `::warning::`, nunca derruba o CI. - Ligado ao `conferir-ci-identico.sh`, que roda no job `changes` do CI único de todo produto: **o chamador falha alto**. - README: a regra, o motivo medido e por que os reusables não podem ir para o `TMF/ORG` (precisa ser privado). - `tests/reusable-publico` (13 testes, consulta HTTP simulada): público passa; privado/`404`/`403` reprovam; local `./` e actions não entram; URL completa entra; host externo reprova sem consultar; rede fora só avisa; cada repo é consultado uma vez. **Controle:** `uses: TMF/infra/...` reprova e o mesmo com `TMF/ci-shared` passa. **Controle com rede real:** `TMF/infra` e `TMF/ORG` respondem `404` anônimo e reprovam; `TMF/ci-shared` passa; local e actions ignoradas. ## Varredura da frota (somente leitura, 05/10/2026) 14 repositórios (tmf9, tmf-management, tmf-platform, infra, ci-shared, tmf-video, DANI, helpcor-admin, fina, Priceshow, tennis-tracking, tmf-server-core, TMF_Claude_Specs, design-tokens), `develop` e `main`: todo reusable de outro repo é `TMF/ci-shared` (55 na forma curta, 18 na forma URL), que é **público**. **Nenhuma violação hoje**: o gate é preventivo. ## ⚠️ Limites - **Só vale no produto depois** que a `develop` do ci-shared for à `main` (`/deploy-safe`): o `conferir-ci-identico.sh` roda a partir do ci-shared na ref que o chamador usa. - Não valida a **existência do arquivo** nem a ref (`@main`) do reusable, só a visibilidade do repositório. - Observação fora de escopo: a varredura também mostrou actions de terceiros nos workflows da frota (`android-actions/setup-android`, `r0adkll/upload-google-play`, `ruby/setup-ruby`): outra questão de soberania, não tratada aqui. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_019nhmgPciDjRhb5KSiZrePM
feat(ci): chamador falha alto se um reusable apontar para repo privado [INFRA-64942]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 2m47s
a582dc57f1
O Forgejo so resolve reusable de OUTRO repo se ele for publico; apontar para privado faz o job morrer em 0 s sem mensagem e o gate
some em silencio. conferir_reusable_publico.py consulta anonimamente a visibilidade de cada reusable de outro repo (owner/repo/.forgejo/
workflows/x.yml@ref ou URL) e reprova se for privado, inexistente (404/403) ou de host externo; rede fora so avisa. Ligado ao
conferir-ci-identico.sh (job changes do CI unico). Varredura da frota: 14 repos, develop e main, so TMF/ci-shared (publico), 0 violacao.
Testes com consulta simulada e controle (TMF/infra reprova, TMF/ci-shared passa); controle real na rede: TMF/infra e TMF/ORG dao 404
anonimo. README documenta a regra e porque os reusables nao podem ir para o ORG.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019nhmgPciDjRhb5KSiZrePM
merge: develop em feat/INFRA-64942 (README: mantém as duas seções novas)
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m27s
86285125fd
O conflito era só no README: este branch e o develop (INFRA-68076) acrescentaram uma seção no
fim. Ficam as duas. Testes do ci-shared: 563 passed, 0 failed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ExJBi69CXPBjwwyD96rBz9
tarcisio merged commit 649ebf6b40 into develop 2026-10-06 08:06:57 -03:00
tarcisio deleted branch feat/INFRA-64942-reusable-so-de-repo-publico 2026-10-06 08:06:57 -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!52
No description provided.