GitLab CI
stages organiza a visualização; needs descreve a dependência real e permite executar
um DAG. Separe validação, testes e build. O deploy deve consumir o digest produzido, não
um checkout novo que pode ter mudado.
stages: [validar, testar, publicar]teste: stage: testar image: node:22-bookworm-slim script: ["npm ci", "npm test"]publicar: stage: publicar needs: [teste] rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' script: ["./ci/publicar.sh $CI_COMMIT_SHA"]Use rules para declarar quando cada job existe; evite misturar mecanismos sem testar a
árvore de decisões. artifacts transferem evidência entre jobs, com expiração definida, e
nunca devem conter segredo. cache serve para dependências e sua chave deve vir do lockfile.
Templates com extends reduzem repetição, mas herança profunda oculta permissões e
scripts. Variáveis protegidas só devem chegar a branches e ambientes protegidos; prefira
identidade federada quando o provedor permitir. Review apps precisam expirar e nunca usar
dados de produção. Restrinja runners por tags e acesso de rede para jobs de publicação.
Próximo passo: use GitOps quando o cluster deve reconciliar estado a partir do repositório, sem acesso direto do CI a produção.