From 8a8c7db20d057bb1f86d0d20cf6ac8362d2cfeb1 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Wed, 7 Jan 2026 22:08:28 -0500 Subject: [PATCH 01/22] Update Github Actions CI OS --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 80bc988c..91eed9f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ concurrency: jobs: setup: name: 'Load job configuration' - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 outputs: compilers: ${{ steps.load-config.outputs.compilers }} steps: @@ -68,7 +68,7 @@ jobs: macos: name: '[macos] x86_64/${{ matrix.dc }}' - runs-on: macos-11 + runs-on: macos-13 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 != '[]' }} @@ -104,7 +104,7 @@ jobs: ubuntu: name: '[ubuntu] ${{ matrix.arch }}/${{ matrix.dc }}' - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 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 != '[]' }} From 2321cc881cb664cee4a4edd3bc010f772da683ec Mon Sep 17 00:00:00 2001 From: jmh530 Date: Wed, 7 Jan 2026 22:09:13 -0500 Subject: [PATCH 02/22] Add timeout-minutes condition to Github Actions --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 91eed9f3..1bff30ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,6 +69,7 @@ jobs: macos: name: '[macos] x86_64/${{ matrix.dc }}' runs-on: macos-13 + 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 != '[]' }} @@ -105,6 +106,7 @@ jobs: 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 != '[]' }} @@ -145,6 +147,7 @@ jobs: 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 != '[]' }} From 185e7f1a570baa33abd7685452a7b81df25eab2f Mon Sep 17 00:00:00 2001 From: jmh530 Date: Wed, 7 Jan 2026 22:41:52 -0500 Subject: [PATCH 03/22] Update github actions cache to v4 --- .github/workflows/ci.yml | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1bff30ad..e6102de8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -89,12 +89,15 @@ jobs: with: compiler: ${{ matrix.dc }} - name: Cache dub dependencies - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@v4 with: - path: ~/.dub/packages - key: macos-latest-build-${{ hashFiles('**/dub.sdl', '**/dub.json') }} + path: | + ~/.dub/packages + ~/Library/Caches/dub + key: ${{ runner.os }}-dub-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} restore-keys: | - macos-latest-build- + ${{ runner.os }}-dub-${{ matrix.dc }}- + ${{ runner.os }}-dub- - name: Build / test run: | dub test --arch=$ARCH --build=unittest-cov @@ -130,12 +133,16 @@ jobs: if: matrix.arch == 'x86' run: sudo apt-get update && sudo apt-get install gcc-multilib - name: Cache dub dependencies - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@v4 with: - path: ~/.dub/packages - key: ubuntu-latest-build-${{ hashFiles('**/dub.sdl', '**/dub.json') }} + path: | + ~/.dub/packages + ~/.cache/dub + key: ${{ runner.os }}-dub-${{ matrix.arch }}-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} restore-keys: | - ubuntu-latest-build- + ${{ runner.os }}-dub-${{ matrix.arch }}-${{ matrix.dc }}- + ${{ runner.os }}-dub-${{ matrix.arch }}- + ${{ runner.os }}-dub- - name: Build / test run: | dub test --arch=$ARCH --build=unittest-cov @@ -167,12 +174,15 @@ jobs: with: compiler: ${{ matrix.dc }} - name: Cache dub dependencies - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@v4 with: - path: ~\AppData\Local\dub - key: windows-latest-build-${{ hashFiles('**/dub.sdl', '**/dub.json') }} + path: | + ${{ env.APPDATA }}\dub\packages + ${{ env.LOCALAPPDATA }}\dub + key: ${{ runner.os }}-dub-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} restore-keys: | - windows-latest-build- + ${{ runner.os }}-dub-${{ matrix.dc }}- + ${{ runner.os }}-dub- # 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 From 575580264128859ecc8dfac0ff1e88241b5eb80e Mon Sep 17 00:00:00 2001 From: jmh530 Date: Wed, 7 Jan 2026 22:43:29 -0500 Subject: [PATCH 04/22] Update macos-13 to macos-15-intel --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e6102de8..a65ca135 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,7 +68,7 @@ jobs: macos: name: '[macos] x86_64/${{ matrix.dc }}' - runs-on: macos-13 + runs-on: macos-15-intel timeout-minutes: 60 needs: setup # Only run if the setup phase explicitly defined compilers to be used From 37db0eb903b83c3ba7eaad3de834ffc02c2ff4af Mon Sep 17 00:00:00 2001 From: jmh530 Date: Wed, 7 Jan 2026 23:24:02 -0500 Subject: [PATCH 05/22] Update codecov to v5 --- .github/workflows/ci.yml | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a65ca135..3dc7327f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -104,7 +104,12 @@ jobs: dub test --arch=$ARCH --combined shell: bash - name: Upload coverage data - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b + 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 }}' @@ -149,7 +154,12 @@ jobs: dub test --arch=$ARCH --combined shell: bash - name: Upload coverage data - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b + 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 }}' @@ -193,6 +203,11 @@ jobs: dub test --arch=$ARCH --build=unittest-ci -c ci-test shell: bash - name: Upload coverage data - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b + uses: codecov/codecov-action@v5 + with: + fail_ci_if_error: true + verbose: true + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From 78b4eadaaecc67bf1dc749877d20e59c1fe3090e Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 06:56:57 -0500 Subject: [PATCH 06/22] Update restore-keys --- .github/workflows/ci.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3dc7327f..f246cc9f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,7 +97,6 @@ jobs: key: ${{ runner.os }}-dub-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} restore-keys: | ${{ runner.os }}-dub-${{ matrix.dc }}- - ${{ runner.os }}-dub- - name: Build / test run: | dub test --arch=$ARCH --build=unittest-cov @@ -146,8 +145,6 @@ jobs: key: ${{ runner.os }}-dub-${{ matrix.arch }}-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} restore-keys: | ${{ runner.os }}-dub-${{ matrix.arch }}-${{ matrix.dc }}- - ${{ runner.os }}-dub-${{ matrix.arch }}- - ${{ runner.os }}-dub- - name: Build / test run: | dub test --arch=$ARCH --build=unittest-cov @@ -192,7 +189,6 @@ jobs: key: ${{ runner.os }}-dub-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} restore-keys: | ${{ runner.os }}-dub-${{ matrix.dc }}- - ${{ runner.os }}-dub- # 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 From 4464d55b9e01c7caa5c065273542be82ce4febf8 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 07:47:00 -0500 Subject: [PATCH 07/22] Split packages and build cache --- .github/workflows/ci.yml | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f246cc9f..16050305 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -88,15 +88,22 @@ jobs: uses: dlang-community/setup-dlang@763d869b4d67e50c3ccd142108c8bca2da9df166 with: compiler: ${{ matrix.dc }} - - name: Cache dub dependencies + - name: Cache dub packages (safe to share) uses: actions/cache@v4 with: path: | ~/.dub/packages + key: macos-latest-build-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} + restore-keys: | + macos-latest-build-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-${{ matrix.dc }}- + ${{ runner.os }}-dub-cache-${{ matrix.dc }}- - name: Build / test run: | dub test --arch=$ARCH --build=unittest-cov @@ -136,15 +143,22 @@ jobs: - name: Install multi-lib for 32-bit systems if: matrix.arch == 'x86' run: sudo apt-get update && sudo apt-get install gcc-multilib - - name: Cache dub dependencies + - name: Cache dub packages (safe to share) uses: actions/cache@v4 with: path: | ~/.dub/packages + key: ubuntu-latest-build-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} + restore-keys: | + ubuntu-latest-build-dub-packages + - name: Cache dub build cache (compiler-specific) + uses: actions/cache@v4 + with: + path: | ~/.cache/dub - key: ${{ runner.os }}-dub-${{ matrix.arch }}-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} + key: ${{ runner.os }}-dub-cache-${{ matrix.arch }}-${{ matrix.dc }}-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} restore-keys: | - ${{ runner.os }}-dub-${{ matrix.arch }}-${{ matrix.dc }}- + ${{ runner.os }}-dub-cache-${{ matrix.arch }}-${{ matrix.dc }}- - name: Build / test run: | dub test --arch=$ARCH --build=unittest-cov @@ -180,11 +194,18 @@ jobs: uses: dlang-community/setup-dlang@763d869b4d67e50c3ccd142108c8bca2da9df166 with: compiler: ${{ matrix.dc }} - - name: Cache dub dependencies + - name: Cache dub packages (safe to share) uses: actions/cache@v4 with: path: | ${{ env.APPDATA }}\dub\packages + key: windows-latest-build-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} + restore-keys: | + windows-latest-build-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: | From 582054bac0146b2d196dd477868c42631348ae93 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 22:05:55 -0500 Subject: [PATCH 08/22] Only generate coverage for stable compiler --- .github/workflows/ci.yml | 28 ++++++++++++++++++++++++---- dub.sdl | 6 +++++- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16050305..c3624e0f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -104,7 +104,13 @@ jobs: 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 + - 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 @@ -159,10 +165,16 @@ jobs: 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 + - 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 + dub test --arch=$ARCH --combined shell: bash - name: Upload coverage data uses: codecov/codecov-action@v5 @@ -212,13 +224,21 @@ jobs: ${{ 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 + - name: Build / test (nightly compiler; no coverage) + if: contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') run: | dub test --arch=$ARCH --build=unittest-ci -c ci-bignum-test dub test --arch=$ARCH --build=unittest-ci -c ci-core-test dub test --arch=$ARCH --build=unittest-ci -c ci-ndslice-test dub test --arch=$ARCH --build=unittest-ci -c ci-test 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-ci -c ci-bignum-test + dub test --arch=$ARCH --build=unittest-cov-ci -c ci-core-test + dub test --arch=$ARCH --build=unittest-cov-ci -c ci-ndslice-test + dub test --arch=$ARCH --build=unittest-cov-ci -c ci-test - name: Upload coverage data uses: codecov/codecov-action@v5 with: diff --git a/dub.sdl b/dub.sdl index e8085ba7..61fdef2a 100644 --- a/dub.sdl +++ b/dub.sdl @@ -42,10 +42,14 @@ buildType "unittest-cov" { versions "mir_bignum_test" "mir_bignum_test_llv" "mir_ndslice_test" "mir_test" dflags "-lowmem" } -buildType "unittest-ci" { +buildType "unittest-cov-ci" { buildOptions "unittests" "coverage" "debugMode" "debugInfo" dflags "-lowmem" } +buildType "unittest-ci" { + buildOptions "unittests" "debugMode" "debugInfo" + dflags "-lowmem" +} buildType "unittest-release" { buildOptions "unittests" "releaseMode" "optimize" "inline" "noBoundsCheck" versions "mir_bignum_test" "mir_ndslice_test" "mir_test" From db562416994bc9f9c8cd84c4a85be8b5fffd9914 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 22:06:19 -0500 Subject: [PATCH 09/22] continue-on-error if beta or master compilers --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c3624e0f..9a4efdb0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -81,6 +81,7 @@ jobs: fail-fast: false matrix: dc: ${{ fromJSON(needs.setup.outputs.compilers).macos }} + continue-on-error: ${{ contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') }} steps: - name: Checkout repo uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 @@ -139,6 +140,7 @@ jobs: matrix: dc: ${{ fromJSON(needs.setup.outputs.compilers).ubuntu }} arch: [x86, x86_64] + continue-on-error: ${{ contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') }} steps: - name: Checkout repo uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 @@ -199,6 +201,7 @@ jobs: fail-fast: false matrix: dc: ${{ fromJSON(needs.setup.outputs.compilers).windows }} + continue-on-error: ${{ contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') }} steps: - name: Checkout repo uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 From 52ee70cb5a4847e425cb5286d50f44d646a3a4f1 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 22:18:48 -0500 Subject: [PATCH 10/22] Fixups --- .github/workflows/ci.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9a4efdb0..1386384c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,11 +107,10 @@ jobs: ${{ 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 + run: dub test --arch=$ARCH --combined shell: bash - name: Build / test (stable compiler; with coverage) - if: !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) + if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} run: | dub test --arch=$ARCH --build=unittest-cov dub test --arch=$ARCH --combined @@ -169,11 +168,10 @@ jobs: ${{ 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 + run: dub test --arch=$ARCH --combined shell: bash - name: Build / test (stable compiler; with coverage) - if: !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) + if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} run: | dub test --arch=$ARCH --build=unittest-cov dub test --arch=$ARCH --combined @@ -236,12 +234,13 @@ jobs: dub test --arch=$ARCH --build=unittest-ci -c ci-test shell: bash - name: Build / test (stable compiler; with coverage) - if: !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) + if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} run: | dub test --arch=$ARCH --build=unittest-cov-ci -c ci-bignum-test dub test --arch=$ARCH --build=unittest-cov-ci -c ci-core-test dub test --arch=$ARCH --build=unittest-cov-ci -c ci-ndslice-test dub test --arch=$ARCH --build=unittest-cov-ci -c ci-test + shell: bash - name: Upload coverage data uses: codecov/codecov-action@v5 with: From cbe9bae8f118c5dfdb1b94be3536a6d5bddcce09 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 22:20:50 -0500 Subject: [PATCH 11/22] Remove extra continue-on-error --- .github/workflows/ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1386384c..51eb2d24 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -81,7 +81,6 @@ jobs: fail-fast: false matrix: dc: ${{ fromJSON(needs.setup.outputs.compilers).macos }} - continue-on-error: ${{ contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') }} steps: - name: Checkout repo uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 @@ -139,7 +138,6 @@ jobs: matrix: dc: ${{ fromJSON(needs.setup.outputs.compilers).ubuntu }} arch: [x86, x86_64] - continue-on-error: ${{ contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') }} steps: - name: Checkout repo uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 @@ -199,7 +197,6 @@ jobs: fail-fast: false matrix: dc: ${{ fromJSON(needs.setup.outputs.compilers).windows }} - continue-on-error: ${{ contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') }} steps: - name: Checkout repo uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 From a2a1d872b1f0455382332bc211c0c4aaee4d88eb Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 22:25:21 -0500 Subject: [PATCH 12/22] Only upload coverage data if coverage reports generated --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 51eb2d24..d6858df5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -115,6 +115,7 @@ jobs: 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 @@ -175,6 +176,7 @@ jobs: 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 @@ -239,6 +241,7 @@ jobs: dub test --arch=$ARCH --build=unittest-cov-ci -c ci-test 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 From 9b3740f84389af3e29147cc83893b4e24d1994e3 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 22:28:41 -0500 Subject: [PATCH 13/22] Tweak runner.os --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d6858df5..059dc1f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -93,9 +93,9 @@ jobs: with: path: | ~/.dub/packages - key: macos-latest-build-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} + key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} restore-keys: | - macos-latest-build-dub-packages- + ${{ runner.os }}-dub-packages- - name: Cache dub build cache (compiler-specific) uses: actions/cache@v4 with: @@ -154,9 +154,9 @@ jobs: with: path: | ~/.dub/packages - key: ubuntu-latest-build-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} + key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} restore-keys: | - ubuntu-latest-build-dub-packages + ${{ runner.os }}-dub-packages - name: Cache dub build cache (compiler-specific) uses: actions/cache@v4 with: @@ -211,9 +211,9 @@ jobs: with: path: | ${{ env.APPDATA }}\dub\packages - key: windows-latest-build-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} + key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.sdl', '**/dub.json', '**/dub.selections.json') }} restore-keys: | - windows-latest-build-dub- + ${{ runner.os }}-dub- - name: Cache dub build cache (compiler-specific) uses: actions/cache@v4 with: From 5142ee54fb1b48ad90142849d7907d9c528e454e Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 23:08:42 -0500 Subject: [PATCH 14/22] Update setup-dlang to latest --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 059dc1f8..d34d4c6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,7 +85,7 @@ jobs: - name: Checkout repo uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 - name: Setup D compiler - uses: dlang-community/setup-dlang@763d869b4d67e50c3ccd142108c8bca2da9df166 + uses: dlang-community/setup-dlang@d7d85fcde7c4cd5f9a6618fce1bccc316e1e910b with: compiler: ${{ matrix.dc }} - name: Cache dub packages (safe to share) @@ -143,7 +143,7 @@ jobs: - name: Checkout repo uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 - name: Setup D compiler - uses: dlang-community/setup-dlang@763d869b4d67e50c3ccd142108c8bca2da9df166 + uses: dlang-community/setup-dlang@d7d85fcde7c4cd5f9a6618fce1bccc316e1e910b with: compiler: ${{ matrix.dc }} - name: Install multi-lib for 32-bit systems @@ -203,7 +203,7 @@ jobs: - name: Checkout repo uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 - name: Setup D compiler - uses: dlang-community/setup-dlang@763d869b4d67e50c3ccd142108c8bca2da9df166 + uses: dlang-community/setup-dlang@d7d85fcde7c4cd5f9a6618fce1bccc316e1e910b with: compiler: ${{ matrix.dc }} - name: Cache dub packages (safe to share) @@ -231,7 +231,7 @@ jobs: dub test --arch=$ARCH --build=unittest-ci -c ci-core-test dub test --arch=$ARCH --build=unittest-ci -c ci-ndslice-test dub test --arch=$ARCH --build=unittest-ci -c ci-test - shell: bash + shell: pwsh - name: Build / test (stable compiler; with coverage) if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} run: | @@ -239,7 +239,7 @@ jobs: dub test --arch=$ARCH --build=unittest-cov-ci -c ci-core-test dub test --arch=$ARCH --build=unittest-cov-ci -c ci-ndslice-test dub test --arch=$ARCH --build=unittest-cov-ci -c ci-test - shell: bash + shell: pwsh - name: Upload coverage data if: ${{ !(contains(matrix.dc, 'beta') || contains(matrix.dc, 'master')) }} uses: codecov/codecov-action@v5 From 20b44a31b262f0701e623cf470329e328818bbb1 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 23:10:37 -0500 Subject: [PATCH 15/22] Add verify toolchain step --- .github/workflows/ci.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d34d4c6b..923dd1e6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -206,6 +206,13 @@ jobs: uses: dlang-community/setup-dlang@d7d85fcde7c4cd5f9a6618fce1bccc316e1e910b with: compiler: ${{ matrix.dc }} + - name: Verify toolchain + shell: pwsh + run: | + Get-Command dmd, ldc2, dub -ErrorAction SilentlyContinue | Format-Table -AutoSize + Get-Command dub -all + dub --version + echo $env:Path - name: Cache dub packages (safe to share) uses: actions/cache@v4 with: From 0412313ebff920f3a95813c1513bad6bdd8d6f64 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 23:23:22 -0500 Subject: [PATCH 16/22] Updates for powershell and better toolchain verification --- .github/workflows/ci.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 923dd1e6..21117e57 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -209,10 +209,10 @@ jobs: - name: Verify toolchain shell: pwsh run: | - Get-Command dmd, ldc2, dub -ErrorAction SilentlyContinue | Format-Table -AutoSize - Get-Command dub -all - dub --version - echo $env:Path + dmd --version 2>$null; if ($LASTEXITCODE -ne 0) { "dmd not found"; exit 1 } + dub --version; if ($LASTEXITCODE -ne 0) { "dub not found"; exit 1 } + Write-Host "ARCH=$env:ARCH" + Write-Host "Path=$env:Path" - name: Cache dub packages (safe to share) uses: actions/cache@v4 with: @@ -234,18 +234,18 @@ jobs: - name: Build / test (nightly compiler; no coverage) if: contains(matrix.dc, 'beta') || contains(matrix.dc, 'master') run: | - dub test --arch=$ARCH --build=unittest-ci -c ci-bignum-test - dub test --arch=$ARCH --build=unittest-ci -c ci-core-test - dub test --arch=$ARCH --build=unittest-ci -c ci-ndslice-test - dub test --arch=$ARCH --build=unittest-ci -c ci-test + 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=$ARCH --build=unittest-cov-ci -c ci-bignum-test - dub test --arch=$ARCH --build=unittest-cov-ci -c ci-core-test - dub test --arch=$ARCH --build=unittest-cov-ci -c ci-ndslice-test - dub test --arch=$ARCH --build=unittest-cov-ci -c ci-test + 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')) }} From 1876ad9003371816c4721711cd7842949c4f149f Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 23:33:42 -0500 Subject: [PATCH 17/22] Enhance verify toolchain --- .github/workflows/ci.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 21117e57..426913d6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -208,9 +208,22 @@ jobs: compiler: ${{ matrix.dc }} - name: Verify toolchain shell: pwsh + env: + DC_NAME: ${{ matrix.dc }} run: | - dmd --version 2>$null; if ($LASTEXITCODE -ne 0) { "dmd not found"; exit 1 } - dub --version; if ($LASTEXITCODE -ne 0) { "dub not found"; exit 1 } + Write-Host "matrix.dc = $env:DC_NAME" + dub --version 2>$null + if ($LASTEXITCODE -ne 0) { "dub not found"; exit 1 } + + if ($env:DC_NAME -like "dmd.*") { + dmd --version 2>$null + if ($LASTEXITCODE -ne 0) { "dmd not found"; exit 1 } + } else if ($env:DC_NAME -like "ldc.*") { + ldc2 --version 2>$null + if ($LASTEXITCODE -ne 0) { "dmd not found"; exit 1 } + } 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) From 5824c38b1decbf3e9a4a42b5de3d2bed1272728f Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 23:35:13 -0500 Subject: [PATCH 18/22] Fix typo --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 426913d6..6a350521 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -218,7 +218,7 @@ jobs: if ($env:DC_NAME -like "dmd.*") { dmd --version 2>$null if ($LASTEXITCODE -ne 0) { "dmd not found"; exit 1 } - } else if ($env:DC_NAME -like "ldc.*") { + } elseif ($env:DC_NAME -like "ldc.*") { ldc2 --version 2>$null if ($LASTEXITCODE -ne 0) { "dmd not found"; exit 1 } } else { From 9eabeefc78a7ac32e21feb21f1afa359179cfbc7 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 23:39:32 -0500 Subject: [PATCH 19/22] Update wildcard --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6a350521..d9bc01be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -215,10 +215,10 @@ jobs: dub --version 2>$null if ($LASTEXITCODE -ne 0) { "dub not found"; exit 1 } - if ($env:DC_NAME -like "dmd.*") { + if ($env:DC_NAME -like "dmd*") { dmd --version 2>$null if ($LASTEXITCODE -ne 0) { "dmd not found"; exit 1 } - } elseif ($env:DC_NAME -like "ldc.*") { + } elseif ($env:DC_NAME -like "ldc*") { ldc2 --version 2>$null if ($LASTEXITCODE -ne 0) { "dmd not found"; exit 1 } } else { From 950b753db214f60f17b57b4f589b205406fa1401 Mon Sep 17 00:00:00 2001 From: jmh530 Date: Thu, 8 Jan 2026 23:39:41 -0500 Subject: [PATCH 20/22] Change exit to throw --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d9bc01be..98894495 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -213,14 +213,14 @@ jobs: run: | Write-Host "matrix.dc = $env:DC_NAME" dub --version 2>$null - if ($LASTEXITCODE -ne 0) { "dub not found"; exit 1 } + if ($LASTEXITCODE -ne 0) { throw "dub not found" } if ($env:DC_NAME -like "dmd*") { dmd --version 2>$null - if ($LASTEXITCODE -ne 0) { "dmd not found"; exit 1 } + if ($LASTEXITCODE -ne 0) { throw "dmd not found" } } elseif ($env:DC_NAME -like "ldc*") { ldc2 --version 2>$null - if ($LASTEXITCODE -ne 0) { "dmd not found"; exit 1 } + if ($LASTEXITCODE -ne 0) { throw "ldc2 not found" } } else { throw "Unknown compiler in matrix.dc: '$env:DC_NAME' (expected prefix 'dmd' or 'ldc')" } From c018d6d9c8174765f48a8692e300f0456f15afed Mon Sep 17 00:00:00 2001 From: jmh530 Date: Fri, 9 Jan 2026 10:17:44 -0500 Subject: [PATCH 21/22] Add verify toolchain for ubuntu/macos --- .github/workflows/ci.yml | 74 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 98894495..579388e5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -88,6 +88,43 @@ jobs: 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 + 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:-}" + echo "PATH=${PATH}" - name: Cache dub packages (safe to share) uses: actions/cache@v4 with: @@ -149,6 +186,43 @@ jobs: - 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:-}" + echo "PATH=${PATH}" - name: Cache dub packages (safe to share) uses: actions/cache@v4 with: From d0f81adb353f9297b80b3e86030b2c0225cdd59d Mon Sep 17 00:00:00 2001 From: jmh530 Date: Fri, 9 Jan 2026 10:30:39 -0500 Subject: [PATCH 22/22] Add some additional diagnostic info for dub in macos --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 579388e5..b667afde 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -102,6 +102,8 @@ jobs: echo "ERROR: dub not found on PATH" exit 1 fi + which dub + file "$(which dub)" || true dub --version if [[ "${DC_NAME}" == dmd* ]]; then