CI/CD para proyectos C++: configuración de GitHub Actions
El desarrollo moderno en C++ requiere no solo escribir código de calidad, sino también configurar procesos de compilación, prueba e implementación. CI/CD (Integración Continua / Despliegue Continuo) es una práctica que permite automatizar estos procesos, reduciendo el tiempo entre la escritura del código y su entrega a los usuarios. En este artículo, veremos cómo configurar CI/CD para proyectos C++ usando GitHub Actions, una herramienta potente y gratuita integrada en GitHub.
GitHub Actions permite crear flujos de trabajo (workflows) automáticos que se ejecutan ante ciertos eventos: push al repositorio, creación de pull request, lanzamiento, entre otros. Para proyectos C++, esto es especialmente útil, ya que permite garantizar que el código se compile en diferentes plataformas y no contenga regresiones.
Fundamentos de GitHub Actions para C++
GitHub Actions utiliza archivos YAML para describir los workflows. Cada workflow consta de uno o varios jobs que se ejecutan en máquinas virtuales (runners). Para proyectos C++, normalmente se usan runners de Ubuntu, Windows y macOS. Veamos la estructura básica de un archivo 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 se ejecuta al hacer push a las ramas main y develop, y también al crear un pull request hacia main. Instala las dependencias (CMake, g++, Boost), configura el proyecto, lo compila y ejecuta las pruebas.
Compilación multiplataforma de proyectos C++
Una de las principales ventajas de CI/CD para C++ es la posibilidad de verificar automáticamente la compilación en múltiples plataformas. Esto es crítico, ya que el código C++ puede comportarse de manera diferente en distintos sistemas operativos y compiladores. GitHub Actions permite organizar fácilmente una matriz de compilación.
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 fiEn este ejemplo