feat(release): runs-on configurável, overrides por ambiente e QA fora da main [INFRA-71152] #160

Merged
tmf-ia merged 1 commit from feat/INFRA-71152-release-runs-on-overrides into develop 2026-10-28 16:45:21 -03:00
Owner

INFRA-71152: release.yml com runs-on configurável, overrides por ambiente e QA fora da main

Tira os três bloqueios que impedem o DANI de adotar o release.yml reusável (DAIS-67971).

O que muda

  • runs-on:
    • input runs_on (padrão docker) para os jobs tag e deploy;
    • chave deploy_runs_on do ci-config, que vale só para o deploy;
    • sem declarar nada, os dois jobs continuam em docker; toda expressão termina em || 'docker'.
  • Overrides em environments.<env>:
    • chaves novas: script, rollback_script, code_dir, env_dir, container e public_url;
    • quando presente, o valor do ambiente vale no lugar da chave deploy_* global;
    • ci_config.py aceita as chaves novas, continua recusando chave desconhecida, e o schema e o exemplo foram atualizados.
  • QA fora da main:
    • environments.<qa|dev>.base_branch (ex.: develop) vira o BASE do release-tag.sh decidir e vai ao host como BASE_BRANCH, só quando difere de main;
    • prod continua exigindo main: environments.prod.base_branch com outro valor reprova na validação;
    • qa e dev não herdam mais a deploy_public_url de produção, e a verificação pública usa a public_url do ambiente (sem ela, é pulada com aviso).

⚠️ Antes do próximo release develop→main

  • Expressão no runs-on não provada no act_runner: o comentário antigo do release.yml avisava disso. Os produtos chamam o reusável em @main, então este merge na develop não afeta a frota. Antes do release para a main, é preciso provar a expressão:
    • a sonda da INFRA-70987 depende de um repo chamador (TMF/ci-sandbox, que não existe ainda);
    • ou a primeira execução pelo DANI no QA.
    • O job deploy usa output de needs no runs-on, que é o caso menos garantido.
  • Mudança de comportamento: um QA em uso que não declare public_url deixa de conferir a URL de produção. É a correção do bloqueio 3.

Testes

  • tests/release: 458 OK, incluindo o novo test_runs_on_e_qa.py.
  • tests/ci-config: 189 rodados. O novo test_environments_overrides.py passou. As 2 falhas em test_heavy_fora_do_pr também falham na develop (pytest ausente na máquina local).
  • py_compile e bash -n OK.

🤖 Generated with Claude Code

https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2

## INFRA-71152: release.yml com runs-on configurável, overrides por ambiente e QA fora da main Tira os três bloqueios que impedem o DANI de adotar o `release.yml` reusável (DAIS-67971). ### O que muda - **runs-on**: - input `runs_on` (padrão `docker`) para os jobs `tag` e `deploy`; - chave `deploy_runs_on` do ci-config, que vale só para o `deploy`; - sem declarar nada, os dois jobs continuam em `docker`; toda expressão termina em `|| 'docker'`. - **Overrides em `environments.<env>`**: - chaves novas: `script`, `rollback_script`, `code_dir`, `env_dir`, `container` e `public_url`; - quando presente, o valor do ambiente vale no lugar da chave `deploy_*` global; - `ci_config.py` aceita as chaves novas, continua recusando chave desconhecida, e o schema e o exemplo foram atualizados. - **QA fora da main**: - `environments.<qa|dev>.base_branch` (ex.: `develop`) vira o `BASE` do `release-tag.sh decidir` e vai ao host como `BASE_BRANCH`, só quando difere de `main`; - prod continua exigindo `main`: `environments.prod.base_branch` com outro valor reprova na validação; - qa e dev não herdam mais a `deploy_public_url` de produção, e a verificação pública usa a `public_url` do ambiente (sem ela, é pulada com aviso). ### ⚠️ Antes do próximo release develop→main - **Expressão no `runs-on` não provada no act_runner:** o comentário antigo do `release.yml` avisava disso. Os produtos chamam o reusável em `@main`, então este merge na develop não afeta a frota. Antes do release para a main, é preciso provar a expressão: - a sonda da INFRA-70987 depende de um repo chamador (`TMF/ci-sandbox`, que não existe ainda); - ou a primeira execução pelo DANI no QA. - O job `deploy` usa output de `needs` no `runs-on`, que é o caso menos garantido. - **Mudança de comportamento:** um QA em uso que não declare `public_url` deixa de conferir a URL de produção. É a correção do bloqueio 3. ### Testes - `tests/release`: 458 OK, incluindo o novo `test_runs_on_e_qa.py`. - `tests/ci-config`: 189 rodados. O novo `test_environments_overrides.py` passou. As 2 falhas em `test_heavy_fora_do_pr` também falham na develop (pytest ausente na máquina local). - `py_compile` e `bash -n` OK. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
feat(release): runs-on configurável, overrides por ambiente e QA fora da main [INFRA-71152]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 5m20s
143a823e1d
- input runs_on (padrão docker) nos jobs tag e deploy; chave deploy_runs_on do ci-config só para o deploy
- environments.<env> aceita script, rollback_script, code_dir, env_dir, container e public_url; chave desconhecida segue reprovando
- environments.<qa|dev>.base_branch: tag ancestral dessa branch em vez de main (decidir e host); qa/dev nunca herdam deploy_public_url/checks de produção; prod continua exigindo main

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

