CI/CD Avançado para projetos C++ no GitHub Actions
Quando um pipeline simples de "compilar - executar testes - implantar" já não é suficiente, chega a hora de técnicas avançadas. Neste artigo, veremos como configurar o GitHub Actions para projetos C++ em nível profissional: cache de dependências, matriz de builds para diferentes compiladores, análise estática de código, artefatos e gatilhos inteligentes. Todos os exemplos são em C++ usando CMake.
1. Cache de dependências e aceleração da compilação
Cada execução do workflow começa com uma máquina virtual limpa. Sem cache, você baixará e compilará a mesma biblioteca (por exemplo, Boost ou Google Test) toda vez. A solução é usar o cache integrado do GitHub Actions.
name: CI para C++ (avançado)on: [push, pull_request]
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Cache de dependências uses: actions/cache@v3 with: path: | ~/.cache build/_deps key: ${{ runner.os }}-c++-${{ hashFiles('CMakeLists.txt', '**/*.cmake') }} restore-keys: | ${{ runner.os }}-c++-
- name: Instalação de dependências do sistema run: sudo apt-get update && sudo apt-get install -y libboost-all-dev
- name: Compilação run: | cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j$(nproc)A chave key é formada com base no hash do CMakeLists.txt — quando a lista de dependências muda, o cache é invalidado automaticamente. O parâmetro restore-keys permite restaurar parcialmente o cache se a chave exata não for encontrada.
2. Matriz de builds: múltiplos compiladores e plataformas
Ao desenvolver uma aplicação C++ multiplataforma, é importante verificar a compilação com diferentes compiladores. O GitHub Actions suporta a estratégia de matriz (matrix strategy).
jobs: build: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] compiler: [gcc, clang, msvc] exclude: - os: ubuntu-latest compiler: msvc - os: windows-latest compiler: clang - os: macos-latest compiler: msvc
runs-on: ${{ matrix.os }}
steps: - uses: actions/checkout@v4
- name: Configuração do compilador (Linux) if: runner.os == 'Linux' run: | if [ "${{ matrix.compiler }}" == "gcc" ]; then echo "CC=gcc" >> $GITHUB_ENV echo "CXX=g++" >> $GITHUB_ENV elif [ "${{ matrix.compiler }}" == "clang" ]; then echo "CC=clang" >> $GITHUB_ENV echo "CXX=clang++" >> $GITHUB_ENV fi
- name: Compilação com CMake run: | cmake -B build -DCMAKE_BUILD_TYPE=Debug cmake --build buildA matriz gera automaticamente 6 tarefas (3 SOs × 2 compiladores após excluir combinações inválidas). Isso permite detectar rapidamente problemas específicos de um compilador ou plataforma.
3. Análise estática e linters
A qualidade do código C++ é crítica. Incorpore análise estática no pipeline usando Clang-Tidy, Cppcheck ou SonarCloud. Vejamos um exemplo com Clang-Tidy.
jobs: static-analysis: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Instalação de ferramentas run: | sudo apt-get install -y clang-tidy cppcheck pip install compiledb
- name: Geração de compile_commands.json run: | cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON compiledb -o build/compile_commands.json make -C build
- name: Execução do Clang-Tidy run: | find . -name '*.cpp' -o -name '*.hpp' | xargs clang-tidy -p build --checks='*,-modernize-use