Skip to content

Need to swtch to new CI OS #623

Need to swtch to new CI OS

Need to swtch to new CI OS #623

Workflow file for this run

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 }}