Introdução: Por que projetos C++ precisam de CI/CD?
O desenvolvimento em C++ tradicionalmente é associado à compilação manual, execução de testes e controle de versão meticuloso. No entanto, no desenvolvimento moderno, especialmente ao trabalhar em equipe, essa abordagem se torna um gargalo. CI/CD (Continuous Integration / Continuous Deployment) é uma prática que automatiza os processos de compilação, teste e implantação de código. Para projetos C++, onde erros de compilação ou linkagem podem se manifestar apenas em plataformas específicas, o CI/CD é criticamente importante.
GitHub Actions é uma ferramenta poderosa e flexível, integrada ao GitHub, que permite criar pipelines diretamente no repositório. Neste artigo, vamos detalhar como configurar CI/CD para um projeto C++ do zero, usando GitHub Actions. Você aprenderá como automatizar a compilação com CMake, executar testes unitários, verificar a qualidade do código e até publicar releases.
Ao final do artigo, você será capaz de configurar de forma independente um pipeline que economizará horas de trabalho manual e aumentará a confiabilidade do seu projeto.
Parte Principal: Guia passo a passo do GitHub Actions para C++
1. Fundamentos do GitHub Actions: Workflow, Jobs e Steps
Antes de escrever código, vamos entender a terminologia. GitHub Actions é baseado em workflows (fluxos de trabalho), que são descritos em arquivos YAML dentro do diretório .github/workflows/. Cada workflow consiste em um ou mais jobs (tarefas), que são executados em paralelo ou sequencialmente. Cada job consiste em steps (etapas) — comandos ou ações individuais.
Para um projeto C++, um workflow típico inclui:
- Build (Compilação): compilação do projeto usando CMake e Make/Ninja.
- Test (Teste): execução de testes unitários (por exemplo, com Google Test ou Catch2).
- Lint (Análise Estática): verificação do código com analisadores estáticos (Clang-Tidy, Cppcheck).
- Deploy (Implantação): publicação de artefatos ou releases.
O primeiro workflow geralmente é criado para a compilação básica no Ubuntu, mas C++ exige verificação em diferentes SOs (Linux, macOS, Windows). GitHub Actions suporta todas as três plataformas.
2. Criando o primeiro workflow: compilação e teste
Crie o arquivo .github/workflows/ci.yml na raiz do seu repositório. Abaixo está um exemplo para um projeto que usa CMake e Google Test.
name: C++ CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
build_type: [Debug, Release]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies (Linux)
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install -y cmake g++ ninja-build
- name: Install dependencies (macOS)
if: runner.os == 'macOS'
run: brew install cmake ninja
- name: Install dependencies (Windows)
if: runner.os == 'Windows'
run: choco install cmake ninja -y
- name: Configure CMake
run: cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
- name: Build
run: cmake --build build --config ${{ matrix.build_type }}
- name: Run tests
working-directory: build
run: ctest --output-on-failure -C ${{ matrix.build_type }}
Este workflow:
- É acionado ao fazer push para
mainoudevelop, bem como ao criar um Pull Request. - Usa uma matriz de estratégias para compilar em três SOs e em duas configurações (Debug/Release).
- Instala as dependências (CMake, Ninja) dependendo do SO.