Current state
.github/workflows/build-windows.yml builds the exe in a fairly fragile multi-tool chain:
go build (bare exe, no icon/manifest/version info)
- Download and silently install Resource Hacker from a GitHub user-attachments URL
- Five separate Resource Hacker invocations, each followed by a hardcoded
Start-Sleep (30-60s) to work around it needing time between operations, to inject the icon (twice, for MAINICON and GLFW_ICON), the manifest, and compiled version info
- Download and run upx to compress
- Download and install WiX (pinned to v5, see the MSI installer PRs) to build the installer
Steps 2-3 alone add several minutes of Start-Sleep and depend on an external, unversioned zip download that isn't in our control.
Proposal
We already use go-winres for local dev builds (src/winres/winres.json) to auto-embed the icon via a committed .syso file — see src/README.md. go-winres can also embed the manifest and version info (RT_MANIFEST, RT_VERSION keys in the same winres.json), which could let CI drop the entire Resource Hacker step.
Rough plan:
Why this matters
We hit real fragility in this pipeline already this cycle (WiX v7's licensing EULA, an XML comment bug) — reducing the number of external, versioned-by-URL dependencies in the release pipeline reduces the surface area for that kind of breakage, and cuts several minutes of pure Start-Sleep wait time per build.
Current state
.github/workflows/build-windows.ymlbuilds the exe in a fairly fragile multi-tool chain:go build(bare exe, no icon/manifest/version info)Start-Sleep(30-60s) to work around it needing time between operations, to inject the icon (twice, forMAINICONandGLFW_ICON), the manifest, and compiled version infoSteps 2-3 alone add several minutes of
Start-Sleepand depend on an external, unversioned zip download that isn't in our control.Proposal
We already use go-winres for local dev builds (
src/winres/winres.json) to auto-embed the icon via a committed.sysofile — see src/README.md. go-winres can also embed the manifest and version info (RT_MANIFEST,RT_VERSIONkeys in the samewinres.json), which could let CI drop the entire Resource Hacker step.Rough plan:
src/winres/winres.jsonto includeRT_MANIFEST(fromdist/windows/manifest.xml) andRT_VERSION(replacingdist/windows/versioninfo.rc).sysofiles stay in sync (they're already regenerated viago-winres makeper the existing docs)Start-Sleepcalls frombuild-windows.ymlandpr-test-build-windows.ymlsigcheck, etc.)Why this matters
We hit real fragility in this pipeline already this cycle (WiX v7's licensing EULA, an XML comment bug) — reducing the number of external, versioned-by-URL dependencies in the release pipeline reduces the surface area for that kind of breakage, and cuts several minutes of pure
Start-Sleepwait time per build.