open-standards/.github/workflows/wai-release-windows-build.yml
Transaction Science d698f47278
Some checks failed
joule-code conformance gate / joule-moq-relay, its own energy on a counter (macos) (push) Successful in 52s
joule-code conformance gate / Build + round-trip C1-C4 vectors (push) Successful in 1m38s
joule-code conformance gate / joule-moq-relay, every target (push) Successful in 3m7s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Failing after 4m22s
wai release binaries build on Windows / the seven release binaries · windows (push) Successful in 14m14s
joule-code conformance gate / joule-moq-ingest, every target (push) Successful in 21m40s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Has been cancelled
joule-moq-room room service / joule-moq-room, every target (push) Has been cancelled
joule-contrib: process CPU time on Windows, and the release's seven Windows binaries build on main
cpu_us() declared POSIX getrusage for every target, so linking wai-ingest
for x86_64-pc-windows-msvc failed (LNK2019, unresolved external symbol
getrusage) and wai-v0.5.0's Windows leg produced no archive. It is now
getrusage on unix, GetProcessTimes (kernel32) on Windows, and zero where
a platform gives no process CPU time.

Nothing built those binaries on Windows before a release. A new workflow
builds the same seven the Windows archive holds, with the release job's
directories, packages, features and --locked, in debug (which links each
one): nightly, and on a push to main that changes a joule-code crate the
archive builds from.

Checked: joule-contrib type-checks and passes clippy -D warnings for
x86_64-pc-windows-msvc, and its 33 lib tests pass natively (Thor).

Changelog: none
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-09 11:44:18 -05:00

78 lines
3.9 KiB
YAML

name: wai release binaries build on Windows
# The Windows archive of a wai release holds seven binaries: wai, wai-relay, wai-room, wai-ingest,
# wai-remote-host, wai-pack and wai-quantum (wai-release.yml's Windows job). Until this workflow,
# only the release itself built them on Windows, so a Windows-only break reached the release:
# wai-v0.5.0's Windows leg failed to link wai-ingest, because joule-contrib declared POSIX
# getrusage unconditionally (unresolved external symbol getrusage).
#
# This builds the same seven binaries for x86_64-pc-windows-msvc, as the release does (same
# directories, packages, features and --locked), so a link or compile error shows up on main.
# It is a debug build: it links every binary, which is what catches a missing symbol, in a
# fraction of a release build's time on the one Windows runner. It runs nightly, and on a push to
# main that changes a crate the Windows archive builds from joule-code (wai-rs, wai-pack and
# wai-quantum-cli have Windows jobs of their own).
#
# Windows runner notes: shell pwsh (PowerShell 7); the runner injects CI=true, cleared as the
# release job clears it.
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
on:
schedule:
- cron: '20 5 * * *'
push:
branches: [main]
paths:
- 'joule-code/joule-code-rs/Cargo.lock'
- 'joule-code/joule-code-rs/Cargo.toml'
- 'joule-code/joule-code-rs/crates/joule-contrib/**'
- 'joule-code/joule-code-rs/crates/joule-moq-ingest/**'
- 'joule-code/joule-code-rs/crates/joule-moq-relay/**'
- 'joule-code/joule-code-rs/crates/joule-moq-room/**'
- 'joule-code/joule-code-rs/crates/joule-moq-remote/**'
- '.github/workflows/wai-release-windows-build.yml'
env:
CARGO_TERM_COLOR: always
jobs:
build:
name: the seven release binaries · windows
runs-on: windows
timeout-minutes: 120
env:
CI: ""
steps:
- uses: actions/checkout@v5
- name: Build each binary the Windows archive holds
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
Remove-Item Env:CI -ErrorAction SilentlyContinue
$t = "x86_64-pc-windows-msvc"
$builds = @(
@{ dir = 'wai\wai-rs'; bin = 'wai'; args = @('--no-default-features', '--features', 'quickstart', '--bin', 'wai') },
@{ dir = 'joule-code\joule-code-rs'; bin = 'wai-relay'; args = @('-p', 'joule-moq-relay', '--bin', 'wai-relay') },
@{ dir = 'joule-code\joule-code-rs\crates\joule-moq-room'; bin = 'wai-room'; args = @('--bin', 'wai-room') },
@{ dir = 'joule-code\joule-code-rs'; bin = 'wai-ingest'; args = @('-p', 'joule-moq-ingest', '--bin', 'wai-ingest') },
@{ dir = 'joule-code\joule-code-rs\crates\joule-moq-remote'; bin = 'wai-remote-host'; args = @('--bin', 'wai-remote-host') },
@{ dir = 'wai\wai-pack'; bin = 'wai-pack'; args = @('--bin', 'wai-pack') },
@{ dir = 'wai\wai-quantum-cli'; bin = 'wai-quantum'; args = @('--bin', 'wai-quantum') }
)
$failed = @()
foreach ($b in $builds) {
Push-Location $b.dir
cargo build --locked --target $t @($b.args)
if ($LASTEXITCODE -ne 0) { $failed += $b.bin; Write-Host "::error::the Windows build of $($b.bin) failed" }
else {
$target = (cargo metadata --format-version 1 --no-deps --locked | ConvertFrom-Json).target_directory
$exe = Join-Path $target "$t\debug\$($b.bin).exe"
if (-not (Test-Path $exe)) { $failed += $b.bin; Write-Host "::error::$($b.bin).exe was not produced" }
else { Write-Host "built $($b.bin).exe" }
}
Pop-Location
}
if ($failed.Count -gt 0) { throw "the Windows build failed for: $($failed -join ', ')" }
Write-Host "all seven release binaries build and link for $t"