You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Extend the Native AOT release pipeline to Windows: add win-x64 and win-arm64 AOT artifacts alongside the Linux AOT artifacts delivered in #176, applying the same naming, validation, and clean-trim policy. This brings desktop Windows users to parity with Linux/IoT and rounds out the AOT story for the two most common platform families. macOS AOT remains a separate, later initiative.
Motivation
#176 delivers Linux AOT (linux-x64, linux-arm64) plus the cross-cutting groundwork — IsAotCompatible=true on both projects, clean-trim warning policy, XmlExtensions.cs rewrite, Humanizer resolution, and the matrix-extension pattern.
Once that lands, the work to ship Windows AOT is largely plumbing, not code:
Native AOT cannot be cross-compiled — win-x64 requires windows-latest, win-arm64 requires windows-11-arm (GA since April 2025, free for public repos). Linux runners cannot produce Windows AOT binaries.
Toolchain: windows-latest ships with MSVC v143 + the Windows 11 SDK pre-installed; no setup-msbuild or setup-vs step required.
The platform-specific surface that genuinely differs is small: archive format (.zip, already handled by the existing branch on win-*), .exe extension, .pdb companion files, and the SmartScreen/AV implications of unsigned native binaries.
Add two further matrix.include: entries to the same matrix #176 extends:
win-x64-aot — runs-on: windows-latest. AOT publish, PublishSingleFile=false, archive as .zip.
win-arm64-aot — runs-on: windows-11-arm. Same flags, same archive format.
Both entries inherit the deployment: aot and publish_single_file: false shape from #176 unchanged. The publish step's existing if [[ "${{ matrix.runtime }}" == win-* ]] archive branch already produces .zip for Windows RIDs — no change needed there.
Total release-asset count rises from 14 (post-#176) to 16.
3. .pdb symbol files
Native AOT on Windows produces a .pdb next to the .exe. Two options:
Exclude .pdb from the release archive — smaller download, end users don't typically need symbols, matches the bare-binary posture of the Linux AOT archives.
Include .pdb — useful for end-user crash debugging on devices without a build environment.
Default (this issue): exclude. Symbol publishing (NuGet .snupkg or a separate symbol artifact) is its own initiative and out of scope here.
4. Smoke test
On each Windows runner, post-publish:
./NetPace.exe--version
./NetPace.exe--help
5. Globalization
Inherit whatever globalization mode #176 locks (recommendation in that issue is InvariantGlobalization=true for AOT publish only). No Windows-specific divergence — the AOT publish flags should be identical to Linux except for the runtime and runner.
6. Documentation
README.md — install table extended with the two new win-*-aot.zip rows.
macOS AOT (osx-x64, osx-arm64) — separate follow-up issue. Different runner family (macos-13, macos-14), separate notarization considerations.
Code signing / Authenticode — unsigned native exes will trigger SmartScreen warnings on first download. Existing -standalone Windows builds aren't signed either; signing is a separate, larger initiative covering all release variants.
AntiVirus heuristic mitigation — submitting binaries to Microsoft Defender / other AV vendors for whitelisting belongs with the signing initiative, not here.
.pdb symbol distribution — see §3; out of scope until a symbol-publishing initiative exists.
win-arm64 cross-compile from windows-latest — supported by the SDK but loses the same-job smoke test; rejected in favour of the native ARM runner.
./netpace.exe --version, ./netpace.exe --help, and ./netpace.exe servers exit 0 on their respective native runners (windows-latest / windows-11-arm).
dotnet publish src/NetPace.Console -c Release -r win-x64 -p:PublishAot=true completes with the trim/AOT warning codes (IL2026, IL2090, IL3050, IL3056) treated as errors and exits 0.
Same publish for -r win-arm64 exits 0.
windows-11-arm runner is confirmed available for FrankRay78/NetPace (public repo, free tier) — captured as a workflow comment so future contributors don't doubt it.
README.md, docs/RELEASING.md, CHANGELOG.md, and USER_GUIDE.md reflect the two new artifacts.
SmartScreen / AV false positives — track via real release feedback once Windows AOT ships; remediation belongs with the code-signing initiative.
Symbol publishing — eventual .snupkg or separate symbol-artifact channel for AOT crash debugging.
macOS AOT follow-up — third and final platform issue in this series.
Drop self-contained for Windows — once Windows AOT is proven across two or three releases without regression, consider deprecating the win-*-standalone archives in line with the eventual Linux deprecation.
win-arm64 cross-compile fallback — if windows-11-arm runner availability becomes flaky or gets paywalled, document the cross-compile path as a contingency.
CHANGELOG.md: Dropped from documentation scope and AC Upload speed test #8 — the project has no CHANGELOG.md; per-release notes are GitHub-auto-generated per docs/RELEASING.md#L67-L69.
Smoke-test shell: Use shell: bash on the smoke step (Git Bash ships with both Windows runners) with an if-branch for unzip vs tar -xzf. Binary is NetPace (case-sensitive) on all platforms — NetPace.exe on Windows.
Windows AOT runners:windows-latest (x64) for win-x64-aot, windows-11-arm (ARM64) for win-arm64-aot. Block on failure (no continue-on-error); cross-compile rejected to preserve the native smoke test, mirroring the Linux AOT runner choice in docs/RELEASING.md#L33-L35.
Summary
Extend the Native AOT release pipeline to Windows: add
win-x64andwin-arm64AOT artifacts alongside the Linux AOT artifacts delivered in #176, applying the same naming, validation, and clean-trim policy. This brings desktop Windows users to parity with Linux/IoT and rounds out the AOT story for the two most common platform families. macOS AOT remains a separate, later initiative.Motivation
#176 delivers Linux AOT (
linux-x64,linux-arm64) plus the cross-cutting groundwork —IsAotCompatible=trueon both projects, clean-trim warning policy,XmlExtensions.csrewrite, Humanizer resolution, and the matrix-extension pattern.Once that lands, the work to ship Windows AOT is largely plumbing, not code:
win-x64requireswindows-latest,win-arm64requireswindows-11-arm(GA since April 2025, free for public repos). Linux runners cannot produce Windows AOT binaries.windows-latestships with MSVC v143 + the Windows 11 SDK pre-installed; nosetup-msbuildorsetup-vsstep required.The platform-specific surface that genuinely differs is small: archive format (
.zip, already handled by the existing branch onwin-*),.exeextension,.pdbcompanion files, and the SmartScreen/AV implications of unsigned native binaries.Proposal
1. Workflow changes —
release-binaries.ymlAdd two further
matrix.include:entries to the same matrix #176 extends:win-x64-aot—runs-on: windows-latest. AOT publish,PublishSingleFile=false, archive as.zip.win-arm64-aot—runs-on: windows-11-arm. Same flags, same archive format.Both entries inherit the
deployment: aotandpublish_single_file: falseshape from #176 unchanged. The publish step's existingif [[ "${{ matrix.runtime }}" == win-* ]]archive branch already produces.zipfor Windows RIDs — no change needed there.2. Naming convention
Inherits the convention locked in #176:
win-x64netpace-{tag}-win-x64-aot.zipwin-arm64netpace-{tag}-win-arm64-aot.zipTotal release-asset count rises from 14 (post-#176) to 16.
3.
.pdbsymbol filesNative AOT on Windows produces a
.pdbnext to the.exe. Two options:.pdbfrom the release archive — smaller download, end users don't typically need symbols, matches the bare-binary posture of the Linux AOT archives..pdb— useful for end-user crash debugging on devices without a build environment.Default (this issue): exclude. Symbol publishing (NuGet
.snupkgor a separate symbol artifact) is its own initiative and out of scope here.4. Smoke test
On each Windows runner, post-publish:
5. Globalization
Inherit whatever globalization mode #176 locks (recommendation in that issue is
InvariantGlobalization=truefor AOT publish only). No Windows-specific divergence — the AOT publish flags should be identical to Linux except for the runtime and runner.6. Documentation
win-*-aot.ziprows.docs/RELEASING.md(created in Add Linux Native AOT release artifacts (linux-x64, linux-arm64) for IoT deployments #176) — matrix and naming table extended; the win-arm64 runner choice (windows-11-arm) noted explicitly so future contributors don't reach for cross-compile.Out of scope
osx-x64,osx-arm64) — separate follow-up issue. Different runner family (macos-13,macos-14), separate notarization considerations.-standaloneWindows builds aren't signed either; signing is a separate, larger initiative covering all release variants..pdbsymbol distribution — see §3; out of scope until a symbol-publishing initiative exists.win-arm64cross-compile fromwindows-latest— supported by the SDK but loses the same-job smoke test; rejected in favour of the native ARM runner.-standalone/-net8suffixes for Windows — same compatibility argument as Add Linux Native AOT release artifacts (linux-x64, linux-arm64) for IoT deployments #176; preserved indefinitely here.Acceptance criteria
netpace-{tag}-win-x64-aot.zipandnetpace-{tag}-win-arm64-aot.zip.netpace.exe(no.dll, no.deps.json, no.runtimeconfig.json, no.pdb).-standalonecounterpart (aot.zip < standalone.zipsize assertion in the validation step, mirroring Add Linux Native AOT release artifacts (linux-x64, linux-arm64) for IoT deployments #176 / Q6)../netpace.exe --version,./netpace.exe --help, and./netpace.exe serversexit0on their respective native runners (windows-latest/windows-11-arm).dotnet publish src/NetPace.Console -c Release -r win-x64 -p:PublishAot=truecompletes with the trim/AOT warning codes (IL2026, IL2090, IL3050, IL3056) treated as errors and exits0.-r win-arm64exits0.windows-11-armrunner is confirmed available forFrankRay78/NetPace(public repo, free tier) — captured as a workflow comment so future contributors don't doubt it.README.md,docs/RELEASING.md,CHANGELOG.md, andUSER_GUIDE.mdreflect the two new artifacts.Open questions / future work
.snupkgor separate symbol-artifact channel for AOT crash debugging.win-*-standalonearchives in line with the eventual Linux deprecation.win-arm64cross-compile fallback — ifwindows-11-armrunner availability becomes flaky or gets paywalled, document the cross-compile path as a contingency.Confirmed decisions
--versionand--helponly — noservers, no retry/timeout wrapper. Matches the two-command contract shipped by Add Linux Native AOT release artifacts (linux-x64, linux-arm64) for IoT deployments #176; broader smoke enhancements belong in a separate cross-cutting issue.CHANGELOG.md; per-release notes are GitHub-auto-generated perdocs/RELEASING.md#L67-L69.shell: bashon the smoke step (Git Bash ships with both Windows runners) with anif-branch forunzipvstar -xzf. Binary isNetPace(case-sensitive) on all platforms —NetPace.exeon Windows.windows-latest(x64) forwin-x64-aot,windows-11-arm(ARM64) forwin-arm64-aot. Block on failure (nocontinue-on-error); cross-compile rejected to preserve the native smoke test, mirroring the Linux AOT runner choice indocs/RELEASING.md#L33-L35.Related
IsAotCompatible=trueon both projects, the clean-trim warning policy, theXmlExtensions.csrewrite, the Humanizer resolution, and the AOT matrix infrastructure.release-binaries.yml— workflow being extended.src/NetPace.Console/NetPace.Console.csprojsrc/NetPace.Core/NetPace.Core.csprojCLAUDE.md— AOT-trim-safety constraint.docs/conventions/change-intent-records.md— CIR for Add Linux Native AOT release artifacts (linux-x64, linux-arm64) for IoT deployments #176 should reference this follow-up; whether this issue also warrants its own CIR depends on the answer to Add Linux Native AOT release artifacts (linux-x64, linux-arm64) for IoT deployments #176's Q7.