security-reviewer: CLEAN 143a823e1d

Revisão diff-first feita pelo agente security-reviewer, só leitura. Não houve achado CRITICAL, HIGH ou MEDIUM.

  • Injeção:
    • os valores novos entram nos passos por env: e não são interpolados em run:;
    • o BASE_BRANCH é revalidado no host por deploy-remoto.sh;
    • os patterns dos overrides de ambiente repetem os das chaves deploy_* globais.
  • Regra de prod: prod só deploya tag que está na main, e isso não foi contornado.
    • O resolver força deploy_base_branch=main em prod.
    • A validação reprova environments.prod.base_branch diferente de main.
    • Em prod, o BASE_BRANCH não vai ao host.
  • Achados LOW, para issue separada:
    1. deploy_runs_on deixa o produto escolher o runner do job que recebe os segredos. O label tem pattern restrito; a sugestão é uma allowlist de labels mantida pelo ORG.
    2. No re do Python, o $ aceita um \n final. É pré-existente e vale para todas as chaves; a sugestão é trocar por \Z.
    3. environments.<env>.expected_host só recusa o literal tmfprod. A sugestão é cruzar com o deploy_expected_host global.
  • Logs: nenhum segredo vazado.
security-reviewer: CLEAN 143a823e1dfb13aeb765dbdfa0700af91a0d23bc Revisão diff-first feita pelo agente security-reviewer, só leitura. Não houve achado CRITICAL, HIGH ou MEDIUM. - **Injeção:** - os valores novos entram nos passos por `env:` e não são interpolados em `run:`; - o `BASE_BRANCH` é revalidado no host por `deploy-remoto.sh`; - os patterns dos overrides de ambiente repetem os das chaves `deploy_*` globais. - **Regra de prod:** prod só deploya tag que está na main, e isso não foi contornado. - O resolver força `deploy_base_branch=main` em prod. - A validação reprova `environments.prod.base_branch` diferente de main. - Em prod, o `BASE_BRANCH` não vai ao host. - **Achados LOW, para issue separada:** 1. `deploy_runs_on` deixa o produto escolher o runner do job que recebe os segredos. O label tem pattern restrito; a sugestão é uma allowlist de labels mantida pelo ORG. 2. No `re` do Python, o `$` aceita um `\n` final. É pré-existente e vale para todas as chaves; a sugestão é trocar por `\Z`. 3. `environments.<env>.expected_host` só recusa o literal `tmfprod`. A sugestão é cruzar com o `deploy_expected_host` global. - **Logs:** nenhum segredo vazado.
tmf-ia merged commit 45873db7ca into develop 2026-10-28 16:45:21 -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!160
No description provided.