Introdução ao CI/CD para C++ com GitHub Actions
\nO desenvolvimento moderno em C++ é impensável sem a automação dos processos de compilação e teste. CI/CD (Integração Contínua / Implantação Contínua) permite que as equipes identifiquem rapidamente erros, compilem automaticamente arquivos binários e implantem aplicações. GitHub Actions é uma ferramenta poderosa, integrada ao GitHub, que é ideal para projetos C++. Neste artigo, vamos detalhar como configurar um pipeline completo de CI/CD para C++: desde a compilação com CMake até a implantação de artefatos prontos.
\nAbordaremos exemplos reais de código, erros típicos e melhores práticas. Após a leitura, você será capaz de implementar CI/CD em seu próprio projeto C++.
\n\nFundamentos do GitHub Actions para C++
\nEstrutura do arquivo de workflow
\nO workflow no GitHub Actions é definido por um arquivo YAML no diretório .github/workflows/. Vejamos um exemplo básico para um projeto C++:
name: C++ CI/CD Pipeline\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n\n - name: Install dependencies\n run: |\n sudo apt-get update\n sudo apt-get install -y cmake g++ libboost-all-dev\n\n - name: Configure with CMake\n run: mkdir build && cd build && cmake ..\n\n - name: Build project\n run: cd build && make -j$(nproc)\n\n - name: Run tests\n run: cd build && ctest --output-on-failure\nEste workflow é acionado em pushes para main e develop, bem como na criação de pull requests. Ele instala dependências, configura a compilação via CMake, compila o projeto e executa os testes.
Escolha do sistema operacional e compilador
\nO GitHub Actions suporta Linux (ubuntu), macOS e Windows. Para projetos multiplataforma, você pode usar uma matriz de compilações:
\njobs:\n build:\n strategy:\n matrix:\n os: [ubuntu-latest, macos-latest, windows-latest]\n compiler: [g++, clang++]\n runs-on: ${{ matrix.os }}\n\n steps:\n - name: Set compiler\n run: |\n if [ "${{ matrix.os }}" == "windows-latest" ]; then\n echo "CXX=cl.exe" >> $GITHUB_ENV\n else\n echo "CXX=${{ matrix.compiler }}" >> $GITHUB_ENV\n fi\n shell: bash\nIsso permite verificar a compatibilidade do código com diferentes compiladores e sistemas operacionais.
\n\nConfiguração avançada: teste, cache e artefatos
\nCache de dependências
\nCada compilação no GitHub Actions começa com um ambiente limpo. Para acelerar o processo, armazene em cache os pacotes e bibliotecas baixados:
\n- name: Cache CMake build directory\n uses: actions/cache@v3\n with:\n path: build\n key: ${{ runner.os }}-cmake-${{ hashFiles('**/CMakeLists.txt') }}\n restore-keys: |\n ${{ runner.os }}-cmake-\n\n- name: Configure CMake\n run: cmake -B build -S . -DCMAKE_BUILD_TYPE=Release\nO cache é restaurado se os arquivos CMakeLists.txt não forem alterados, economizando tempo em compilações repetidas.
\n\nExecução de testes unitários com Google Test
\nPara C++, o Google Test é frequentemente usado. Vamos adicionar uma etapa de teste com geração de relatório no formato JUnit:
\n- name: Build and run tests\n run: |\n cmake --build build --target all_tests\n cd build && ctest --output-junit test-results.xml\n\n- name: Upload test results\n if: always()\n uses: actions/upload-artifact@v4\n with:\n name: test-results-${{ runner.os }}\n path: build/test-results.xml\nA flag if: always() garante o upload do relatório mesmo se os testes falharem.
Criação e publicação de artefatos
\nApós uma compilação bem-sucedida, você pode salvar os arquivos binários:
\n- name: Build release binary\n run: cmake --build build --config Release\n\n- name: Upload build artifacts\n uses: ac