CI/CD für C++-Projekte: Einrichtung von GitHub Actions
Moderne C++-Entwicklung erfordert nicht nur das Schreiben von qualitativ hochwertigem Code, sondern auch die Einrichtung von Prozessen für dessen Build, Test und Deployment. CI/CD (Continuous Integration / Continuous Deployment) ist eine Praxis, die es ermöglicht, diese Prozesse zu automatisieren und die Zeit zwischen dem Schreiben von Code und seiner Auslieferung an die Benutzer zu verkürzen. In diesem Artikel betrachten wir, wie man CI/CD für C++-Projekte mit GitHub Actions einrichtet – einem leistungsstarken und kostenlosen Tool, das in GitHub integriert ist.
GitHub Actions ermöglicht es, automatische Arbeitsabläufe (workflows) zu erstellen, die bei bestimmten Ereignissen ausgelöst werden: Push in das Repository, Erstellung eines Pull Request, Release und andere. Für C++-Projekte ist dies besonders nützlich, da es garantiert, dass der Code auf verschiedenen Plattformen gebaut wird und keine Regressionen enthält.
Grundlagen von GitHub Actions für C++
GitHub Actions verwendet YAML-Dateien zur Beschreibung von Workflows. Jeder Workflow besteht aus einem oder mehreren Jobs, die auf virtuellen Maschinen (runners) ausgeführt werden. Für C++-Projekte werden in der Regel Ubuntu-, Windows- und macOS-Runner verwendet. Betrachten wir die grundlegende Struktur einer Workflow-Datei.
name: C++ CI
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4
- name: Install dependencies run: | sudo apt-get update sudo apt-get install -y cmake g++ libboost-all-dev
- name: Configure CMake run: cmake -B build -DCMAKE_BUILD_TYPE=Release
- name: Build run: cmake --build build --config Release
- name: Test run: cd build && ctest --output-on-failureDieser Workflow wird bei einem Push in die Branches main und develop sowie bei der Erstellung eines Pull Request in main ausgelöst. Er installiert Abhängigkeiten (CMake, g++, Boost), konfiguriert das Projekt, baut es und führt die Tests aus.
Plattformübergreifender Build von C++-Projekten
Einer der Hauptvorteile von CI/CD für C++ ist die Möglichkeit, den Build automatisch auf mehreren Plattformen zu überprüfen. Dies ist entscheidend, da sich C++-Code auf verschiedenen Betriebssystemen und mit verschiedenen Compilern unterschiedlich verhalten kann. GitHub Actions ermöglicht es, eine Build-Matrix einfach zu organisieren.
jobs: build: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] compiler: [g++, clang++] include: - os: ubuntu-latest compiler: g++ cmake_flags: -DCMAKE_CXX_COMPILER=g++-11 - os: ubuntu-latest compiler: clang++ cmake_flags: -DCMAKE_CXX_COMPILER=clang++-14 - os: windows-latest compiler: msvc cmake_flags: -DCMAKE_CXX_COMPILER=cl - os: macos-latest compiler: clang++ cmake_flags: -DCMAKE_CXX_COMPILER=clang++
runs-on: ${{ matrix.os }}
steps: - uses: actions/checkout@v4
- name: Install dependencies (Ubuntu) if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -y cmake g++-11 clang-14 libboost-all-dev
- name: Install dependencies (macOS) if: matrix.os == 'macos-latest' run: | brew update brew install cmake boost
- name: Install dependencies (Windows) if: matrix.os == 'windows-latest' run: | choco install cmake boost-msvc-14.3
- name: Configure CMake run: cmake -B build ${{ matrix.cmake_flags }} -DCMAKE_BUILD_TYPE=Release
- name: Build run: cmake --build build --config Release
- name: Test run: | if [ "${{ runner.os }}" == "Windows" ]; then cd build && ctest -C Release --output-on-failure else cd build && ctest --output-on-failure fiIn diesem Beispiel