Entrega na Nuvem no AKS
Visão Geral
O mecanismo de entrega para Kubernetes/Azure. Implementa segurança de deploy e o portão de verificação no AKS. Específico por stack por design — este skill só é carregado quando uma tarefa envolve k8s/AKS, então projetos sem deploy em nuvem (por exemplo, Docker Compose apenas local) nunca veem este conteúdo.
Regras de Entrega
- Desenvolvimento local executa o stack completo via Docker Compose, um comando, abrangente — um requisito de primeira classe.
- As imagens são construídas na CI → GHCR, identificadas por digest de conteúdo, e então promovidas inalteradas de preview → staging → produção. Nunca reconstruídas por ambiente.
- Ambientes de preview efêmeros por PR. Cada PR é implantado em seu próprio namespace isolado no AKS para revisão, destruído ao fazer merge/fechar. O berço de testes de integração; barato de criar e destruir.
- Gating de saúde do Kubernetes. Cada workload define probes de liveness, readiness e startup (conectadas aos endpoints em
observability-and-slos), uma estratégia de rolling update commaxUnavailable/maxSurgelimitados, e um PodDisruptionBudget. Use um HPA para carga. - Entrega progressiva para produção. Canário ou blue-green via Argo Rollouts / Flagger com análise de métricas automatizada vinculada a SLOs; um canário que falha aborta automaticamente.
- Rollback é de primeira classe e ensaiado. Imagens imutáveis e endereçadas por digest tornam o rollback um redeploy do digest anteriormente bom (
kubectl rollout undo/ abortar o rollout). Verificado antes que mudanças arriscadas sejam enviadas. - Migrações são uma etapa separada e ordenada da pipeline, segura para expansão (veja
zero-downtime-migrations), executada antes do código que depende delas — nunca agrupada no pod que precisa do novo schema. - A CI é o portão: lint, typecheck, verificações de contrato, testes, scans de segurança executados em cada mudança, e bloqueiam o merge no modo
enforced. A CI também constrói a imagem e publica seu atestado de proveniência, e promove esse digest inalterado. - Paridade dev/prod e configuração a partir do ambiente. Segredos do Azure Key Vault (via Secrets Store CSI driver ou sealed secrets) — nunca em imagens ou
.envcommitados. Portas/config a partir do ambiente. Ferramentas exclusivas de dev (pgTAP, runners de teste) nunca são enviadas em imagens de produção.
A Pipeline
| Tier | Gatilho | Ambiente | Digest |
|---|---|---|---|
| preview | PR aberto / sincronizado | ns efêmero preview-<app>-pr-<N> | construído aqui, tag sha-<pr-head> |
| staging | merge na main | ns persistente staging | retag do digest de preview como sha-<merge> |
| produção | release publicado + aprovação | ns production | digest do parent do commit do release |
Por que o commit pai. O commit de release do release-please altera apenas CHANGELOG.md e o manifesto, então sua árvore nunca é aquela que staging absorveu — o que o preview construiu para o próprio PR de release nunca foi promovido além do preview. Seu pai é o último merge de feature, que é exatamente o que staging tem validado, desde que o release-please mantenha seu branch de release na ponta da main (seu comportamento padrão). Derivar o digest do git em vez do estado ativo do cluster mantém a promoção reproduzível.
Segurança do retag. Squash-merge produz um SHA de commit diferente e, se a main se moveu enquanto o PR estava aberto, uma árvore diferente. Duas proteções:
- Exigir que "branches estejam atualizados antes de fazer merge" — um subconjunto da regra de verificações de status obrigatórias — para que a árvore do squash seja igual à árvore head do PR por construção. Esta proteção precisa de proteção de branch, então existe apenas no modo
enforced; um projeto no modoadvisorytem a comparação de árvore abaixo como sua única proteção, e deve esperar que o caminho de reconstrução seja rotineiro em vez de excepcional. - Verificar em vez de assumir: compare
git rev-parse <merge>^{tree}com a árvore head do PR. Iguais → retag. Diferentes → reconstruir no SHA do merge. Isso não é a reconstrução por ambiente que as Regras de Entrega proíbem: uma árvore diferente significa que o conteúdo em si difere do que o preview validou, então não há artefato promovível para reutilizar — e a imagem reconstruída entra no staging como um candidato novo , não uma promoção. Observe o que é sacrificado quando este caminho é tomado: essa imagem nunca foi revisada em um ambiente de preview, então "a imagem enviada é a imagem revisada" não se aplica a ela. Staging é então sua primeira validação, não a segunda.
O retag é uma operação de ponteiro — sem reconstrução, sem pull:
docker buildx imagetools create -t "$REPO:sha-$MERGE_SHA" "$REPO@sha256:$DIGEST"
O atestado permanece vinculado ao SHA head do PR, portanto registre o mapeamento head→merge no registro de deploy; a configuração da imagem não pode ser editada sem reconstruir.
O portão de aprovação — uma propriedade, dois mecanismos:
| Modo | Mecanismo |
|---|---|
enforced | Ambiente GitHub production com revisores obrigatórios |
advisory | Um job workflow_dispatch promote; executá-lo é a decisão |
Referência Rápida
| Assunto | Mecanismo |
|---|---|
| Segredos | Key Vault → driver CSI; rotacionados; nunca na imagem |
| Saúde | probes liveness + readiness + startup; readiness verifica dependências reais |
| Rollout seguro | canário/blue-green, gate por SLO, aborto automático em falha |
| Rollback | redeploy do digest anteriormente bom; ensaiado antes de envios arriscados |
| Ambiente por PR | namespace isolado, destruído no merge |
| Schema | etapa separada ordenada, segura para expansão, antes do código |
| Promoção | Retag do digest; nunca reconstruir por ambiente |
| Aprovação | Revisores de ambiente (enforced) ou dispatch manual (advisory) |
Por que isso é isolado: todos os específicos do Azure/k8s vivem aqui atrás de um gatilho específico do stack. Um projeto local-only ou de nuvem diferente substitui seu próprio skill de entrega; os princípios (artefato imutável, deploy reversível + progressivo, migrações desacopladas) vêm de resilience-and-deploy-safety.
Raciocínio completo: Artigo XIX da constituição, agrupado em engineering-constitution/references/engineering-constitution.md.