feat(ci): reusable de SBOM CycloneDX sem docker CLI (INFRA-68625) #53

Merged
tarcisio merged 1 commit from feat/INFRA-68625-reusable-sbom into main 2026-10-06 08:07:03 -03:00
Owner

O quê

Novo .forgejo/workflows/reusable-sbom.yml: SBOM CycloneDX que roda sem docker CLI (INFRA-68625).

Por quê

DANI, Hub e TMF9 têm cada um uma cópia própria do sbom.yml, com hashes diferentes. As três chamam o Trivy por docker run dentro da tmf-ci-node:20, que não tem docker CLI. Resultado: o SBOM noturno falha (DANI, run 3445 de 06/10: "runner sem docker CLI") ou instala o docker em tempo de execução, o que a regra de soberania proíbe.

Como

  • O job continua na tmf-ci-node:20, porque checkout e upload-artifact precisam de node.
  • O Trivy 0.68.2 vem da camada do binário da tmf/ci-images/tmf-ci-trivy:0.68.2, no nosso registry. A camada é conferida pelo digest e o binário extraído pelo sha256; depois o passo confere trivy --version. Não há origem externa, curl|sh nem docker-in-docker.
  • Os inputs entram por env, nunca interpolados no run:. Nome e caminho de cada alvo são validados.
  • Trava contra SBOM vazio: o job falha se um SBOM tiver menos componentes que min-components.

Adoção (cada produto mantém o próprio gatilho)

jobs:
  sbom:
    uses: TMF/ci-shared/.forgejo/workflows/reusable-sbom.yml@main
    with:
      targets: |
        backend=backend
        frontend=frontend      # TMF9: frontend=frontend/react
      min-components: "20"

O min-components precisa ser calibrado por produto. Na prova com o Hub, o backend deu 13 componentes. DANI: DAIS-68624. Hub e TMF9: issues nas sessões dos produtos.

Prova

  • python3 -m unittest discover -s tests/soberania -v: 25 testes OK. Os 11 novos executam o run: real com um trivy falso. Cobrem: um arquivo por alvo; nome inválido, .., caminho absoluto e targets vazio falham; diretório ausente falha.
  • Execução local dos passos reais dentro da tmf-ci-node:20 (amd64) com os manifests do Hub:
    • docker CLI: ausente;
    • layer.tgz: OK e trivy: OK (as duas conferências de sha256);
    • Version: 0.68.2;
    • frontend com 355 componentes (OK);
    • backend com 13 (FALHA esperada com mínimo 20).

🤖 Generated with Claude Code

https://claude.ai/code/session_01Uab9wJsQ19HdJHwYi2uVip

## O quê Novo `.forgejo/workflows/reusable-sbom.yml`: SBOM CycloneDX que roda **sem docker CLI** (INFRA-68625). ## Por quê DANI, Hub e TMF9 têm cada um uma cópia própria do `sbom.yml`, com hashes diferentes. As três chamam o Trivy por `docker run` dentro da `tmf-ci-node:20`, que não tem docker CLI. Resultado: o SBOM noturno falha (DANI, run 3445 de 06/10: "runner sem docker CLI") ou instala o docker em tempo de execução, o que a regra de soberania proíbe. ## Como - O job continua na `tmf-ci-node:20`, porque checkout e upload-artifact precisam de node. - O Trivy 0.68.2 vem da camada do binário da `tmf/ci-images/tmf-ci-trivy:0.68.2`, no nosso registry. A camada é conferida pelo digest e o binário extraído pelo sha256; depois o passo confere `trivy --version`. Não há origem externa, `curl|sh` nem docker-in-docker. - Os inputs entram por `env`, nunca interpolados no `run:`. Nome e caminho de cada alvo são validados. - Trava contra SBOM vazio: o job falha se um SBOM tiver menos componentes que `min-components`. ## Adoção (cada produto mantém o próprio gatilho) ```yaml jobs: sbom: uses: TMF/ci-shared/.forgejo/workflows/reusable-sbom.yml@main with: targets: | backend=backend frontend=frontend # TMF9: frontend=frontend/react min-components: "20" ``` O `min-components` precisa ser calibrado por produto. Na prova com o Hub, o backend deu 13 componentes. DANI: DAIS-68624. Hub e TMF9: issues nas sessões dos produtos. ## Prova - `python3 -m unittest discover -s tests/soberania -v`: 25 testes OK. Os 11 novos executam o `run:` real com um `trivy` falso. Cobrem: um arquivo por alvo; nome inválido, `..`, caminho absoluto e `targets` vazio falham; diretório ausente falha. - Execução local dos passos reais dentro da `tmf-ci-node:20` (amd64) com os manifests do Hub: - `docker CLI: ausente`; - `layer.tgz: OK` e `trivy: OK` (as duas conferências de sha256); - `Version: 0.68.2`; - frontend com 355 componentes (OK); - backend com 13 (FALHA esperada com mínimo 20). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01Uab9wJsQ19HdJHwYi2uVip
feat(ci): reusable de SBOM CycloneDX sem docker CLI (INFRA-68625)
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 2m40s
db90d277a4
Substitui as 3 cópias do sbom.yml (DANI, Hub, TMF9), que chamavam o Trivy por
docker run dentro da tmf-ci-node:20, sem docker CLI (DANI run 3445 de 06/10).
O Trivy 0.68.2 vem da camada do binário da tmf-ci-trivy no registry interno,
conferida pelo digest e pelo sha256. Sem origem externa nem docker-in-docker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Uab9wJsQ19HdJHwYi2uVip
tarcisio deleted branch feat/INFRA-68625-reusable-sbom 2026-10-06 08:07:03 -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!53
No description provided.