Introducción a CI/CD para C++ con GitHub Actions
\nEl desarrollo moderno en C++ es impensable sin la automatización de los procesos de compilación y prueba. CI/CD (Integración Continua / Despliegue Continuo) permite a los equipos detectar errores rápidamente, compilar archivos binarios automáticamente e implementar aplicaciones. GitHub Actions es una herramienta potente, integrada en GitHub, que es ideal para proyectos C++. En este artículo, analizaremos cómo configurar un pipeline completo de CI/CD para C++: desde la compilación con CMake hasta la implementación de artefactos listos.
\nVeremos ejemplos de código reales, errores típicos y mejores prácticas. Después de leerlo, podrá implementar CI/CD en su proyecto C++ de forma independiente.
\n\nFundamentos de GitHub Actions para C++
\nEstructura del archivo de workflow
\nUn workflow en GitHub Actions se define mediante un archivo YAML en el directorio .github/workflows/. Veamos un ejemplo básico para un proyecto 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 se ejecuta al hacer push a main y develop, así como al crear un pull request. Instala las dependencias, configura la compilación con CMake, compila el proyecto y ejecuta las pruebas.
Selección del sistema operativo y compilador
\nGitHub Actions admite Linux (ubuntu), macOS y Windows. Para proyectos multiplataforma, se puede utilizar una matriz de compilaciones:
\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\nEsto permite verificar la compatibilidad del código con diferentes compiladores y sistemas operativos.
\n\nConfiguración avanzada: pruebas, almacenamiento en caché y artefactos
\nAlmacenamiento en caché de dependencias
\nCada compilación en GitHub Actions comienza con un entorno limpio. Para acelerar el proceso, almacene en caché los paquetes y bibliotecas descargados:
\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\nLa caché se restaura si los archivos CMakeLists.txt no han cambiado, lo que ahorra tiempo en compilaciones repetidas.
\n\nEjecución de pruebas unitarias con Google Test
\nPara C++ se usa a menudo Google Test. Agreguemos una etapa de prueba con generación de informe en 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\nLa bandera if: always() garantiza la carga del informe incluso si fallan las pruebas.
Creación y publicación de artefactos
\nDespués de una compilación exitosa, se pueden guardar los archivos binarios:
\n- name: Build release binary\n run: cmake --build build --config Release\n\n- name: Upload build artifacts\n uses: ac