feat(release): registro da release no Hub e pré-lock para esperas longas [INFRA-69543] #119

Merged
tmf-ia merged 1 commit from feat/INFRA-69543-releases-e-lock into develop 2026-10-13 14:37:39 -03:00
Owner

INFRA-69543 — release.yml reusável: registro de release no Hub e lock do host preso nas esperas

1. Registro da release no Hub (issue_releases)

  • Chaves novas: deploy_hub_release (padrão false) e hub_release_produto (slug do Hub, obrigatório com true, validado pelo schema).
  • Passo Hub release: registrar issues da release (issue_releases) no job deploy, depois do deploy de produção verde, com continue-on-error e sem always().
  • scripts/hub_registrar_release.py: POST /api/v2/releases para cada chave que aparece no assunto dos commits <tag anterior>..<tag>. Usa os prefixos de hub_done_prefixos, pula revert e reaproveita a seleção e o git do hub_done_no_deploy.py.
  • released_at = instante do deploy verde (passo novo Instante do deploy verde, logo depois da verificação pública).
  • close_issue: false: o status continua com o hub-done.
  • Token: o mesmo HUB_TOKEN do Infisical que o hub-done usa. Entra só por $GITHUB_ENV e nunca é impresso.
  • Falha vira ::warning::hub-release:. Zero registros com chaves no intervalo também avisa (lição da TH-62613).

2. Lock do host só na troca

  • Chave nova deploy_pre_lock_script e argumento PRE_LOCK_SCRIPT do deploy-remoto.sh (passo 0a).
  • O script do produto é lido do commit da tag (git show <sha>:<script>) e roda antes do flock. A espera de campanha e de backup (até 170 min no Hub) para de segurar /var/lock/tmf.
  • Saída diferente de 0 aborta sem tocar em nada. Saída 0 exporta PRE_LOCK_OK=1 para o deploy_script, que pode reconferir a janela com teto curto.
  • O tmf-deploy-gate aceita a chave. Vazia, ela nem chega ao host (host com script antigo continua funcionando).

3. Docs

  • CHANGELOG (Não lançado), guia de adoção (duas seções novas e tabela de chaves), docs/scripts.md e templates/ci-config.exemplo.yml.

Testes

  • tests/release/test_deploy_remoto.py::TestPreLock: durante a espera do pré-lock, outro deploy pega o lock (flock -w 3). Controle negativo: com a espera dentro do deploy_script, o lock fica preso. Também cobre script lido do SHA, falha, script ausente, tag movida, caminho inválido e PRE_LOCK_OK.
  • tests/hub-done-no-deploy/test_hub_registrar_release.py: git real e Hub simulado, mais o contrato do yaml, do schema e das docs.
  • Suíte inteira na imagem tmf-ci-python:3.12-20261009-2e51884: as 19 suítes passaram (release: 444 testes OK, 1 pulado).

Para adotar (fora deste PR)

  • Hub: aguardar-janela.sh como deploy_pre_lock_script, e o blue-green com teto curto quando PRE_LOCK_OK=1.
  • Hub e HelpCor: remover o job capture-releases próprio no mesmo PR que liga deploy_hub_release.

🤖 Generated with Claude Code

https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn

## INFRA-69543 — release.yml reusável: registro de release no Hub e lock do host preso nas esperas ### 1. Registro da release no Hub (`issue_releases`) - Chaves novas: `deploy_hub_release` (padrão `false`) e `hub_release_produto` (slug do Hub, obrigatório com `true`, validado pelo schema). - Passo `Hub release: registrar issues da release (issue_releases)` no job `deploy`, depois do deploy de produção verde, com `continue-on-error` e sem `always()`. - `scripts/hub_registrar_release.py`: `POST /api/v2/releases` para cada chave que aparece no assunto dos commits `<tag anterior>..<tag>`. Usa os prefixos de `hub_done_prefixos`, pula revert e reaproveita a seleção e o git do `hub_done_no_deploy.py`. - `released_at` = instante do deploy verde (passo novo `Instante do deploy verde`, logo depois da verificação pública). - `close_issue: false`: o status continua com o hub-done. - Token: o mesmo `HUB_TOKEN` do Infisical que o hub-done usa. Entra só por `$GITHUB_ENV` e nunca é impresso. - Falha vira `::warning::hub-release:`. Zero registros com chaves no intervalo também avisa (lição da TH-62613). ### 2. Lock do host só na troca - Chave nova `deploy_pre_lock_script` e argumento `PRE_LOCK_SCRIPT` do `deploy-remoto.sh` (passo 0a). - O script do produto é lido do commit da tag (`git show <sha>:<script>`) e roda **antes** do `flock`. A espera de campanha e de backup (até 170 min no Hub) para de segurar `/var/lock/tmf`. - Saída diferente de 0 aborta sem tocar em nada. Saída 0 exporta `PRE_LOCK_OK=1` para o `deploy_script`, que pode reconferir a janela com teto curto. - O `tmf-deploy-gate` aceita a chave. Vazia, ela nem chega ao host (host com script antigo continua funcionando). ### 3. Docs - CHANGELOG (Não lançado), guia de adoção (duas seções novas e tabela de chaves), `docs/scripts.md` e `templates/ci-config.exemplo.yml`. ### Testes - `tests/release/test_deploy_remoto.py::TestPreLock`: **durante a espera do pré-lock, outro deploy pega o lock** (`flock -w 3`). Controle negativo: com a espera dentro do `deploy_script`, o lock fica preso. Também cobre script lido do SHA, falha, script ausente, tag movida, caminho inválido e `PRE_LOCK_OK`. - `tests/hub-done-no-deploy/test_hub_registrar_release.py`: git real e Hub simulado, mais o contrato do yaml, do schema e das docs. - Suíte inteira na imagem `tmf-ci-python:3.12-20261009-2e51884`: as 19 suítes passaram (release: 444 testes OK, 1 pulado). ### Para adotar (fora deste PR) - Hub: `aguardar-janela.sh` como `deploy_pre_lock_script`, e o blue-green com teto curto quando `PRE_LOCK_OK=1`. - Hub e HelpCor: remover o job `capture-releases` próprio no mesmo PR que liga `deploy_hub_release`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
feat(release): registro da release no Hub e pré-lock para esperas longas [INFRA-69543]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 5m13s
b5450bd0b1
- deploy_hub_release + hub_release_produto: POST /api/v2/releases depois do deploy
  de produção verde (released_at = instante do deploy verde, close_issue=false);
  scripts/hub_registrar_release.py, nunca derruba o deploy
- deploy_pre_lock_script / PRE_LOCK_SCRIPT: espera do produto antes do flock do
  host, script lido do commit da tag; o lock cobre só a troca
- gate aceita PRE_LOCK_SCRIPT; guia de adoção, scripts.md, exemplo e CHANGELOG

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