name: Build on: push: branches: [main] paths: - '.config/dotnet-tools.json' - 'Projects/**' - 'Directory.Build.props' - 'global.json' - 'version.json' - '*.slnx' pull_request: branches: [main] paths: - '.config/dotnet-tools.json' - 'Projects/**' - 'Directory.Build.props' - 'global.json' - 'version.json' - '*.slnx' jobs: build-macos: runs-on: ${{ matrix.os }} # A hung run otherwise bills the full 360-minute default before GitHub kills it. timeout-minutes: 30 name: Build (${{ matrix.name }}) strategy: fail-fast: false matrix: include: - os: macos-15 name: MacOS 15 - os: macos-26 name: MacOS 26 steps: - uses: actions/checkout@v7 with: fetch-depth: 0 # avoid shallow clone so nbgv can do its work. - name: Install .NET uses: actions/setup-dotnet@v6 with: global-json-file: global.json - name: Install Prerequisites run: | brew update brew install icu4c libdeflate zstd argon2 - name: Set Library Path run: echo "DYLD_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_LIBRARY_PATH" >> $GITHUB_ENV - name: Build run: dotnet run --project Projects/BuildTool -- --config Release --skip-prereqs - name: Migration Changes run: git diff --exit-code ./**/Migrations/*.v*.json - name: Test # blame-hang kills a stuck test host after 10 minutes and reports the in-flight # tests plus a process dump instead of hanging until the job timeout. run: | dotnet test --logger trx --results-directory ./TestResults --blame-hang --blame-hang-timeout 10m --blame-hang-dump-type full if [ -z "$(find ./TestResults -name '*.trx' 2>/dev/null)" ]; then echo "::error::No test result files were produced - no test projects ran. Failing to avoid masking failures." exit 1 fi - name: Upload test results on failure if: failure() uses: actions/upload-artifact@v7 with: name: TestResults-${{ matrix.name }} path: ./TestResults if-no-files-found: ignore build-linux: runs-on: ubuntu-latest # A hung run otherwise bills the full 360-minute default before GitHub kills it. timeout-minutes: 30 container: image: ${{ matrix.container }} options: --security-opt seccomp=unconfined name: Build (${{ matrix.name }}) strategy: fail-fast: false matrix: include: - container: ubuntu:26.04 name: Ubuntu 26 packageManager: apt - container: ubuntu:noble name: Ubuntu 24 packageManager: apt - container: ubuntu:jammy name: Ubuntu 22 packageManager: apt - container: debian:trixie name: Debian 13 packageManager: apt - container: debian:bookworm name: Debian 12 packageManager: apt - container: fedora:44 name: Fedora 44 packageManager: dnf - container: quay.io/centos/centos:stream9 name: CentOS 9 Stream packageManager: dnf epel: true - container: quay.io/centos/centos:stream10 name: CentOS 10 Stream packageManager: dnf epel: true - container: almalinux:10 name: AlmaLinux 10 packageManager: dnf epel: true steps: # Enable CRB before EPEL, per the EPEL quickstart. epel-next is not installed: # none of the prerequisites need it, EPEL 10 does not have it, and it is one more # mirrorlist to fetch. - name: Enable EPEL and CRB run: | dnf upgrade --refresh -y dnf install -y dnf-plugins-core dnf config-manager --set-enabled crb dnf install -y epel-release if: ${{ matrix.epel }} - name: Install Prerequisites using dnf run: dnf makecache --refresh && dnf install -y findutils libicu libdeflate-devel zstd libargon2-devel liburing-devel if: ${{ matrix.packageManager == 'dnf' }} - name: Install Prerequisites using apt run: apt-get update -y && apt-get install -y curl libicu-dev libdeflate-dev zstd libargon2-dev tzdata liburing-dev if: ${{ matrix.packageManager == 'apt' }} - uses: actions/checkout@v7 with: fetch-depth: 0 # avoid shallow clone so nbgv can do its work. - name: Install .NET uses: actions/setup-dotnet@v6 with: global-json-file: global.json - name: Build run: dotnet run --project Projects/BuildTool -- --config Release --skip-prereqs - name: Test # blame-hang kills a stuck test host after 10 minutes and reports the in-flight # tests plus a process dump instead of hanging until the job timeout. run: | dotnet test --logger trx --results-directory ./TestResults --blame-hang --blame-hang-timeout 10m --blame-hang-dump-type full if [ -z "$(find ./TestResults -name '*.trx' 2>/dev/null)" ]; then echo "::error::No test result files were produced - no test projects ran. Failing to avoid masking failures." exit 1 fi - name: Upload test results on failure if: failure() uses: actions/upload-artifact@v7 with: name: TestResults-${{ matrix.name }} path: ./TestResults if-no-files-found: ignore