CI/CD pour projets C++ : GitHub Actions de A à Z

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction au CI/CD pour C++ avec GitHub Actions

\n

Le 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.

\n

Nous 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\n

Bases de GitHub Actions pour C++

\n

Structure du fichier workflow

\n

Un 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++ :

\n
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
\n

Ce 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.

\n\n

Choix du système d'exploitation et du compilateur

\n

GitHub Actions prend en charge Linux (ubuntu), macOS et Windows. Pour les projets multiplateformes, vous pouvez utiliser une matrice de compilation :

\n
jobs:\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
\n

Cela permet de vérifier la compatibilité du code avec différents compilateurs et systèmes d'exploitation.

\n\n

Configuration avancée : tests, mise en cache et artefacts

\n

Mise en cache des dépendances

\n

Chaque 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
\n

Le 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\n

Exécution des tests unitaires avec Google Test

\n

Pour 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
\n

Le drapeau if: always() garantit le téléchargement du rapport même en cas d'échec des tests.

\n\n

Création et publication des artefacts

\n

Aprè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                

Blogs

Book Recommendations