feat(release): chave deploy_gate — release.yml fala o contrato do tmf-deploy-gate [INFRA-68093] #88
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/INFRA-68093-deploy-gate-contrato"
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
Chave nova
deploy_gateno.forgejo/ci-config.yml(boolean, padrãofalse) para orelease.ymlfalar o contrato doscripts/tmf-deploy-gate.deploy_gate: false(padrão): nada muda —ssh deploy "bash -s -- <modo> ..." < deploy-remoto.she guarda porssh deploy hostname.deploy_gate: true: deploy, rollback e orfaos vão comossh deploy "<modo> 'K=v' ..."sem stdin (</dev/null) e semCODE_DIR/ENV_DIR/CONTAINER, que vêm do/etc/tmf-deploy/<produto>.conf(no ci-config o caminho é relativo; o conf do gate exige absoluto e igual, então quem manda é o conf). A guarda de host usassh deploy host.tmf-deploy-gate: modo novohost, que não aceita argumento e só imprimeuname -n. O nome não éhostnamede propósito: o release comdeploy_gate: falsemandahostname, e é a recusa dele que faz o deploy falhar cedo.tag(saída doci_config.py release) para o jobdeployporenv:(DEPLOY_GATE). Não há${{ }}dentro derun:nem blocosecrets:. Valor fora detrue|falsefalha antes do SSH.ARGS=$(q)$(q)…não parava o passo).Por quê
Hoje o
release.ymle o gate falam contratos que não se entendem: com o gate ligado no host, todo deploy quebrava (hostname/bash→ "modo não permitido"). Esta chave permite ligar o gate produto a produto, sem mexer em quem não ligou.Teste negativo
Host com gate e
deploy_gate: false: a guarda de host recebetmf-deploy-gate: recusado — modo não permitido: 'hostname'e o passo para com::error::o host tem o tmf-deploy-gate: ponha deploy_gate: true no .forgejo/ci-config.yml, antes do status pending e de qualquer deploy. No caso inverso (truenuma chave sem gate), a mensagem é "o host não respondeu ao modo 'host'".Validação
tests/release/test_deploy_gate_contrato.py(novo): executa osrun:reais do release.yml (guarda, Deploy, Rollback, órfãos) com umsshfalso que entrega o comando aotmf-deploy-gatereal (viaSSH_ORIGINAL_COMMAND) e a umdeploy-remoto.shfalso:true, o gate aceita deploy, rollback, orfaos e host;false, o gate recusa todos, e a guarda falha cedo com a mensagem clara;falsemantém o comando e o stdin atuais,truevai sem stdin e sem diretórios; valor inválido não chega a fazer SSH; aspas recusadas nos dois modos;ci_config.py releasee a passagem por env.tests/release/test_tmf_deploy_gate.py: o modohostimprime o hostname, vale fora deMODOS, não aceita argumento e exige conf;hostnamecontinua recusado.python3 -m unittest discover -s tests/<d>): release 373 OK, ci-config 150 OK (4 skip), ci-unico 118 OK, deploy-guard 82 OK, hub-issue-sync 38 OK, sonar 28 OK, soberania 25 OK, cve-os 21 OK, sync-docs-filtro 21 OK, if-em-caller 18 OK, ci-ok 17 OK, version-code 17 OK, reusable-publico 13 OK, infisical-secrets 9 OK, nginx-log 6 OK. generate-docs: 19 testes, 2 falhas de ambiente local (python: command not found— a máquina só tempython3), em código que este PR não toca.Docs:
docs/guia-de-adocao.md(linha da chave e roteiro para ligar e desligar),templates/ci-config.exemplo.yml,CHANGELOG.mdem [Não lançado].Não verificado: nunca rodou em host real (o gate segue desligado).
🤖 Generated with Claude Code
https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2