Need to swtch to new CI OS #623
Workflow file for this run
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: CI | |
| on: | |
| push: | |
| branches: | |
| - master | |
| pull_request: | |
| branches: | |
| - master | |
| workflow_dispatch: | |
| # allow this workflow to be triggered manually | |
| # Only allow for one job to run at a time, and cancel any jobs currently in progress. | |
| concurrency: | |
| group: gh-actions-${{ github.actor }}-${{ github.head_ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| setup: | |
| name: 'Load job configuration' | |
| runs-on: ubuntu-24.04 | |
| outputs: | |
| compilers: ${{ steps.load-config.outputs.compilers }} | |
| steps: | |
| - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 | |
| # This step checks if we want to only run tests on a specific platform or | |
| # if we want to skip CI entirely, then outputs the compilers to be used for | |
| # each job. | |
| - id: load-config | |
| uses: actions/github-script@9ac08808f993958e9de277fe43a64532a609130e | |
| with: | |
| script: | | |
| const base_compiler_config = require("./.github/workflows/compilers.json"); | |
| const compilers = {"windows": [], "macos": [], "ubuntu": []}; | |
| const {owner, repo} = context.repo; | |
| let commit_sha = context.sha; | |
| if (context.eventName == "pull_request") | |
| { | |
| commit_sha = context.payload.pull_request.head.sha; | |
| } | |
| const commit = await github.rest.git.getCommit({ | |
| owner, | |
| repo, | |
| commit_sha | |
| }); | |
| const head_commit_message = commit.data.message; | |
| if (head_commit_message.startsWith("[windows-only]")) | |
| { | |
| compilers.windows = base_compiler_config; | |
| } | |
| else if (head_commit_message.startsWith("[macos-only]")) | |
| { | |
| compilers.macos = base_compiler_config; | |
| } | |
| else if (head_commit_message.startsWith("[ubuntu-only]")) | |
| { | |
| compilers.ubuntu = base_compiler_config; | |
| } | |
| else if (!head_commit_message.startsWith("[skip-ci]")) | |
| { | |
| compilers.windows = base_compiler_config; | |
| compilers.macos = base_compiler_config; | |
| compilers.ubuntu = base_compiler_config; | |
| } | |
| core.setOutput("compilers", JSON.stringify(compilers)); | |
| macos: | |
| name: '[macos] x86_64/${{ matrix.dc }}' | |
| runs-on: macos-15-intel | |
| timeout-minutes: 60 | |
| needs: setup | |
| # Only run if the setup phase explicitly defined compilers to be used | |
| if: ${{ fromJSON(needs.setup.outputs.compilers).macos != '' && fromJSON(needs.setup.outputs.compilers).macos != '[]' }} | |
| # Beta / master versions of any compiler are allowed to fail | |
| continue-on-error: ${{ contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') }} | |
| env: | |
| ARCH: x86_64 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| dc: ${{ fromJSON(needs.setup.outputs.compilers).macos }} | |
| steps: | |
| - name: Checkout repo | |
| uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 | |
| - name: Setup D compiler | |
| uses: dlang-community/setup-dlang@d7d85fcde7c4cd5f9a6618fce1bccc316e1e910b | |
| with: | |
| compiler: ${{ matrix.dc }} | |
| - name: Verify toolchain | |
| shell: bash | |
| env: | |
| DC_NAME: ${{ matrix.dc }} | |
| run: | | |
| set -euo pipefail | |
| echo "matrix.dc = ${DC_NAME}" | |
| # dub must exist for all jobs | |
| if ! command -v dub >/dev/null 2>&1; then | |
| echo "ERROR: dub not found on PATH" | |
| exit 1 | |
| fi | |
| which dub | |
| file "$(which dub)" || true | |
| dub --version | |
| if [[ "${DC_NAME}" == dmd* ]]; then | |
| if ! command -v dmd >/dev/null 2>&1; then | |
| echo "ERROR: dmd not found on PATH (matrix.dc=${DC_NAME})" | |
| exit 1 | |
| fi | |
| dmd --version | |
| elif [[ "${DC_NAME}" == ldc* ]]; then | |
| if ! command -v ldc2 >/dev/null 2>&1; then | |
| echo "ERROR: ldc2 not found on PATH (matrix.dc=${DC_NAME})" | |
| exit 1 | |
| fi | |
| ldc2 --version | |
| else | |
| echo "ERROR: Unknown compiler in matrix.dc: '${DC_NAME}' (expected prefix 'dmd' or 'ldc')" | |
| exit 1 | |
| fi | |
| echo "ARCH=${ARCH:-<unset>}" | |
| echo "PATH=${PATH}" | |
| - name: Cache dub packages (safe to share) | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.dub/packages | |
| key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} | |
| restore-keys: | | |
| ${{ runner.os }}-dub-packages- | |
| - name: Cache dub build cache (compiler-specific) | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/Library/Caches/dub | |
| key: ${{ runner.os }}-dub-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} | |
| restore-keys: | | |
| ${{ runner.os }}-dub-cache-${{ matrix.dc }}- | |
| - name: Build / test (nightly compiler; no coverage) | |
| if: contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') | |
| run: dub test --arch=$ARCH --combined | |
| shell: bash | |
| - name: Build / test (stable compiler; with coverage) | |
| if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} | |
| run: | | |
| dub test --arch=$ARCH --build=unittest-cov | |
| dub test --arch=$ARCH --combined | |
| shell: bash | |
| - name: Upload coverage data | |
| if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} | |
| uses: codecov/codecov-action@v5 | |
| with: | |
| fail_ci_if_error: true | |
| verbose: true | |
| env: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| ubuntu: | |
| name: '[ubuntu] ${{ matrix.arch }}/${{ matrix.dc }}' | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 60 | |
| needs: setup | |
| # Only run if the setup phase explicitly defined compilers to be used | |
| if: ${{ fromJSON(needs.setup.outputs.compilers).ubuntu != '' && fromJSON(needs.setup.outputs.compilers).ubuntu != '[]' }} | |
| # Beta / master versions of any compiler are allowed to fail | |
| continue-on-error: ${{ contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') }} | |
| env: | |
| ARCH: ${{ matrix.arch }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| dc: ${{ fromJSON(needs.setup.outputs.compilers).ubuntu }} | |
| arch: [x86, x86_64] | |
| steps: | |
| - name: Checkout repo | |
| uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 | |
| - name: Setup D compiler | |
| uses: dlang-community/setup-dlang@d7d85fcde7c4cd5f9a6618fce1bccc316e1e910b | |
| with: | |
| compiler: ${{ matrix.dc }} | |
| - name: Install multi-lib for 32-bit systems | |
| if: matrix.arch == 'x86' | |
| run: sudo apt-get update && sudo apt-get install gcc-multilib | |
| - name: Verify toolchain | |
| shell: bash | |
| env: | |
| DC_NAME: ${{ matrix.dc }} | |
| run: | | |
| set -euo pipefail | |
| echo "matrix.dc = ${DC_NAME}" | |
| # dub must exist for all jobs | |
| if ! command -v dub >/dev/null 2>&1; then | |
| echo "ERROR: dub not found on PATH" | |
| exit 1 | |
| fi | |
| dub --version | |
| if [[ "${DC_NAME}" == dmd* ]]; then | |
| if ! command -v dmd >/dev/null 2>&1; then | |
| echo "ERROR: dmd not found on PATH (matrix.dc=${DC_NAME})" | |
| exit 1 | |
| fi | |
| dmd --version | |
| elif [[ "${DC_NAME}" == ldc* ]]; then | |
| if ! command -v ldc2 >/dev/null 2>&1; then | |
| echo "ERROR: ldc2 not found on PATH (matrix.dc=${DC_NAME})" | |
| exit 1 | |
| fi | |
| ldc2 --version | |
| else | |
| echo "ERROR: Unknown compiler in matrix.dc: '${DC_NAME}' (expected prefix 'dmd' or 'ldc')" | |
| exit 1 | |
| fi | |
| echo "ARCH=${ARCH:-<unset>}" | |
| echo "PATH=${PATH}" | |
| - name: Cache dub packages (safe to share) | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.dub/packages | |
| key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} | |
| restore-keys: | | |
| ${{ runner.os }}-dub-packages | |
| - name: Cache dub build cache (compiler-specific) | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cache/dub | |
| key: ${{ runner.os }}-dub-cache-${{ matrix.arch }}-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} | |
| restore-keys: | | |
| ${{ runner.os }}-dub-cache-${{ matrix.arch }}-${{ matrix.dc }}- | |
| - name: Build / test (nightly compiler; no coverage) | |
| if: contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') | |
| run: dub test --arch=$ARCH --combined | |
| shell: bash | |
| - name: Build / test (stable compiler; with coverage) | |
| if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} | |
| run: | | |
| dub test --arch=$ARCH --build=unittest-cov | |
| dub test --arch=$ARCH --combined | |
| shell: bash | |
| - name: Upload coverage data | |
| if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} | |
| uses: codecov/codecov-action@v5 | |
| with: | |
| fail_ci_if_error: true | |
| verbose: true | |
| env: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| windows: | |
| name: '[windows] x86_64/${{ matrix.dc }}' | |
| runs-on: windows-2022 | |
| timeout-minutes: 60 | |
| needs: setup | |
| # Only run if the setup phase explicitly defined compilers to be used | |
| if: ${{ fromJSON(needs.setup.outputs.compilers).windows != '' && fromJSON(needs.setup.outputs.compilers).windows != '[]' }} | |
| # Beta / master versions of any compiler are allowed to fail | |
| continue-on-error: ${{ contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') }} | |
| env: | |
| ARCH: x86_64 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| dc: ${{ fromJSON(needs.setup.outputs.compilers).windows }} | |
| steps: | |
| - name: Checkout repo | |
| uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 | |
| - name: Setup D compiler | |
| uses: dlang-community/setup-dlang@d7d85fcde7c4cd5f9a6618fce1bccc316e1e910b | |
| with: | |
| compiler: ${{ matrix.dc }} | |
| - name: Verify toolchain | |
| shell: pwsh | |
| env: | |
| DC_NAME: ${{ matrix.dc }} | |
| run: | | |
| Write-Host "matrix.dc = $env:DC_NAME" | |
| dub --version 2>$null | |
| if ($LASTEXITCODE -ne 0) { throw "dub not found" } | |
| if ($env:DC_NAME -like "dmd*") { | |
| dmd --version 2>$null | |
| if ($LASTEXITCODE -ne 0) { throw "dmd not found" } | |
| } elseif ($env:DC_NAME -like "ldc*") { | |
| ldc2 --version 2>$null | |
| if ($LASTEXITCODE -ne 0) { throw "ldc2 not found" } | |
| } else { | |
| throw "Unknown compiler in matrix.dc: '$env:DC_NAME' (expected prefix 'dmd' or 'ldc')" | |
| } | |
| Write-Host "ARCH=$env:ARCH" | |
| Write-Host "Path=$env:Path" | |
| - name: Cache dub packages (safe to share) | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ${{ env.APPDATA }}\dub\packages | |
| key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} | |
| restore-keys: | | |
| ${{ runner.os }}-dub- | |
| - name: Cache dub build cache (compiler-specific) | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ${{ env.LOCALAPPDATA }}\dub | |
| key: ${{ runner.os }}-dub-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} | |
| restore-keys: | | |
| ${{ runner.os }}-dub-${{ matrix.dc }}- | |
| # Tests are split up to work around OOM errors -- no combined testing is done | |
| # as it's simply too big for the compiler to handle on Windows. | |
| - name: Build / test (nightly compiler; no coverage) | |
| if: contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') | |
| run: | | |
| dub test --arch=$env:ARCH --build=unittest-ci -c ci-bignum-test | |
| dub test --arch=$env:ARCH --build=unittest-ci -c ci-core-test | |
| dub test --arch=$env:ARCH --build=unittest-ci -c ci-ndslice-test | |
| dub test --arch=$env:ARCH --build=unittest-ci -c ci-test | |
| shell: pwsh | |
| - name: Build / test (stable compiler; with coverage) | |
| if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} | |
| run: | | |
| dub test --arch=$env:ARCH --build=unittest-cov-ci -c ci-bignum-test | |
| dub test --arch=$env:ARCH --build=unittest-cov-ci -c ci-core-test | |
| dub test --arch=$env:ARCH --build=unittest-cov-ci -c ci-ndslice-test | |
| dub test --arch=$env:ARCH --build=unittest-cov-ci -c ci-test | |
| shell: pwsh | |
| - name: Upload coverage data | |
| if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} | |
| uses: codecov/codecov-action@v5 | |
| with: | |
| fail_ci_if_error: true | |
| verbose: true | |
| env: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |