Pular para conteúdo

0022 — Adota o smoke de produção pós-deploy

Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-09-09 · Decidido em: 2026-09-09

Contexto

Este RD não decide nada novo: o smoke pós-deploy é norma da casa (constituição §9, ADR central 0031, página smoke-producao). O que faltava aqui era o rastro local — o que este app declarou como crítico, e por quê.

O problema alcança este repo em cheio: o POST /api/ci/deploy é assíncrono, então o pipeline ficava verde antes de o container novo servir. E /health verde é liveness — prova que o processo subiu e o Flyway passou, não que o app responde o que deveria. A frota já entregou, com o container healthy, tela nova em 500 e <APP>_API_TOKEN ausente que só apareceu como 401 no cliente.

Decisão

Adota o smoke declarando o manifesto no docs/app.json:

"smoke": {
  "bases": [
    "https://int.maxsul.xadm.biz",        "https://int.onpetrotrading.xadm.biz",
    "https://int.pontual.xadm.biz",       "https://int.sulplata.xadm.biz",
    "https://int.thoms.xadm.biz",         "https://int.vantroba.xadm.biz"
  ],
  "glitchtip": { "org": "x-adm", "project": "integrador" },
  "routes": [ { "path": "/health", "class": "public", "status": 200 } ]
}

Três escolhas locais, com o porquê:

  • bases lista as SEIS instâncias. Um repo, uma imagem, seis recursos Coolify (integrador.<cli>-jar-pull) — é exatamente o caso que a norma chama de "onde deploy parcial se esconde". Declarar só uma faria o smoke ficar verde com cinco clientes na versão velha.
  • Divergência entre bases NÃO reverte, e isso é deliberado. O POST /api/ci/deploy ancora por imagem e não tem eixo de instância: uma reversão reverteria as seis. Se as bases divergirem no commit anterior, o smoke reporta drift e falha sem reverter — achado operacional, não detalhe a resolver escolhendo uma base.
  • Só /health nesta onda. A whitelist anônima do app tem /health, /login, /logout, /swagger/**, /css/**, /images/**; toda a API /api/v1/** é M2M. Rota m2m exigiria SMOKE_M2M_TOKEN = o INTEGRADOR_API_TOKEN do callee no secret do repo — e foi a ausência desse token que produziu o 401 no pied.maxsul em 2026-08-29. Vale ligar, mas como passo próprio: o token é credencial de produção, não detalhe de manifesto.

Consequências

  • GLITCHTIP_API_TOKEN (read-only) é obrigatório nos secrets do repo no GitHub. Declarar smoke.glitchtip sem o secret REPROVA o smoke — é defeito de configuração, não degradação: sem ele a camada 3 não roda e o job ficaria "verde provando 3 de 4".
  • Bump xadm-comum-web 0.6.1 → 0.9.0: emite o commit no /health e resolve o release a partir de XADM_COMMIT. Sem ele a camada 1 degrada para versao e o rollback fica sem alvo.
  • O /health de cada uma das seis instâncias é lido antes do POST de deploy. Instância fora do ar entra sem commit e vira aviso — a instrumentação do smoke não derruba o deploy.
  • O commit do /health passa a ser o discriminador de entrega: XADM_COMMIT entra como build-arg no pipeline e vira ARG/ENV tarde no Dockerfile (declarado no topo, invalidaria o cache de toda camada abaixo a cada commit). Um identificador só atravessa pipeline, imagem, /health e tag imutável.
  • Reprovar reverte para <imagem>:<sha anterior>-<target> e confirma a reversão repolando o /health. Isso torna a tag imutável um ativo operacional: podar a tag que está no /health de um recurso em produção transforma o rollback em "não confirmado" no pior momento.
  • Este RD é ponteiro: divergência de mérito sobre o mecanismo se resolve no ADR central 0031, não aqui. O que se decide localmente é o manifesto — quais rotas não podem quebrar.