Einführung in CI/CD für C++ mit GitHub Actions
\nModerne C++-Entwicklung ist ohne Automatisierung von Build- und Testprozessen undenkbar. CI/CD (Continuous Integration / Continuous Deployment) ermöglicht Teams, Fehler schnell zu erkennen, Binärdateien automatisch zu erstellen und Anwendungen bereitzustellen. GitHub Actions ist ein leistungsstarkes, in GitHub integriertes Tool, das sich ideal für C++-Projekte eignet. In diesem Artikel werden wir erläutern, wie man eine vollständige CI/CD-Pipeline für C++ einrichtet: von der Kompilierung mit CMake bis zum Deployment fertiger Artefakte.
\nWir werden reale Codebeispiele, typische Fehler und bewährte Verfahren betrachten. Nach der Lektüre können Sie CI/CD eigenständig in Ihrem C++-Projekt implementieren.
\n\nGrundlagen von GitHub Actions für C++
\nStruktur der Workflow-Datei
\nEin Workflow in GitHub Actions wird durch eine YAML-Datei im Verzeichnis .github/workflows/ definiert. Betrachten wir ein grundlegendes Beispiel für ein C++-Projekt:
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\nDieser Workflow wird bei Pushs in main und develop sowie bei der Erstellung von Pull Requests ausgelöst. Er installiert Abhängigkeiten, konfiguriert den Build über CMake, kompiliert das Projekt und führt Tests aus.
Auswahl des Betriebssystems und Compilers
\nGitHub Actions unterstützt Linux (ubuntu), macOS und Windows. Für plattformübergreifende Projekte kann eine Build-Matrix verwendet werden:
\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\nDies ermöglicht die Überprüfung der Code-Kompatibilität mit verschiedenen Compilern und Betriebssystemen.
\n\nErweiterte Konfiguration: Testen, Caching und Artefakte
\nCaching von Abhängigkeiten
\nJeder Build in GitHub Actions beginnt mit einer sauberen Umgebung. Um den Prozess zu beschleunigen, cachen Sie heruntergeladene Pakete und Bibliotheken:
\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\nDer Cache wird wiederhergestellt, wenn sich die CMakeLists.txt-Dateien nicht geändert haben, was bei wiederholten Builds Zeit spart.
\n\nAusführen von Unit-Tests mit Google Test
\nFür C++ wird häufig Google Test verwendet. Fügen wir eine Testphase mit Generierung eines Berichts im JUnit-Format hinzu:
\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\nDas Flag if: always() stellt sicher, dass der Bericht auch bei Testfehlern hochgeladen wird.
Erstellung und Veröffentlichung von Artefakten
\nNach einem erfolgreichen Build können Binärdateien gespeichert werden:
\n- name: Build release binary\n run: cmake --build build --config Release\n\n- name: Upload build artifacts\n uses: ac