Improvements on CI/CD #1153
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # ───────────────────────────────────────────────────────────────────────────── | |
| # CXXGraph – Comprehensive Build & Test Matrix | |
| # | |
| # Covers: | |
| # • Ubuntu 22.04 / 24.04 × GCC 12-14 × Clang 15-18 | |
| # • macOS 13 (x86-64) / macOS latest (arm64) × Apple Clang + Homebrew GCC | |
| # • Windows × MSVC 2022 × Clang-CL | |
| # • C++ standards: 17, 20 | |
| # • Build types: Release, Debug, RelWithDebInfo | |
| # ───────────────────────────────────────────────────────────────────────────── | |
| name: CMake Build & Test | |
| on: | |
| push: | |
| branches: [master] | |
| pull_request: | |
| branches: [master] | |
| permissions: | |
| contents: read | |
| # Cancel superseded runs on the same branch/PR to save CI minutes | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| # ───────────────────────────────────────────────────────────────────────────── | |
| # Global defaults | |
| # ───────────────────────────────────────────────────────────────────────────── | |
| env: | |
| CMAKE_GENERATOR: Ninja # fast, cross-platform | |
| CPM_SOURCE_CACHE: ~/.cache/cpm # persistent CPM download cache | |
| jobs: | |
| build-and-test: | |
| name: ${{ matrix.name }} | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 45 | |
| strategy: | |
| fail-fast: false # always collect the full failure picture | |
| matrix: | |
| include: | |
| # ╔══════════════════════════════════════╗ | |
| # ║ UBUNTU × GCC ║ | |
| # ╚══════════════════════════════════════╝ | |
| - name: "Ubuntu 22.04 · GCC 12 · C++17 · Release" | |
| os: ubuntu-22.04 | |
| cc: gcc-12 | |
| cxx: g++-12 | |
| build_type: Release | |
| cxx_std: 17 | |
| - name: "Ubuntu 22.04 · GCC 12 · C++17 · Debug" | |
| os: ubuntu-22.04 | |
| cc: gcc-12 | |
| cxx: g++-12 | |
| build_type: Debug | |
| cxx_std: 17 | |
| - name: "Ubuntu 22.04 · GCC 13 · C++17 · Release" | |
| os: ubuntu-22.04 | |
| cc: gcc-13 | |
| cxx: g++-13 | |
| build_type: Release | |
| cxx_std: 17 | |
| - name: "Ubuntu 22.04 · GCC 13 · C++20 · Release" | |
| os: ubuntu-22.04 | |
| cc: gcc-13 | |
| cxx: g++-13 | |
| build_type: Release | |
| cxx_std: 20 | |
| - name: "Ubuntu 24.04 · GCC 14 · C++17 · Release" | |
| os: ubuntu-24.04 | |
| cc: gcc-14 | |
| cxx: g++-14 | |
| build_type: Release | |
| cxx_std: 17 | |
| - name: "Ubuntu 24.04 · GCC 14 · C++17 · RelWithDebInfo" | |
| os: ubuntu-24.04 | |
| cc: gcc-14 | |
| cxx: g++-14 | |
| build_type: RelWithDebInfo | |
| cxx_std: 17 | |
| - name: "Ubuntu 24.04 · GCC 14 · C++20 · Release" | |
| os: ubuntu-24.04 | |
| cc: gcc-14 | |
| cxx: g++-14 | |
| build_type: Release | |
| cxx_std: 20 | |
| # ╔══════════════════════════════════════╗ | |
| # ║ UBUNTU × CLANG ║ | |
| # ╚══════════════════════════════════════╝ | |
| - name: "Ubuntu 22.04 · Clang 15 · C++17 · Release" | |
| os: ubuntu-22.04 | |
| cc: clang-15 | |
| cxx: clang++-15 | |
| build_type: Release | |
| cxx_std: 17 | |
| - name: "Ubuntu 22.04 · Clang 15 · C++17 · Debug" | |
| os: ubuntu-22.04 | |
| cc: clang-15 | |
| cxx: clang++-15 | |
| build_type: Debug | |
| cxx_std: 17 | |
| - name: "Ubuntu 24.04 · Clang 17 · C++17 · Release" | |
| os: ubuntu-24.04 | |
| cc: clang-17 | |
| cxx: clang++-17 | |
| build_type: Release | |
| cxx_std: 17 | |
| - name: "Ubuntu 24.04 · Clang 18 · C++17 · Release" | |
| os: ubuntu-24.04 | |
| cc: clang-18 | |
| cxx: clang++-18 | |
| build_type: Release | |
| cxx_std: 17 | |
| - name: "Ubuntu 24.04 · Clang 18 · C++20 · Release" | |
| os: ubuntu-24.04 | |
| cc: clang-18 | |
| cxx: clang++-18 | |
| build_type: Release | |
| cxx_std: 20 | |
| - name: "Ubuntu 24.04 · Clang 18 · C++20 · Debug" | |
| os: ubuntu-24.04 | |
| cc: clang-18 | |
| cxx: clang++-18 | |
| build_type: Debug | |
| cxx_std: 20 | |
| # ╔══════════════════════════════════════╗ | |
| # ║ macOS × Apple Clang ║ | |
| # ╚══════════════════════════════════════╝ | |
| - name: "macOS 13 (x86) · Apple Clang · C++17 · Release" | |
| os: macos-13 | |
| cc: clang | |
| cxx: clang++ | |
| build_type: Release | |
| cxx_std: 17 | |
| - name: "macOS latest (arm64) · Apple Clang · C++17 · Release" | |
| os: macos-latest | |
| cc: clang | |
| cxx: clang++ | |
| build_type: Release | |
| cxx_std: 17 | |
| - name: "macOS latest (arm64) · Apple Clang · C++20 · Release" | |
| os: macos-latest | |
| cc: clang | |
| cxx: clang++ | |
| build_type: Release | |
| cxx_std: 20 | |
| - name: "macOS latest (arm64) · Apple Clang · C++17 · Debug" | |
| os: macos-latest | |
| cc: clang | |
| cxx: clang++ | |
| build_type: Debug | |
| cxx_std: 17 | |
| # ╔══════════════════════════════════════╗ | |
| # ║ WINDOWS × MSVC 2022 ║ | |
| # ╚══════════════════════════════════════╝ | |
| - name: "Windows · MSVC 2022 · C++17 · Release" | |
| os: windows-latest | |
| cc: cl | |
| cxx: cl | |
| build_type: Release | |
| cxx_std: 17 | |
| msvc: true | |
| - name: "Windows · MSVC 2022 · C++17 · Debug" | |
| os: windows-latest | |
| cc: cl | |
| cxx: cl | |
| build_type: Debug | |
| cxx_std: 17 | |
| msvc: true | |
| - name: "Windows · MSVC 2022 · C++20 · Release" | |
| os: windows-latest | |
| cc: cl | |
| cxx: cl | |
| build_type: Release | |
| cxx_std: 20 | |
| msvc: true | |
| # ╔══════════════════════════════════════╗ | |
| # ║ WINDOWS × Clang-CL ║ | |
| # ╚══════════════════════════════════════╝ | |
| - name: "Windows · Clang-CL · C++17 · Release" | |
| os: windows-latest | |
| cc: clang-cl | |
| cxx: clang-cl | |
| build_type: Release | |
| cxx_std: 17 | |
| clang_cl: true | |
| # ───────────────────────────────────────────────────────────────────── | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 1 # shallow clone is enough for builds | |
| # ── Compiler installation (Linux only) ──────────────────────────── | |
| - name: Install GCC (Ubuntu) | |
| if: runner.os == 'Linux' && startsWith(matrix.cc, 'gcc') | |
| run: | | |
| sudo apt-get update -q | |
| sudo apt-get install -y --no-install-recommends \ | |
| ${{ matrix.cc }} ${{ matrix.cxx }} | |
| - name: Install Clang (Ubuntu) | |
| if: runner.os == 'Linux' && startsWith(matrix.cc, 'clang') | |
| run: | | |
| sudo apt-get update -q | |
| # Use the official LLVM apt repository for recent Clang versions | |
| wget -qO- https://apt.llvm.org/llvm.sh | \ | |
| sudo bash -s -- $(echo '${{ matrix.cc }}' | grep -oP '\d+') all | |
| sudo apt-get install -y --no-install-recommends \ | |
| ${{ matrix.cc }} ${{ matrix.cxx }} | |
| # ── Ninja generator (all platforms) ────────────────────────────── | |
| - name: Install Ninja | |
| uses: seanmiddleditch/gha-setup-ninja@v5 | |
| # ── ccache for incremental rebuilds ─────────────────────────────── | |
| - name: Set up ccache | |
| uses: hendrikmuhs/ccache-action@v1.2 | |
| with: | |
| key: ${{ matrix.name }}-${{ github.sha }} | |
| restore-keys: | | |
| ${{ matrix.name }}- | |
| max-size: 500M | |
| # ── CPM dependency cache ─────────────────────────────────────────── | |
| - name: Cache CPM packages | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/cpm | |
| key: cpm-${{ runner.os }}-${{ hashFiles('**/CMakeLists.txt') }} | |
| restore-keys: cpm-${{ runner.os }}- | |
| # ── Configure (Unix / macOS) ─────────────────────────────────────── | |
| - name: Configure CMake (Unix) | |
| if: runner.os != 'Windows' | |
| env: | |
| CC: ${{ matrix.cc }} | |
| CXX: ${{ matrix.cxx }} | |
| run: | | |
| cmake -B build \ | |
| -G Ninja \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ | |
| -DCMAKE_CXX_STANDARD=${{ matrix.cxx_std }} \ | |
| -DCMAKE_CXX_STANDARD_REQUIRED=ON \ | |
| -DCMAKE_CXX_EXTENSIONS=OFF \ | |
| -DTEST=ON \ | |
| -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ | |
| -DCMAKE_C_COMPILER_LAUNCHER=ccache \ | |
| -DCMAKE_EXPORT_COMPILE_COMMANDS=ON | |
| # ── Configure (Windows / MSVC) ──────────────────────────────────── | |
| - name: Configure CMake (Windows MSVC) | |
| if: matrix.msvc == true | |
| run: | | |
| cmake -B build ` | |
| -G "Visual Studio 17 2022" -A x64 ` | |
| -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} ` | |
| -DCMAKE_CXX_STANDARD=${{ matrix.cxx_std }} ` | |
| -DCMAKE_CXX_STANDARD_REQUIRED=ON ` | |
| -DCMAKE_CXX_EXTENSIONS=OFF ` | |
| -DTEST=ON ` | |
| -Dgtest_disable_pthreads=ON | |
| # ── Configure (Windows / Clang-CL) ─────────────────────────────── | |
| - name: Configure CMake (Windows Clang-CL) | |
| if: matrix.clang_cl == true | |
| run: | | |
| cmake -B build ` | |
| -G "Visual Studio 17 2022" -A x64 -T ClangCL ` | |
| -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} ` | |
| -DCMAKE_CXX_STANDARD=${{ matrix.cxx_std }} ` | |
| -DCMAKE_CXX_STANDARD_REQUIRED=ON ` | |
| -DCMAKE_CXX_EXTENSIONS=OFF ` | |
| -DTEST=ON ` | |
| -Dgtest_disable_pthreads=ON | |
| # ── Build ───────────────────────────────────────────────────────── | |
| - name: Build | |
| run: cmake --build build --config ${{ matrix.build_type }} --parallel | |
| # ── Test ────────────────────────────────────────────────────────── | |
| - name: Test | |
| working-directory: build | |
| run: | | |
| ctest \ | |
| --build-config ${{ matrix.build_type }} \ | |
| --output-on-failure \ | |
| --parallel 4 \ | |
| --timeout 120 \ | |
| -T Test | |
| shell: bash | |
| # ── Artifacts: always upload test results XML ────────────────────── | |
| - name: Upload test results | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: test-results-${{ matrix.name }} | |
| path: build/Testing/**/*.xml | |
| if-no-files-found: ignore | |
| retention-days: 14 |