Pipeline de imagem + GitOps: o fluxo completo
Objetivos desta aula
- Conectar CI de imagem a atualização de manifests
- Automatizar bump de versão por PR
- Definir governança de deploy
O fluxo maduro tem dois repositórios e dois papéis. O CI da aplicação testa, constrói e publica a imagem com tag imutável. Em seguida, um passo abre PR no repositório GitOps atualizando a tag do overlay do ambiente. Quem revisa esse PR está autorizando o deploy.
Para staging, esse PR pode ter merge automático — feedback rápido é mais valioso que cerimônia. Para produção, revisão humana e janela definida. Assim o mesmo mecanismo atende dois níveis de risco sem ferramentas diferentes.
Alternativa: ArgoCD Image Updater observa o registry e atualiza a tag automaticamente. É conveniente, mas reduz a rastreabilidade de 'quem decidiu implantar'. Em produção, prefira o PR explícito.
1. O fluxo ponta a ponta
- Dev abre PR em
cloudshop-app - CI roda testes, lint e scan
- No merge, build da imagem com tag do commit, SBOM e assinatura
- CI abre PR (ou commit) em
cloudshop-gitopstrocando a tag de staging - ArgoCD sincroniza staging; smoke tests validam
- Promoção para prod via PR aprovado
2. Tag imutável e digest
Use a tag do commit (sha-abc1234) ou, melhor, o digest @sha256:…. latest impede saber o que roda e quebra rollback.
3. Quem atualiza o Git
Opções: o próprio CI com um GitHub App de escopo mínimo, ou o Argo CD Image Updater observando o registry. Em ambos, a credencial só escreve no repo de config, nunca no cluster.
4. Garantindo a cadeia
Uma política no cluster (Kyverno ou Sigstore policy-controller) só admite imagens assinadas pelo seu pipeline. Assim, mesmo alguém com acesso ao Git não sobe imagem desconhecida.
5. Medindo o resultado
Com o fluxo completo você mede as métricas DORA: frequência de deploy (merges no gitops), lead time (commit → sync em prod), taxa de falha e tempo de recuperação (revert → sync).
Na prática
CI abre PR no repositório GitOps
yaml
name: promover-staging
on:
workflow_run:
workflows: [ci]
types: [completed]
branches: [main]
permissions:
contents: read
jobs:
bump:
if: github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
repository: sua-org/cloudshop-gitops
token: ${{ secrets.GITOPS_PR_TOKEN }}
- uses: imranismail/setup-kustomize@v2
- name: Atualizar tag da imagem no overlay de staging
run: |
cd overlays/staging
kustomize edit set image ghcr.io/sua-org/cloudshop/api=ghcr.io/sua-org/cloudshop/api:sha-${{ github.event.workflow_run.head_sha }}
- uses: peter-evans/create-pull-request@v6
with:
token: ${{ secrets.GITOPS_PR_TOKEN }}
branch: bump/staging-${{ github.event.workflow_run.head_sha }}
title: "chore(staging): atualiza api para sha-${{ github.event.workflow_run.head_sha }}"
body: "Promocao automatica apos CI verde na main."Nota de segurança: O token de acesso ao repositório GitOps deve permitir apenas abrir PR, nunca fazer push direto na main.
Job do CI que atualiza o repositório GitOps
yaml
update-gitops:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/create-github-app-token@v1
id: app
with:
app-id: ${{ vars.GITOPS_APP_ID }}
private-key: ${{ secrets.GITOPS_APP_KEY }}
repositories: cloudshop-gitops # escopo mínimo
- uses: actions/checkout@v4
with: { repository: cloudshop/cloudshop-gitops, token: "${{ steps.app.outputs.token }}" }
- run: |
cd apps/api/overlays/staging
kustomize edit set image ghcr.io/cloudshop/api@${{ needs.build.outputs.digest }}
git config user.name "cloudshop-bot"
git config user.email "bot@cloudshop.dev"
git commit -am "chore(staging): api ${{ github.sha }}" && git pushPor que isso importa
Esta é a arquitetura de entrega que as vagas de Platform Engineering descrevem hoje.
Erro comum
Dar push direto na main do repositório GitOps pelo pipeline, eliminando a revisão.
Dica de produção
Registre no PR o link do build, os testes e o digest da imagem: revisão informada em trinta segundos.
Pergunta de entrevista
Descreva o caminho de um commit até produção em uma arquitetura GitOps.
Glossário
- Image Updater
- Componente que atualiza tags de imagem automaticamente a partir do registry.
- promoção automática
- Atualização automatizada de manifests após validação em CI.
- Digest
- Hash sha256 que identifica uma imagem de forma imutável.
- Image Updater
- Componente do ArgoCD que atualiza tags no Git ao detectar novas imagens.
- Admission policy
- Regra que aceita ou rejeita recursos ao entrarem no cluster.
Conexão com o CloudShop
Automatizar a promoção do CloudShop para staging após CI verde.
Quiz da aula
1. Qual prática preserva a rastreabilidade do deploy em GitOps?
2. Por que referenciar a imagem por digest em vez de 'latest'?
3. Que credencial o CI precisa ter no fluxo GitOps?
Minhas anotações
Salvo automaticamente neste navegador.