feat(release): release e deploy únicos da frota [INFRA-65726] #23

Merged
tarcisio merged 1 commit from feat/deploy-unico into main 2026-09-30 14:47:19 -03:00
Owner

Release e deploy únicos da frota (INFRA-65726)

Decisões do operador (30/09/2026): a tag é criada pelo CI a partir do VERSION; o deploy é SSH + checkout da tag + build no host; blue-green obrigatório; segredos só do Infisical. Piloto: DANI. Ficam fora TMF7 e TMF9.

O que entra

  • templates/release-chamador.yml: cópia idêntica em todo produto, como .forgejo/workflows/release.yml. Roda no push em main que muda VERSION, ou por dispatch com tag (redeploy/rollback).
  • .forgejo/workflows/release.yml: tag e deploy no mesmo run, porque o Forgejo não cascateia push de tag para outro workflow.
    • job tag: semver estrito e idempotente. Usa o token do job, com fallback RELEASE_TOKEN do Infisical.
    • job deploy:
      • lê DEPLOY_HOST, DEPLOY_USER, DEPLOY_PORT, SSH_PRIVATE_KEY e SSH_KNOWN_HOSTS do Infisical prod:/deploy;
      • abre o SSH pelo deploy-ssh, com host key verificada e fail-closed;
      • confere que o host é o esperado e faz checkout da tag;
      • exige deploy.sh e rollback.sh;
      • checa a saúde e roda o rollback automático se ela falhar;
      • remove órfãos só pelo nome exato, para não apagar a cor standby.
  • ci-config: 13 chaves deploy_*. Com deploy: false, que é o padrão, o release não faz nada, nem cria a tag.
  • conferir-ci-identico.sh: se o release.yml existir, tem de ser idêntico ao template. Se estiver ausente, passa.

Prova

for d in tests/*/; do python3 -m unittest discover -s "$d"; done passa inteiro: ci-config, ci-unico, hub-issue-sync (18), infisical-secrets e release (49 novos). Ainda não rodou num runner. O primeiro run real é o piloto DANI.

Pendências antes do piloto

  • Identity ci-runner: precisa ler prod:/deploy de cada produto (decisão do operador).
  • Tag pelo token do job: não sabemos se o Forgejo 15 aceita. O fallback é RELEASE_TOKEN.
  • DANI:
    • o deploy.sh precisa aceitar CODE_DIR e DEPLOY_DIR;
    • o NPM_PASSWORD que vinha do ~/.env do host precisa de um caminho novo.

🤖 Generated with Claude Code

## Release e deploy únicos da frota (INFRA-65726) Decisões do operador (30/09/2026): a tag é criada pelo CI a partir do `VERSION`; o deploy é SSH + checkout da tag + build no host; blue-green obrigatório; segredos só do Infisical. Piloto: DANI. Ficam fora TMF7 e TMF9. ### O que entra - `templates/release-chamador.yml`: cópia idêntica em todo produto, como `.forgejo/workflows/release.yml`. Roda no push em `main` que muda `VERSION`, ou por dispatch com `tag` (redeploy/rollback). - `.forgejo/workflows/release.yml`: tag e deploy no **mesmo run**, porque o Forgejo não cascateia push de tag para outro workflow. - **job `tag`:** semver estrito e idempotente. Usa o token do job, com fallback `RELEASE_TOKEN` do Infisical. - **job `deploy`:** - lê `DEPLOY_HOST`, `DEPLOY_USER`, `DEPLOY_PORT`, `SSH_PRIVATE_KEY` e `SSH_KNOWN_HOSTS` do Infisical `prod:/deploy`; - abre o SSH pelo `deploy-ssh`, com host key verificada e fail-closed; - confere que o host é o esperado e faz checkout da tag; - exige `deploy.sh` e `rollback.sh`; - checa a saúde e roda o rollback automático se ela falhar; - remove órfãos só pelo nome exato, para não apagar a cor standby. - `ci-config`: 13 chaves `deploy_*`. Com `deploy: false`, que é o padrão, o release não faz nada, nem cria a tag. - `conferir-ci-identico.sh`: se o `release.yml` existir, tem de ser idêntico ao template. Se estiver ausente, passa. ### Prova `for d in tests/*/; do python3 -m unittest discover -s "$d"; done` passa inteiro: ci-config, ci-unico, hub-issue-sync (18), infisical-secrets e release (49 novos). **Ainda não rodou num runner.** O primeiro run real é o piloto DANI. ### Pendências antes do piloto - **Identity `ci-runner`:** precisa ler `prod:/deploy` de cada produto (decisão do operador). - **Tag pelo token do job:** não sabemos se o Forgejo 15 aceita. O fallback é `RELEASE_TOKEN`. - **DANI:** - o `deploy.sh` precisa aceitar `CODE_DIR` e `DEPLOY_DIR`; - o `NPM_PASSWORD` que vinha do `~/.env` do host precisa de um caminho novo. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
- templates/release-chamador.yml: cópia idêntica em todo produto (push em main com VERSION, ou dispatch com tag)
- release.yml: job tag (semver estrito, idempotente, token do job com fallback RELEASE_TOKEN do Infisical) e job deploy (Infisical prod:/deploy, deploy-ssh com host key verificada, guard de host, checkout da tag, deploy.sh blue-green, health com rollback automático, órfãos por nome exato)
- ci-config: 13 chaves deploy_*; deploy=true exige code_dir, container e infisical_project
- conferir-ci-identico: release.yml presente tem de ser idêntico ao template
- 49 testes novos; suíte inteira verde

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
tarcisio deleted branch feat/deploy-unico 2026-09-30 14:47:19 -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!23
No description provided.