fix(release): orfaos preserva slot, validar recusa health em slot fixo, guia de adoção fundido [INFRA-69541] #118

Merged
tmf-ia merged 1 commit from fix/INFRA-69541-adesao-release into develop 2026-10-13 13:57:54 -03:00
Owner

INFRA-69541 — três defeitos que travavam a adesão ao release.yml reusável

1. Guia de adoção duplicado

  • docs/guia-de-adocao.md: a seção "Release e deploy únicos — como adotar" existia duas vezes. A cópia antiga (decisão de 30/09) dizia que o push em main cria a tag e que tag e deploy rodam no mesmo run. Fundida numa seção só: a parte antiga foi removida e as tabelas de peças e jobs viraram a subseção "Peças e jobs". A linha do job tag foi corrigida: ele só decide (release-tag.sh decidir) e não cria tag.
  • templates/ci-config.exemplo.yml e a descrição de deploy no schema: o gatilho é o push da tag estrita vX.Y.Z criada por humano/bot, ou o dispatch com frase.

2. deploy-remoto.sh orfaos não apaga mais o slot de rollback

  • Contêiner exited com nome exato e rótulo de slot é preservado. O rótulo pode ser a convenção br.com.tmf.blue-green-slot (a mesma do container_do_health e do compose do HelpCor) ou qualquer chave com slot, para cobrir deploy legado. Se o docker inspect falhar, o contêiner também fica: a regra falha fechada.
  • Testes em tests/release/test_deploy_remoto.py: slot parado preservado, rótulo fora da convenção, inspect falho e "só slots". Os 4 testes falharam antes do conserto e passaram depois, rodando na imagem de CI (eles precisam de flock).

3. Validação: health em contêiner fixo com blue-green

  • ci_config.py validar: com deploy: true, sem deploy_gate e sem deploy_blue_green_upstream_file, um deploy_container com nome de slot (…-blue/…-green) reprova. Nesse caso o health bateria sempre nesse slot, que pode ser o parado. Os outros nomes fixos saem com aviso.
  • Com deploy_gate: true a regra não se aplica, porque contêiner e UPSTREAM_FILE vêm do conf do host.
  • Testes em tests/ci-config/test_ci_config.py (TestHealthBlueGreen).

Prova

  • Todas as suítes de tests/*/ rodaram na imagem tmf-ci-python:3.12-20261009-2e51884: 19 suítes, nenhuma falha.
  • O shellcheck do deploy-remoto.sh dá a mesma contagem de achados de antes do PR.

Ponto aberto (decisão do operador)

O ci-config não tem uma chave que declare blue-green. Por isso a regra 3 reprova só o caso inequívoco (nome de slot) e só avisa nos demais. Uma regra mais forte (exigir deploy_blue_green_upstream_file sempre que deploy: true, ou criar uma chave deploy_blue_green) muda o contrato e fica para a decisão do operador na INFRA-69541.

🤖 Generated with Claude Code

https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn

## INFRA-69541 — três defeitos que travavam a adesão ao `release.yml` reusável ### 1. Guia de adoção duplicado - `docs/guia-de-adocao.md`: a seção "Release e deploy únicos — como adotar" existia duas vezes. A cópia antiga (decisão de 30/09) dizia que **o push em `main` cria a tag** e que tag e deploy rodam no mesmo run. Fundida numa seção só: a parte antiga foi removida e as tabelas de peças e jobs viraram a subseção "Peças e jobs". A linha do job `tag` foi corrigida: ele só **decide** (`release-tag.sh decidir`) e **não cria tag**. - `templates/ci-config.exemplo.yml` e a descrição de `deploy` no schema: o gatilho é o push da tag estrita `vX.Y.Z` criada por humano/bot, ou o dispatch com frase. ### 2. `deploy-remoto.sh orfaos` não apaga mais o slot de rollback - Contêiner exited com nome exato **e** rótulo de slot é preservado. O rótulo pode ser a convenção `br.com.tmf.blue-green-slot` (a mesma do `container_do_health` e do compose do HelpCor) ou qualquer chave com `slot`, para cobrir deploy legado. Se o `docker inspect` falhar, o contêiner também fica: a regra falha fechada. - Testes em `tests/release/test_deploy_remoto.py`: slot parado preservado, rótulo fora da convenção, inspect falho e "só slots". Os 4 testes falharam antes do conserto e passaram depois, rodando na imagem de CI (eles precisam de `flock`). ### 3. Validação: health em contêiner fixo com blue-green - `ci_config.py validar`: com `deploy: true`, sem `deploy_gate` e sem `deploy_blue_green_upstream_file`, um `deploy_container` com nome de slot (`…-blue`/`…-green`) **reprova**. Nesse caso o health bateria sempre nesse slot, que pode ser o parado. Os outros nomes fixos saem com **aviso**. - Com `deploy_gate: true` a regra não se aplica, porque contêiner e `UPSTREAM_FILE` vêm do conf do host. - Testes em `tests/ci-config/test_ci_config.py` (`TestHealthBlueGreen`). ### Prova - Todas as suítes de `tests/*/` rodaram na imagem `tmf-ci-python:3.12-20261009-2e51884`: 19 suítes, nenhuma falha. - O `shellcheck` do `deploy-remoto.sh` dá a mesma contagem de achados de antes do PR. ### Ponto aberto (decisão do operador) O ci-config não tem uma chave que **declare** blue-green. Por isso a regra 3 reprova só o caso inequívoco (nome de slot) e só avisa nos demais. Uma regra mais forte (exigir `deploy_blue_green_upstream_file` sempre que `deploy: true`, ou criar uma chave `deploy_blue_green`) muda o contrato e fica para a decisão do operador na INFRA-69541. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
fix(release): orfaos preserva slot do blue-green, validar recusa health em slot fixo e guia de adoção fundido [INFRA-69541]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m38s
85a93217ed
- deploy-remoto.sh orfaos: contêiner com rótulo de slot (br.com.tmf.blue-green-slot ou chave com 'slot')
  ou de rótulos ilegíveis nunca é removido — o slot parado é o rollback
- ci_config.py: deploy_container com nome de slot (-blue/-green) sem deploy_blue_green_upstream_file
  reprova; outros nomes fixos sem o arquivo geram aviso
- guia de adoção: seção 'Release e deploy únicos' fundida numa só; exemplo e schema não dizem mais que
  o push em main cria a tag

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
tmf-ia merged commit 6d765c4ec0 into develop 2026-10-13 13:57:54 -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!118
No description provided.