Introduction au CI/CD pour C++ avec GitHub Actions
\nLe développement moderne en C++ est impensable sans l'automatisation des processus de compilation et de test. Le CI/CD (Continuous Integration / Continuous Deployment) permet aux équipes de détecter rapidement les erreurs, de compiler automatiquement les fichiers binaires et de déployer les applications. GitHub Actions est un outil puissant intégré à GitHub, parfaitement adapté aux projets C++. Dans cet article, nous allons voir comment configurer un pipeline CI/CD complet pour C++ : de la compilation avec CMake au déploiement des artefacts finis.
\nNous examinerons des exemples de code concrets, les erreurs typiques et les meilleures pratiques. Après cette lecture, vous serez en mesure d'intégrer vous-même le CI/CD dans votre projet C++.
\n\nBases de GitHub Actions pour C++
\nStructure du fichier workflow
\nUn workflow dans GitHub Actions est défini par un fichier YAML dans le répertoire .github/workflows/. Voici un exemple de base pour un projet C++ :
name: Pipeline CI/CD C++\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 du dépôt\n uses: actions/checkout@v4\n\n - name: Installation des dépendances\n run: |\n sudo apt-get update\n sudo apt-get install -y cmake g++ libboost-all-dev\n\n - name: Configuration avec CMake\n run: mkdir build && cd build && cmake ..\n\n - name: Compilation du projet\n run: cd build && make -j$(nproc)\n\n - name: Exécution des tests\n run: cd build && ctest --output-on-failure\nCe workflow s'exécute lors des pushs sur main et develop, ainsi que lors de la création de pull requests. Il installe les dépendances, configure la compilation via CMake, compile le projet et exécute les tests.
Choix du système d'exploitation et du compilateur
\nGitHub Actions prend en charge Linux (ubuntu), macOS et Windows. Pour les projets multiplateformes, vous pouvez utiliser une matrice de compilation :
\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: Définir le compilateur\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\nCela permet de vérifier la compatibilité du code avec différents compilateurs et systèmes d'exploitation.
\n\nConfiguration avancée : tests, mise en cache et artefacts
\nMise en cache des dépendances
\nChaque compilation dans GitHub Actions démarre dans un environnement propre. Pour accélérer le processus, mettez en cache les paquets et bibliothèques téléchargés :
\n- name: Mise en cache du répertoire de compilation CMake\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: Configuration CMake\n run: cmake -B build -S . -DCMAKE_BUILD_TYPE=Release\nLe cache est restauré si les fichiers CMakeLists.txt n'ont pas changé, ce qui fait gagner du temps lors des compilations répétées.
\n\nExécution des tests unitaires avec Google Test
\nPour C++, on utilise souvent Google Test. Ajoutons une étape de test avec génération d'un rapport au format JUnit :
\n- name: Compilation et exécution des tests\n run: |\n cmake --build build --target all_tests\n cd build && ctest --output-junit test-results.xml\n\n- name: Téléchargement des résultats de test\n if: always()\n uses: actions/upload-artifact@v4\n with:\n name: test-results-${{ runner.os }}\n path: build/test-results.xml\nLe drapeau if: always() garantit le téléchargement du rapport même en cas d'échec des tests.
Création et publication des artefacts
\nAprès une compilation réussie, vous pouvez sauvegarder les fichiers binaires :
\n- name: Compilation du binaire de release\n run: cmake --build build --config Release\n\n- name: Téléchargement des artefacts de compilation\n uses: ac