Ferramentas & Produtividade

CI/CD na Prática

8 min de leitura

CI/CD na Prática

O que é CI/CD e Por Que Importa CI/CD significa Integração Contínua (CI) e Entrega/Implantação Contínua (CD). A ideia central é automatizar o caminho do código — desde o commit até a produção — eliminando tarefas manuais repetitivas e reduzindo erros humanos. Como desenvolvedor experiente, posso afirmar que times que implementam CI/CD bem conseguem fazer deploy 10 vezes por dia com confiança, enquanto times sem essas práticas levam semanas e vivem com medo de quebrar produção. A Integração Contínua garante que toda mudança de código passe por testes automatizados antes de entrar na branch principal. A Entrega Contínua leva esse código testado até um ambiente pronto para produção. A Implantação Contínua vai além: publica automaticamente em produção sem intervenção humana. A maioria dos times implementa CI + CD parcial, e está tudo bem. Por que começar agora? Feedback rápido é ouro em desenvolvimento. Quando seu código quebra, você descobre em minutos, não em semanas. Além disso, documentação fica viva (os

<h2>O que é CI/CD e Por Que Importa</h2>

<p>CI/CD significa Integração Contínua (CI) e Entrega/Implantação Contínua (CD). A ideia central é automatizar o caminho do código — desde o commit até a produção — eliminando tarefas manuais repetitivas e reduzindo erros humanos. Como desenvolvedor experiente, posso afirmar que times que implementam CI/CD bem conseguem fazer deploy 10 vezes por dia com confiança, enquanto times sem essas práticas levam semanas e vivem com medo de quebrar produção.</p>

<p>A Integração Contínua garante que toda mudança de código passe por testes automatizados antes de entrar na branch principal. A Entrega Contínua leva esse código testado até um ambiente pronto para produção. A Implantação Contínua vai além: publica automaticamente em produção sem intervenção humana. A maioria dos times implementa CI + CD parcial, e está tudo bem.</p>

<h3>Por que começar agora?</h3>

<p>Feedback rápido é ouro em desenvolvimento. Quando seu código quebra, você descobre em minutos, não em semanas. Além disso, documentação fica viva (os passos estão no pipeline), onboarding melhora (novatos veem exatamente como tudo funciona), e você dorme melhor sabendo que cada deploy foi validado por máquinas.</p>

<h2>Configurando seu Primeiro Pipeline com GitHub Actions</h2>

<p>GitHub Actions é grátis, integrado ao GitHub, e perfeito para começar. Vou mostrar um exemplo real com Node.js que testa e faz deploy automático.</p>

<h3>Estrutura do repositório</h3>

<p>Crie a pasta <code>.github/workflows/</code> na raiz do projeto:</p>

<pre><code>seu-projeto/

├── .github/workflows/

│ └── ci-cd.yml

├── src/

│ └── app.js

├── tests/

│ └── app.test.js

├── package.json

└── README.md</code></pre>

<h3>Exemplo funcional: Pipeline completo</h3>

<pre><code class="language-yaml">name: CI/CD Pipeline

on:

push:

branches: [main, develop]

pull_request:

branches: [main]

jobs:

test:

runs-on: ubuntu-latest

strategy:

matrix:

node-version: [18.x, 20.x]

steps:

  • uses: actions/checkout@v4
  • name: Usar Node.js ${{ matrix.node-version }}

uses: actions/setup-node@v4

with:

node-version: ${{ matrix.node-version }}

cache: &#039;npm&#039;

  • name: Instalar dependências

run: npm ci

  • name: Rodar testes

run: npm test

  • name: Verificar cobertura

run: npm run coverage

deploy:

needs: test

runs-on: ubuntu-latest

if: github.ref == &#039;refs/heads/main&#039; &amp;&amp; github.event_name == &#039;push&#039;

steps:

  • uses: actions/checkout@v4
  • name: Deploy para produção

env:

DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}

run: |

mkdir -p ~/.ssh

echo &quot;$DEPLOY_KEY&quot; &gt; ~/.ssh/deploy_key

chmod 600 ~/.ssh/deploy_key

ssh-keyscan -H seu-servidor.com &gt;&gt; ~/.ssh/known_hosts

ssh -i ~/.ssh/deploy_key user@seu-servidor.com &#039;cd /app &amp;&amp; git pull &amp;&amp; npm install &amp;&amp; npm run build &amp;&amp; pm2 restart app&#039;</code></pre>

<p>Neste exemplo, a seção <code>test</code> roda em múltiplas versões do Node (matriz), enquanto <code>deploy</code> só executa após sucesso dos testes e apenas na branch <code>main</code>. Os secrets (<code>DEPLOY_KEY</code>) ficam seguros, nunca no código.</p>

<h2>Qualidade de Código no Pipeline</h2>

<p>Testes são apenas um pilar. Code linting, análise estática e relatórios de segurança transformam seu pipeline de simples &quot;rode os testes&quot; para &quot;garanta código profissional&quot;.</p>

<h3>Integrando ESLint, Prettier e SonarQube</h3>

<pre><code class="language-yaml"> quality:

runs-on: ubuntu-latest

steps:

  • uses: actions/checkout@v4
  • uses: actions/setup-node@v4

with:

node-version: 20.x

cache: &#039;npm&#039;

  • run: npm ci
  • name: Lint

