CI/CD para projetos C++: configurando GitHub Actions
O desenvolvimento moderno em C++ requer não apenas escrever código de qualidade, mas também configurar processos de compilação, teste e implantação. CI/CD (Continuous Integration / Continuous Deployment) é uma prática que permite automatizar esses processos, reduzindo o tempo entre a escrita do código e sua entrega aos usuários. Neste artigo, veremos como configurar CI/CD para projetos C++ usando GitHub Actions — uma ferramenta poderosa e gratuita integrada ao GitHub.
GitHub Actions permite criar workflows automatizados que são acionados por eventos específicos: push no repositório, criação de pull request, release e outros. Para projetos C++, isso é especialmente útil, pois permite garantir que o código compile em diferentes plataformas e não contenha regressões.
Fundamentos do GitHub Actions para C++
GitHub Actions usa arquivos YAML para descrever workflows. Cada workflow consiste em um ou mais jobs, que são executados em máquinas virtuais (runners). Para projetos C++, normalmente são usados runners Ubuntu, Windows e macOS. Vamos analisar a estrutura básica de um arquivo de workflow.
name: C++ CI
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4
- name: Install dependencies run: | sudo apt-get update sudo apt-get install -y cmake g++ libboost-all-dev
- name: Configure CMake run: cmake -B build -DCMAKE_BUILD_TYPE=Release
- name: Build run: cmake --build build --config Release
- name: Test run: cd build && ctest --output-on-failureEste workflow é acionado ao fazer push nos branches main e develop, bem como ao criar um pull request para main. Ele instala dependências (CMake, g++, Boost), configura o projeto, compila e executa os testes.
Compilação multiplataforma de projetos C++
Uma das principais vantagens do CI/CD para C++ é a capacidade de verificar automaticamente a compilação em várias plataformas. Isso é crítico, pois o código C++ pode se comportar de forma diferente em diferentes SOs e compiladores. GitHub Actions permite organizar facilmente uma matriz de compilação.
jobs: build: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] compiler: [g++, clang++] include: - os: ubuntu-latest compiler: g++ cmake_flags: -DCMAKE_CXX_COMPILER=g++-11 - os: ubuntu-latest compiler: clang++ cmake_flags: -DCMAKE_CXX_COMPILER=clang++-14 - os: windows-latest compiler: msvc cmake_flags: -DCMAKE_CXX_COMPILER=cl - os: macos-latest compiler: clang++ cmake_flags: -DCMAKE_CXX_COMPILER=clang++
runs-on: ${{ matrix.os }}
steps: - uses: actions/checkout@v4
- name: Install dependencies (Ubuntu) if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -y cmake g++-11 clang-14 libboost-all-dev
- name: Install dependencies (macOS) if: matrix.os == 'macos-latest' run: | brew update brew install cmake boost
- name: Install dependencies (Windows) if: matrix.os == 'windows-latest' run: | choco install cmake boost-msvc-14.3
- name: Configure CMake run: cmake -B build ${{ matrix.cmake_flags }} -DCMAKE_BUILD_TYPE=Release
- name: Build run: cmake --build build --config Release
- name: Test run: | if [ "${{ runner.os }}" == "Windows" ]; then cd build && ctest -C Release --output-on-failure else cd build && ctest --output-on-failure fiNeste exemplo