ci: reuso por tree — uma suíte por versão do código no PR para main (TH-68150) #42
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/TH-68150-reuso-por-tree"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
O que muda (TH-68150 — uma suíte por versão do código)
Hoje uma release roda a suíte completa no PR feature→develop e de novo no PR develop→main, sobre o mesmo conteúdo. Este PR adiciona o passo "Reuso por tree (PR para main)" no job
changesdoci.yml(scripts/reuso_por_tree.py):git rev-parse HEAD^{tree};origin/develop(inclui o 2º pai dos merges = head do PR) + o head dos últimos 30 PRs fechados e mergeados com base ≠ main (cobre squash/rebase, viarefs/pull/<n>/head);/commits/<sha>/status, token do job);success,CI / ci (pull_request)success, eCI / changes|gates|backend|frontend (pull_request)presentes, success e sem "skipped" na descrição. Os contextos(push)(smoke da develop) não valem;backendefrontendficam NÃO SE APLICA — reaproveitado do commit (tree idêntico), e oCI / cifecha verde. Se não servir: roda tudo.gatesnão muda e roda SEMPRE (Trivy, pip/npm audit, release checks): não existe "verde por ausência" de CVE.reuso=false; o script sai 0 sempre, e o passo tem|| echo reuso=false. Sóreuso=trueexplícito pula alguma coisa.main. PR paradevelop/epic/**/release/**nunca reaproveita (e nem consulta a API). O push emmainjá era modonenhum; o push emdevelopsegue smoke.reuso_por_tree: falsenoci-config.yml(ou inputreuso_por_tree). Schema,ci_config.py, exemplo e README atualizados.Fato medido que moldou o desenho
Na API do Forgejo 15.0.9,
commit.tree.sha(/git/commits/<sha>e/commits) devolve o SHA do commit, não o do tree (conferido em 04/10/2026 contragit log --format=%Tno próprio ci-shared:330d27c…→ API330d27c…, git50caa07…). Por isso o tree é calculado localmente.Prova
tests/ci-unico/test_reuso_por_tree.py(19 testes) — ponta a ponta: repo git real (origin bare + clone no commit do PR para main) e API do Forgejo simulada emhttp.server; as saídas alimentam orun:real dos gates de backend/frontend.(push)(smoke) / job "Has been skipped" / sem statusreuso_por_tree: false, modo legado, smokerefs/pull/7/head)gatesnão referencia reuso; gates só pulam comreuso=trueexatoSuíte local (
python3 -m unittest discover -s tests/<suíte>):ci-config88 OK ·ci-unico62 OK ·hub-issue-syncOK ·infisical-secrets9 OK ·nginx-log6 OK ·soberania13 OKrelease: 35 falhas + 1 erro idênticos naorigin/developsem esta mudança (rodado numgit archivelimpo da develop; ambiente macOS — frente INFRA-68242). Este PR não tocatests/releasenem os scripts que ela testa.test_outputs_do_changes_cobrem_o_schemapassa a listarreuso*como saídas do passoreuso(não da config).Limites
cino reusável: oCI / cié o job do chamador; a mensagem "reaproveitado…" sai no log/notice/resumo dochanges,backendefrontend.CI / … (pull_request), amarrado aoname: CIdo chamador idêntico; produto com chamador diferente (TMF7/TMF9) nunca acha candidato → roda tudo./pullse/commits/<sha>/statusdo próprio repo; se não puder, cai na falha segura (roda tudo).Economia estimada
Por release, o PR develop→main deixa de rodar
backend(9–17 min segundo o próprioci.yml, INFRA-68352; 18–19 min medidos no Priceshow) efrontend(~1 min medido no tennis-tracking; teto 20 min): ~10–20 min por release, no runner único.changes(+ alguns segundos do passo novo) egatescontinuam.🤖 Generated with Claude Code
https://claude.ai/code/session_01Uab9wJsQ19HdJHwYi2uVip