Um pipeline ci/cd bem projetado é a espinha dorsal de qualquer equipe de TI que precisa entregar software com velocidade e segurança. Neste tutorial, vamos construir um pipeline ci/cd do zero, cobrindo build, testes automatizados, empacotamento em container e deploy, com foco em decisões de arquitetura que fazem diferença em produção.
O que é um pipeline ci/cd e por que ele importa
Um pipeline ci/cd (Continuous Integration / Continuous Delivery ou Deployment) automatiza o fluxo entre o commit de código e a entrega em ambiente de produção. Na prática, ele elimina etapas manuais propensas a erro — build local, upload manual de artefatos, deploy via SSH — substituindo-as por estágios versionados e reproduzíveis.
Componentes essenciais
- Trigger: push, merge request ou tag que dispara a execução do pipeline ci/cd.
- Build: compilação do código-fonte e resolução de dependências (npm, pip, maven, go build).
- Testes automatizados: unitários, integração e, quando aplicável, testes de contrato entre serviços.
- Empacotamento: geração de imagem Docker versionada e publicação em um registry privado.
- Deploy: aplicação da nova versão em staging e, após aprovação, em produção.
A diferença entre CI e CD é sutil, mas relevante: integração contínua garante que o código é validado a cada commit; entrega contínua garante que ele está sempre pronto para ir ao ar, com ou sem aprovação humana no último passo (deployment contínuo).
Passo a passo para implementar um pipeline ci/cd
Vamos usar como referência um pipeline ci/cd baseado em GitHub Actions ou GitLab CI, aplicável também a Jenkins com ajustes de sintaxe.
1. Defina os estágios no arquivo de configuração
stages:
- build
- test
- package
- deploy
build:
stage: build
script:
- npm ci
- npm run build
Cada estágio do pipeline ci/cd deve ser isolado e idempotente — rodar novamente com o mesmo input precisa gerar o mesmo resultado, sem efeitos colaterais acumulados.
2. Automatize os testes
test:
stage: test
script:
- npm run test:unit
- npm run test:integration
coverage: '/Coverage: \d+\.\d+%/'
Sem essa etapa, um pipeline ci/cd vira apenas um script de deploy automatizado — a validação de qualidade é o que justifica a confiança em liberar código com frequência.
3. Empacote em container versionado
package:
stage: package
script:
- docker build -t registry.exemplo.com/app:$CI_COMMIT_SHA .
- docker push registry.exemplo.com/app:$CI_COMMIT_SHA
Usar o hash do commit como tag garante rastreabilidade total: cada imagem publicada pelo pipeline ci/cd corresponde exatamente a um estado do código-fonte.
4. Defina a estratégia de deploy
Aqui entra uma decisão arquitetural importante: o destino do deploy. Se a equipe roda cargas em Kubernetes, vale entender as diferenças entre orquestração gerenciada e alternativas serverless antes de conectar o último estágio do pipeline ci/cd — esse comparativo está detalhado em Kubernetes Gerenciado vs Serverless: Comparativo Técnico de Arquitetura.
deploy:
stage: deploy
script:
- kubectl set image deployment/app app=registry.exemplo.com/app:$CI_COMMIT_SHA
environment: production
when: manual
O parâmetro when: manual transforma o processo em entrega contínua com aprovação humana — recomendado para ambientes críticos, enquanto deployment contínuo (sem aprovação) costuma ser aceitável em staging.
Boas práticas e trade-offs de um pipeline ci/cd
Nem todo pipeline ci/cd precisa ser complexo desde o início. Times pequenos ganham mais implementando build, teste e deploy básico primeiro, evoluindo para estratégias avançadas (blue-green, canary release) conforme a criticidade da aplicação cresce.
- Vantagem: reduz erro humano e acelera o time-to-market de novas features.
- Trade-off: exige investimento inicial em configuração e manutenção da própria infraestrutura de CI (runners, secrets, cache de dependências).
- Vantagem: cria histórico auditável de cada versão publicada.
- Trade-off: pipelines mal projetados podem se tornar lentos e virar gargalo se não houver paralelização de estágios.
Um cuidado frequentemente negligenciado é o gerenciamento de segredos (chaves de API, credenciais de banco). Use cofres de secrets nativos da plataforma de CI ou soluções externas como Vault, nunca variáveis hardcoded no repositório.
Por fim, à medida que o pipeline ci/cd evolui, comunicar essas mudanças técnicas para o restante da empresa fortalece a percepção de maturidade do time — um tema que exploramos em Novidades da Empresa: Como Comunicar Evolução e Construir Autoridade.
Conclusão
Implementar um pipeline ci/cd bem estruturado é um investimento que se paga rapidamente em estabilidade e velocidade de entrega. Comece pelos estágios essenciais — build, teste, empacotamento e deploy — e evolua a estratégia conforme a maturidade da equipe e a criticidade do sistema exigirem.