CI/CD für C++-Projekte: GitHub Actions Fortgeschrittene Stufe

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Fortgeschrittenes CI/CD für C++-Projekte mit GitHub Actions



Wenn die einfache Pipeline „gebaut – Tests ausgeführt – deployed“ nicht mehr ausreicht, ist es Zeit für fortgeschrittene Techniken. In diesem Artikel betrachten wir, wie man GitHub Actions für C++-Projekte auf professionellem Niveau konfiguriert: Abhängigkeits-Caching, Build-Matrix für verschiedene Compiler, statische Code-Analyse, Artefakte und intelligente Trigger. Alle Beispiele sind in C++ mit CMake gegeben.



1. Abhängigkeits-Caching und Build-Beschleunigung



Jeder Workflow-Start beginnt mit einer sauberen virtuellen Maschine. Ohne Caching würden Sie jedes Mal dieselbe Bibliothek (z. B. Boost oder Google Test) herunterladen und bauen. Die Lösung: Nutzen Sie das integrierte Caching von GitHub Actions.



name: CI für C++ (fortgeschritten)on: [push, pull_request]

jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4

- name: Abhängigkeits-Caching uses: actions/cache@v3 with: path: | ~/.cache build/_deps key: ${{ runner.os }}-c++-${{ hashFiles('CMakeLists.txt', '**/*.cmake') }} restore-keys: | ${{ runner.os }}-c++-

- name: Systemabhängigkeiten installieren run: sudo apt-get update && sudo apt-get install -y libboost-all-dev

- name: Build run: | cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j$(nproc)


Der Schlüssel key wird basierend auf dem Hash der CMakeLists.txt gebildet – bei Änderung der Abhängigkeitsliste wird der Cache automatisch ungültig. Der Parameter restore-keys ermöglicht die teilweise Wiederherstellung des Caches, falls der genaue Schlüssel nicht gefunden wird.



2. Build-Matrix: Mehrere Compiler und Plattformen



Bei der Entwicklung einer plattformübergreifenden C++-Anwendung ist es wichtig, den Build mit verschiedenen Compilern zu überprüfen. GitHub Actions unterstützt eine Matrix-Strategie (matrix strategy).



jobs:  build:    strategy:      matrix:        os: [ubuntu-latest, windows-latest, macos-latest]        compiler: [gcc, clang, msvc]        exclude:          - os: ubuntu-latest            compiler: msvc          - os: windows-latest            compiler: clang          - os: macos-latest            compiler: msvc

runs-on: ${{ matrix.os }}

steps: - uses: actions/checkout@v4

- name: Compiler einrichten (Linux) if: runner.os == 'Linux' run: | if [ "${{ matrix.compiler }}" == "gcc" ]; then echo "CC=gcc" >> $GITHUB_ENV echo "CXX=g++" >> $GITHUB_ENV elif [ "${{ matrix.compiler }}" == "clang" ]; then echo "CC=clang" >> $GITHUB_ENV echo "CXX=clang++" >> $GITHUB_ENV fi

- name: Build mit CMake run: | cmake -B build -DCMAKE_BUILD_TYPE=Debug cmake --build build


Die Matrix erzeugt automatisch 6 Aufgaben (3 Betriebssysteme × 2 Compiler nach Ausschluss ungültiger Kombinationen). Dies ermöglicht es, Probleme, die für einen bestimmten Compiler oder eine bestimmte Plattform spezifisch sind, schnell zu erkennen.



3. Statische Analyse und Linter



Die Qualität von C++-Code ist entscheidend. Integrieren Sie statische Analyse mit Clang-Tidy, Cppcheck oder SonarCloud in die Pipeline. Betrachten wir ein Beispiel mit Clang-Tidy.



jobs:  static-analysis:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4

- name: Tools installieren run: | sudo apt-get install -y clang-tidy cppcheck pip install compiledb

- name: compile_commands.json generieren run: | cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON compiledb -o build/compile_commands.json make -C build

- name: Clang-Tidy ausführen run: | find . -name '*.cpp' -o -name '*.hpp' | xargs clang-tidy -p build --checks='*,-modernize-use

Blogs

Buchempfehlungen