fix: Optimize CI/CD workflows for GoogleTest integration #65
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
| name: Build and Test ChainedDecos | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: [ main, develop ] | |
| pull_request: | |
| branches: [ main, develop ] | |
| env: | |
| CI: true | |
| jobs: | |
| build-and-test: | |
| name: Build and Test (${{ matrix.os }}, ${{ matrix.compiler }}, ${{ matrix.build_type }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| # Ubuntu with GCC | |
| - os: ubuntu-22.04 | |
| compiler: gcc | |
| version: 11 | |
| build_type: Release | |
| generator: "Unix Makefiles" | |
| cmake_options: "" | |
| # Ubuntu with Clang | |
| - os: ubuntu-22.04 | |
| compiler: clang | |
| version: 14 | |
| build_type: Release | |
| generator: "Unix Makefiles" | |
| cmake_options: "" | |
| # Windows with MSVC | |
| - os: windows-2022 | |
| compiler: msvc | |
| version: 2022 | |
| build_type: Release | |
| generator: "Visual Studio 17 2022" | |
| cmake_options: "" | |
| # macOS with Clang | |
| - os: macos-12 | |
| compiler: clang | |
| version: apple | |
| build_type: Release | |
| generator: "Unix Makefiles" | |
| cmake_options: "" | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| fetch-depth: 0 | |
| - name: Set up build environment | |
| shell: bash | |
| id: build-env | |
| run: | | |
| echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT" | |
| echo "install-prefix=${{ github.workspace }}/install" >> "$GITHUB_OUTPUT" | |
| # ---------------- Linux (Ubuntu) setup ---------------- | |
| - name: Install dependencies (Ubuntu) | |
| if: startsWith(matrix.os, 'ubuntu') | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y build-essential cmake ninja-build \ | |
| libgl1-mesa-dev libx11-dev libxrandr-dev libxinerama-dev \ | |
| libxcursor-dev libxi-dev libasound2-dev libglu1-mesa-dev \ | |
| libwayland-dev libxkbcommon-dev libegl1-mesa-dev \ | |
| pkg-config ccache | |
| - name: Set up GCC (Ubuntu) | |
| if: matrix.compiler == 'gcc' && startsWith(matrix.os, 'ubuntu') | |
| run: | | |
| echo "CC=gcc-${{ matrix.version }}" >> "$GITHUB_ENV" | |
| echo "CXX=g++-${{ matrix.version }}" >> "$GITHUB_ENV" | |
| - name: Set up Clang (Ubuntu) | |
| if: matrix.compiler == 'clang' && startsWith(matrix.os, 'ubuntu') | |
| run: | | |
| echo "CC=clang-${{ matrix.version }}" >> "$GITHUB_ENV" | |
| echo "CXX=clang++-${{ matrix.version }}" >> "$GITHUB_ENV" | |
| # ---------------- Windows setup ---------------- | |
| - name: Set up MSVC (Windows) | |
| if: matrix.os == 'windows-2022' | |
| uses: microsoft/setup-msbuild@v1.1 | |
| with: | |
| vs-version: '[17.0,18.0)' | |
| # ---------------- macOS setup ---------------- | |
| - name: Install dependencies (macOS) | |
| if: startsWith(matrix.os, 'macos') | |
| run: | | |
| brew update | |
| brew install cmake ninja ccache | |
| # ---------------- Common build steps ---------------- | |
| - name: Clear CMake cache | |
| run: | | |
| rm -rf "${{ steps.build-env.outputs.build-output-dir }}" | |
| rm -rf ".deps" | |
| rm -f CMakeCache.txt cmake_install.cmake CMakeFiles/ | |
| - name: Create build directory | |
| run: | | |
| mkdir -p "${{ steps.build-env.outputs.build-output-dir }}" | |
| mkdir -p "${{ steps.build-env.outputs.install-prefix }}" | |
| - name: Configure CMake | |
| run: | | |
| cmake -B "${{ steps.build-env.outputs.build-output-dir }}" \ | |
| -G "${{ matrix.generator }}" \ | |
| -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ | |
| -DCMAKE_INSTALL_PREFIX="${{ steps.build-env.outputs.install-prefix }}" \ | |
| -DCMAKE_C_COMPILER_LAUNCHER=ccache \ | |
| -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ | |
| -DBUILD_TESTS=ON \ | |
| -DBUILD_BENCHMARKS=ON \ | |
| -DENABLE_WARNINGS=ON \ | |
| -DENABLE_OPTIMIZATIONS=ON \ | |
| -DENABLE_DEV_TOOLS=ON \ | |
| -DENABLE_DEBUG_INFO=ON \ | |
| ${{ matrix.cmake_options }} \ | |
| -S "${{ github.workspace }}" | |
| - name: Build project | |
| run: | | |
| cmake --build "${{ steps.build-env.outputs.build-output-dir }}" \ | |
| --config ${{ matrix.build_type }} \ | |
| --target ChainedDecos ChainedDecosMapEditor ChainedDecosTests \ | |
| --parallel $(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) | |
| - name: Install project | |
| run: | | |
| cmake --install "${{ steps.build-env.outputs.build-output-dir }}" \ | |
| --config ${{ matrix.build_type }} | |
| - name: Run basic smoke test | |
| run: | | |
| if [ -f "${{ steps.build-env.outputs.install-prefix }}/bin/ChainedDecos" ]; then | |
| echo "✅ Main executable found" | |
| else | |
| echo "❌ Main executable not found" | |
| exit 1 | |
| fi | |
| if [ -f "${{ steps.build-env.outputs.install-prefix }}/bin/ChainedDecosMapEditor" ]; then | |
| echo "✅ Map editor executable found" | |
| else | |
| echo "❌ Map editor executable not found" | |
| exit 1 | |
| fi | |
| - name: Run tests (if available) | |
| run: | | |
| # Check if tests directory exists and has test executables | |
| if [ -d "${{ steps.build-env.outputs.build-output-dir }}/tests" ]; then | |
| echo "🔍 Tests directory found, looking for test executables..." | |
| find "${{ steps.build-env.outputs.build-output-dir }}/tests" -type f -executable -name "*test*" | head -5 | |
| else | |
| echo "ℹ️ No tests directory found - skipping tests" | |
| fi | |
| # Run basic executable validation | |
| echo "🔍 Validating executables..." | |
| if [ "${{ matrix.os }}" = "windows-2022" ]; then | |
| "${{ steps.build-env.outputs.install-prefix }}/bin/ChainedDecos.exe" --help 2>&1 | head -10 || echo "ℹ️ Help not available" | |
| else | |
| "${{ steps.build-env.outputs.install-prefix }}/bin/ChainedDecos" --help 2>&1 | head -10 || echo "ℹ️ Help not available" | |
| fi | |
| - name: Upload build artifacts | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: build-artifacts-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.build_type }} | |
| path: | | |
| ${{ steps.build-env.outputs.install-prefix }}/bin/ | |
| ${{ steps.build-env.outputs.build-output-dir }}/compile_commands.json | |
| retention-days: 7 | |
| - name: Upload logs on failure | |
| uses: actions/upload-artifact@v4 | |
| if: failure() | |
| with: | |
| name: build-logs-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.build_type }} | |
| path: | | |
| ${{ steps.build-env.outputs.build-output-dir }}/CMakeFiles/*.log | |
| ${{ steps.build-env.outputs.build-output-dir }}/**/*.log | |
| retention-days: 3 |