run: npm run lint

  • name: Formatar (Prettier)

run: npx prettier --check src/

  • name: SonarQube Scan

uses: SonarSource/sonarcloud-github-action@master

env:

GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

SONARCLOUD_TOKEN: ${{ secrets.SONARCLOUD_TOKEN }}</code></pre>

<p>No <code>package.json</code>, adicione:</p>

<pre><code class="language-json">{

&quot;scripts&quot;: {

&quot;lint&quot;: &quot;eslint src/ --max-warnings 0&quot;,

&quot;test&quot;: &quot;jest --coverage&quot;,

&quot;coverage&quot;: &quot;jest --coverage --coveragePathIgnorePatterns=/node_modules/&quot;

},

&quot;devDependencies&quot;: {

&quot;eslint&quot;: &quot;^8.50.0&quot;,

&quot;prettier&quot;: &quot;^3.0.0&quot;,

&quot;jest&quot;: &quot;^29.0.0&quot;

}

}</code></pre>

<p>Isso garante que nenhum código com warnings ou má formatação entra em main. SonarQube detecta code smells e vulnerabilidades — é overkill para projetos pequenos, mas essencial em empresas.</p>

<h2>Estratégias de Deploy e Rollback</h2>

<p>Nem todo deploy é igual. Blue-Green e Canary são estratégias que reduzem risco drasticamente.</p>

<h3>Blue-Green: Segurança em Troca de Recursos</h3>

<p>Você mantém dois ambientes idênticos: Blue (atual) e Green (novo). Deploy vai para Green, testes rodam lá, e só depois você aponta o load balancer para Green. Se algo quebrar, volta para Blue em segundos.</p>

<pre><code class="language-bash">#!/bin/bash

deploy-blue-green.sh

CURRENT=$(curl -s http://api.seu-site.com/version)

if [ &quot;$CURRENT&quot; = &quot;blue&quot; ]; then

TARGET=&quot;green&quot;

else

TARGET=&quot;blue&quot;

fi

Deploy na versão alvo

docker build -t seu-app:latest .

docker run -d -p 8080:3000 --name seu-app-$TARGET seu-app:latest

Testes de smoke

if ! curl -f http://localhost:8080/health; then

echo &quot;Deploy falhou nos testes de saúde&quot;

docker stop seu-app-$TARGET

exit 1

fi

Switch de tráfego

sed -i &quot;s/upstream backend {.*}/upstream backend { server 127.0.0.1:8080; }/&quot; /etc/nginx/nginx.conf

nginx -s reload

echo &quot;Deploy de $TARGET concluído com sucesso&quot;</code></pre>

<p>Blue-Green é caro (precisa de 2x recursos), mas é o padrão em fintechs e saúde. Para startups, Canary (liberar para 5% dos usuários primeiro) é mais prático.</p>

<h2>Conclusão</h2>

<p>Dominar CI/CD não é sobre ser um &quot;expert em ferramentas&quot; — é sobre mentalidade. Três pontos que levarei com você:</p>

<ol>

<li><strong>Automatizar reduz fricção</strong>: Cada tarefa manual que entra no pipeline é uma chance de erro eliminada. Seu código fica mais confiável porque máquinas não se distraem.</li>

</ol>

<ol>

<li><strong>Feedback rápido muda tudo</strong>: Saber em 5 minutos que sua mudança quebrou algo é incomparável. Você corrige ainda com o contexto fresco na cabeça, não duas semanas depois.</li>

</ol>

<ol>

<li><strong>Comece simples, evolua depois</strong>: Não precisa de SonarQube, Kubernetes e 15 estágios no dia um. Comece com testes e GitHub Actions. Adicione segurança, análise estática e canary deploys conforme sua aplicação cresce.</li>

</ol>

<p>CI/CD é um investimento que se paga rapidamente. A primeira semana é setup, a segunda mês, e depois você faz em 2 horas o que levaria dias antes.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.github.com/en/actions" target="_blank" rel="noopener noreferrer">GitHub Actions Documentation</a></li>

<li><a href="https://docs.gitlab.com/ee/ci/" target="_blank" rel="noopener noreferrer">CI/CD with GitLab - Official Guide</a></li>

<li><a href="https://itrevolution.com/product/the-devops-handbook-second-edition/" target="_blank" rel="noopener noreferrer">The DevOps Handbook - Gene Kim, Jez Humble, Patrick Debois, John Willis</a></li>

<li><a href="https://docs.sonarqube.org/latest/" target="_blank" rel="noopener noreferrer">SonarQube Official Documentation</a></li>

<li><a href="https://docs.docker.com/develop/dev-best-practices/" target="_blank" rel="noopener noreferrer">Docker Best Practices for Production</a></li>

</ul>

Comentários

Mais em Ferramentas & Produtividade

Como Usar Docker e Kubernetes em Produção
Como Usar Docker e Kubernetes em Produção

Docker em Produção: Containerização Eficiente Docker é essencial para qualque...

O que Todo Dev Deve Saber sobre Infraestrutura como Código
O que Todo Dev Deve Saber sobre Infraestrutura como Código

O que é Infraestrutura como Código (IaC) Infraestrutura como Código é a práti...

Mensageria Assíncrona na Prática
Mensageria Assíncrona na Prática

O que é Mensageria Assíncrona e Por Que Importa Mensageria assíncrona é um pa...