The Build workflow in .github/workflows/build.yml runs independent Rust
validation and native package builds in parallel. It does not change the
shipping Cargo release profile, coverage instrumentation, or the separate
Python release matrix.
After change classification and lightweight checks, full validation starts these lanes without waiting for the Rust tests:
| Job | Responsibility |
|---|---|
test-rust |
Existing Rust unit, ABI, codegen, census, determinism, cleanup and live i686 checks |
build-codegen-x64 |
Release x64 generator |
build-bindings-x64 |
Production release x64 JS distribution and CPython 3.12 x64 development-profile wheel |
build-js-test-hooks |
Separate release x64 JS distribution with native test fixtures |
build-arm64 |
Release ARM64 generator/runtime and the ARM64 C-oracle compile check |
e2e-runtime |
Production JS/Python tests, generated WinRT/COM/Win32/implementation E2E, long paths, and dispatcher smoke |
e2e-native |
TSFN, generated unsafe COM, native completion, borrowed copies, and Win32 cleanup fixtures |
The two E2E consumers depend only on their x64 producers, not the ARM64 lane or
Rust tests. The original test and e2e check names aggregate their respective
validation lanes; the e2e aggregate retains its Rust-test prerequisite without
delaying either E2E consumer. dynwinrt and dynwinrt-codegen assemble the original
dual-architecture final artifacts only after Rust, E2E and the relevant builds
succeed. ci-success checks every job result, including final artifact
verification. Failure, cancellation, a missing result or an unexpected skip
fails these gates.
Intermediate ci-* artifacts are inputs, not release-ready packages.
Downloads use the current workflow run. Each input includes a file-hash manifest
with the commit, run, package version, architecture, Cargo profile, feature set
and, for wheels, CPython ABI. Consumers verify it before using the payload.
The full JS distribution is transferred, including declarations and COM/Win32
sidecars. Assembly requires identical architecture-independent files and keeps
both native binaries; it never overlays test-hook files onto production.
Rust test executables still need their own cargo test builds. In particular,
the runtime-backed implementation_naming_test is not replaced by a generator
executable. Coverage binaries and the separate Python release workflow's
packaging configurations are not shared with production.
Pull requests that change only .md files take the lightweight path. The suffix
match is case-insensitive (.MD and .mD qualify), but does not include
.markdown, .mdx, or other file types. New Markdown files in any directory
qualify without editing a path list, including guides, sample and packaged
READMEs, release notes, and docs/status Markdown reports.
There are currently no Markdown exclusions: the repository's Markdown is not used as generator or native-test behavior input. Package READMEs and release notes affect published descriptions, not native APIs, so they receive source metadata and release-note checks rather than native rebuilds. A future behavior-input exception must identify its exact file and actual consumer; ordinary documentation must not acquire a directory-wide exclusion.
Classification compares the PR merge base to its head using complete Git history, not just the latest commit. Both old and new rename paths must qualify; renaming code to Markdown or Markdown to code requires full validation. Markdown additions, modifications and deletions qualify. Any non-Markdown change, including JSON/CSV baselines, schemas, scripts, workflow files, sample code/configuration, and unknown non-Markdown paths, requires full validation. An empty diff uses full validation. Invalid statuses never select the lightweight path; malformed or unavailable history fails classification rather than guessing that the change is documentation-only.
The lightweight path runs the scheduling, artifact, prebuilt-selection and
release-note configuration regressions, plus Python package source metadata
validation, without compiling native code. The metadata check validates README
declarations, presence and the same description headings checked in wheels;
it does not build wheels. Stable check names still run and validate the
explicitly expected heavy-job skips; no package artifact is created. Pushes
to main and version tags always use full validation. The workflow is not
hidden behind a top-level path filter.
This policy selects jobs in Build only. The independent Coverage and Python
release workflows retain their own path filters and can still run for matching
Markdown paths.
Ordinary developer commands are unchanged: omitting a generator override uses
Cargo with the selected -CargoProfile and -CargoTarget. -SkipBuild alone
skips initial native builds, but still permits the existing Cargo generation
path. To prohibit generator rebuilds, supply a real executable explicitly:
.\tests\e2e\e2e_test.ps1 -SkipBuild `
-Codegen C:\artifacts\dynwinrt-codegen.exe
.\tests\e2e\e2e_test.ps1 -SkipBuild -Suite implementations `
-Codegen C:\artifacts\dynwinrt-codegen.exe -Lang py,tsDYNWINRT_CODEGEN provides the same default for both PowerShell entrypoints and
the JavaScript generated-unsafe, native-completion and borrowed-copy tests.
An explicit -Codegen takes precedence. Missing/invalid explicit files fail;
they never silently fall back to Cargo or a stale local binary.
Binding artifacts must already be installed when using -SkipBuild: the full
matching JS distribution in bindings\js\dist, and a compatible wheel in the
selected Python environment. The JS fixture npm scripts retain their local
build:test-hooks behavior. CI instead runs their AVA tests directly against a
verified, separately downloaded test-hooks distribution.
Run the lightweight regressions with:
python -m pip install -r eng\ci\requirements.txt
python -m unittest discover -s eng\ci -p "test_*.py" -v
node --test bindings\js\scripts\run-codegen.test.mjs
.\tests\e2e\e2e_preparation.tests.ps1
.\tests\e2e\prebuilt_codegen.tests.ps1
.\eng\release\validate_release_notes.ps1
.\eng\release\test_validate_release_notes.ps1
python eng\release\python\verify_python_release.py sourceParallelism removes the old Rust-test barrier and duplicate release builds; actual hosted run times still depend on runner capacity and artifact transfer. Measure completed runs before treating a wall-clock improvement as established.