Pular para conteúdo

Integração Contínua

No capítulo anterior, estudamos como equipes colaboram usando branches, pull requests e code review. Essas práticas estruturam o trabalho em equipe, mas, por si só, não garantem que o código integrado funcione corretamente. A Integração Contínua (CI — Continuous Integration) é a prática que fecha esse ciclo: cada contribuição enviada ao repositório é automaticamente validada por um pipeline de verificações antes de ser aceita.

O que é Integração Contínua?

Integração Contínua é uma prática de engenharia de software na qual os desenvolvedores integram seu código em um repositório compartilhado com frequência — de preferência várias vezes ao dia. Cada integração é verificada por um pipeline automatizado que executa tarefas como compilação, testes e análise de código, fornecendo feedback rápido sobre a qualidade da mudança.

O conceito foi popularizado por Martin Fowler e Kent Beck como parte da metodologia Extreme Programming (XP) no final dos anos 1990. A ideia central é simples: se integrar código é doloroso, faça isso com mais frequência — e automatize a validação.

O diagrama abaixo ilustra o fluxo típico de um pipeline de CI:

flowchart LR
    A["Desenvolvedor\nfaz push"] --> B["Evento\n(trigger)"]
    B --> C["Pipeline CI"]

    subgraph C["Pipeline CI"]
        direction TB
        C1["Job 1:\nTestes"] --> C2["Job 2:\nLinting"]
        C2 --> C3["Job 3:\nBuild"]
    end

    C --> D{"Resultado"}
    D -- "Sucesso ✓" --> E["Merge\nhabilitado"]
    D -- "Falha ✗" --> F["Feedback\nao dev"]

O que um pipeline CI pode fazer?

Um pipeline é uma sequência de jobs (tarefas) que são executados automaticamente em resposta a um evento. Entre as verificações mais comuns em pipelines CI, destacam-se:

Verificação Descrição Exemplo de ferramenta
Testes automatizados Execução de testes unitários, de integração e end-to-end pytest, jest, JUnit
Linting e formatação Análise estática para identificar problemas de estilo e más práticas ruff, eslint, checkstyle
Cobertura de testes Mensuração da porcentagem do código exercitada pelos testes pytest-cov, istanbul
Análise de segurança Verificação de vulnerabilidades em dependências e no código trivy, dependabot, bandit
Build de artefatos Compilação do código ou construção de imagens de contêiner docker build, gradle, maven
Versionamento Geração automática de tags, versões e changelogs semantic-release

Na prática, quando a equipe configura um pipeline CI no repositório, cada push ou pull request dispara automaticamente essas verificações em um ambiente limpo e reprodutível. Se qualquer etapa falha, o desenvolvedor recebe feedback imediato e pode corrigir o problema antes que ele se propague para o restante da equipe. Essa é a essência do CI: feedback rápido e contínuo.

Ferramentas de CI

Existem diversas ferramentas para implementar pipelines de integração contínua. O quadro abaixo compara as principais opções disponíveis no mercado:

Ferramenta Hospedagem Integração nativa Observações
GitHub Actions SaaS (GitHub) GitHub Gratuito para repositórios públicos. Configuração via YAML no repositório.
GitLab CI/CD SaaS ou self-hosted GitLab Integrado ao GitLab. Runners próprios ou compartilhados.
Jenkins Self-hosted Qualquer (via plugins) Open source, altamente extensível. Requer infraestrutura dedicada.
CircleCI SaaS ou self-hosted GitHub, Bitbucket Boa experiência com Docker. Plano gratuito limitado.
Azure DevOps SaaS Azure, GitHub Integração forte com ecossistema Microsoft.

Neste curso, utilizaremos o GitHub Actions, pois é integrado nativamente ao GitHub (que já estamos usando), não requer infraestrutura adicional e possui uma comunidade ativa com milhares de actions reutilizáveis disponíveis no GitHub Marketplace.

Conceitos do GitHub Actions

Antes de criar nosso primeiro pipeline, é fundamental entender a terminologia do GitHub Actions. Os conceitos abaixo são a base para compreender qualquer workflow:

  • Workflow: Um processo automatizado definido em um arquivo YAML dentro do diretório .github/workflows/ do repositório. Um repositório pode ter múltiplos workflows.
  • Event (trigger): O evento que dispara a execução do workflow. Exemplos: push, pull_request, schedule (cron), workflow_dispatch (manual).
  • Job: Um conjunto de steps que são executados no mesmo runner. Um workflow pode ter múltiplos jobs, que por padrão rodam em paralelo.
  • Step: Uma tarefa individual dentro de um job. Pode ser um comando shell (run:) ou uma action reutilizável (uses:).
  • Runner: A máquina (virtual) onde o job é executado. O GitHub oferece runners gratuitos com Ubuntu, Windows e macOS.
  • Action: Um componente reutilizável que encapsula uma tarefa comum (ex: actions/checkout@v4 faz o clone do repositório). Disponíveis no GitHub Marketplace.
  • Secret: Um valor sensível (tokens, senhas) armazenado de forma criptografada no repositório e acessível nos workflows via ${{ secrets.NOME }}.
  • Artifact: Arquivos gerados durante o pipeline (binários, relatórios, logs) que podem ser baixados ou passados entre jobs.

O diagrama abaixo mostra como esses conceitos se relacionam na estrutura de um arquivo YAML:

flowchart TD
    W["Workflow\n(.github/workflows/ci.yml)"]
    W --> E["Event (trigger)\non: push, pull_request"]
    W --> J1["Job: testes"]
    W --> J2["Job: build"]

    J1 --> S1["Step 1: checkout\n(uses: actions/checkout@v4)"]
    J1 --> S2["Step 2: setup python\n(uses: actions/setup-python@v5)"]
    J1 --> S3["Step 3: instalar deps\n(run: pip install ...)"]
    J1 --> S4["Step 4: rodar testes\n(run: pytest)"]

    J2 --> |"needs: testes"| S5["Step 1: build image\n(uses: docker/build-push-action)"]

    J1 -.- R1["Runner:\nubuntu-latest"]
    J2 -.- R2["Runner:\nubuntu-latest"]

Tipos de triggers

O GitHub Actions suporta diversos tipos de eventos para disparar workflows. Os mais utilizados em pipelines CI são:

on:
  # Dispara em qualquer push para as branches listadas
  push:
    branches: [main, develop]

  # Dispara quando um pull request é aberto ou atualizado
  pull_request:
    branches: [main]

  # Dispara em um cronograma (sintaxe cron)
  schedule:
    - cron: '0 6 * * 1'  # toda segunda-feira às 6h UTC

  # Permite disparar manualmente pela interface do GitHub
  workflow_dispatch:

O trigger pull_request é particularmente importante em pipelines CI: ele permite que o código seja validado antes do merge, garantindo que a branch principal sempre contenha código funcional. Essa é a conexão direta entre o que estudamos em pull requests/code review e a integração contínua.

wc -l "/home/eduardo/Documentos/Aulas/Fundamentos DevOps/notas-aula-site/docs/ci/index.md"! info "Nota sobre Docker neste capítulo" Nas próximas páginas, construiremos uma imagem Docker como parte do pipeline CI. Se você ainda não trabalhou com Docker, não se preocupe — as instruções são autocontidas e explicam cada passo. Os fundamentos de contêineres e Docker serão aprofundados nos capítulos seguintes.