- Use D16 VMs (16 vCPU) for all Windows CI runners
- Pin Node.js to 24.3.0 (ABI 137) for duckdb prebuilt + test compat
- Wrap test runner in vs-shell.ps1 so node-gyp has cl.exe
- Revert ccache persistent config (VMs are ephemeral)
- Restore Uninstall-Windows-Defender (reboot clears pending state)
- Add Windows ARM64 to install.ps1, install.sh, bun-release
- Set parallelism to 2 for Windows tests
- Clarify Packer vs CI runner VM sizes in comments
[build images]
- Cygwin: fix path to root/bin, use Machine scope (survives Sysprep)
- Git: add usr/bin to Machine PATH (ships cat, head, tail, echo, etc.)
Previously cygwin used User scope PATH which was wiped by Sysprep,
and the path was wrong (missing root/ prefix).
[build images]
[publish images] and normal CI expect 'windows-x64-2019-v13' but
machine.mjs was publishing as 'windows-x64-2019-build-v13'.
Now image_name is passed directly to Packer, matching ci.mjs:
- publish-image: windows-x64-2019-v13
- create-image: windows-x64-2019-build-37194
[build images]
bun.sh/install.ps1 installs to user profile PATH which is lost
after Sysprep generalizes the image. Copy to C:\Windows\System32
like we do for ARM64.
[build images]
Registry key clearing alone doesn't satisfy spopk.dll's reboot
check. A real reboot between VS install and Sysprep clears the
Component Based Servicing pending state.
[build images]
VS Build Tools installer and Windows Updates leave RebootPending
and PendingFileRenameOperations flags that cause Sysprep validation
to fail with 'one or more Windows updates that require a reboot'.
[build images]
$LASTEXITCODE was polluted by cygwin setup failure. Clear it before
sysprep to prevent false positive exit code check. The timeout-based
polling loop catches real sysprep failures.
[build images]
Install-Scoop-Package uses SilentlyContinue which never throws,
so the catch block (blob storage mirror) was unreachable. Now we
check if nssm is actually on PATH after the scoop attempt.
[build images]
Move error suppression from Install-7zip to Install-Scoop-Package so
all scoop installs are resilient to non-fatal post_install errors
(7zip 7zr.exe locked, llvm-arm64 missing Uninstall.exe, etc).
[build images]
The Remove-Item error on 7zr.exe happens on ARM64 regardless of user
context (packer user, not just SYSTEM). Temporarily set ErrorActionPreference
to SilentlyContinue and convert all output streams to strings so the
error doesn't propagate to PowerShell's exit code.
[build images]
The ARM64 Remove-Item error only happens under Azure Run Command
SYSTEM context. With Packer's WinRM, scoop runs as the packer user
and the post_install cleanup works fine.
[build images]
Replaces Azure Run Command approach with Packer for Windows CI images.
Packer connects via WinRM (native, no x64 emulation on ARM64),
handles sysprep automatically, and provides full output logging.
- scripts/packer/windows-x64.pkr.hcl: Windows Server 2019 x64
- scripts/packer/windows-arm64.pkr.hcl: Windows 11 ARM64 (direct to gallery)
- scripts/packer/variables.pkr.hcl: shared variables
- machine.mjs: routes Azure Windows builds through Packer
[build images]
Only use Azure Run Command displayStatus to detect real failures.
stderr contains non-error output from rustup, cargo, PowerShell
warnings, etc.
[build images]
Azure Run Command uses x64-emulated PowerShell on ARM64 VMs, which
causes all tools to think they're on x64. Use Sysnative path to
re-launch bootstrap as native ARM64 so PROCESSOR_ARCHITECTURE,
package installs, cmake, and everything else sees the real arch.
[build images]
Azure Run Command runs x64-emulated PowerShell on ARM64 VMs, so
$env:PROCESSOR_ARCHITECTURE reports AMD64. The registry value at
HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
always reports the real architecture.
[build images]
RuntimeInformation.OSArchitecture doesn't exist in PowerShell 5.1
(which Azure Run Command uses), so IsARM64 was always false. This
caused ALL ARM64-specific code paths to be skipped.
[build images]
- machine.mjs: use C:\Scoop\apps\nodejs\current\node.exe instead of
bare 'node' which isn't in Azure Run Command PATH
- azure.mjs: spawnSafeFn now throws on non-zero exit code so bootstrap
failures actually stop the build instead of capturing broken images
[build images]
Child process scoop installs break PATH/shims. Only use child process
for 7zip on ARM64 (post_install error). Everything else runs in-process.
nssm falls back to blob storage mirror when nssm.cc is down.
[build images]
- VS installer exit code 3010 (reboot required) is not a real error
- mingw command is gcc, not mingw
- Use powershell -Command for scoop install isolation
[build images]
Scoop's 7zip post_install throws a terminating error on ARM64 that
propagates regardless of ErrorActionPreference. Running scoop in a
child PowerShell process isolates the error completely.
[build images]
7zip is a Scoop dependency of git. On ARM64 SYSTEM, 7zip's post_install
fails trying to delete 7zr.exe from TEMP. Fix by:
1. Moving Install-7zip before Install-Git so it's already installed
2. Using SilentlyContinue in Install-Scoop-Package then verifying
[build images]
The Remove-Item error in Scoop's 7zip post_install is a terminating
error that propagates through try/catch. Use SilentlyContinue to
suppress it, then verify 7z is actually installed.
[build images]
- 7zip: tolerate post_install cleanup error (access denied on TEMP)
- Rust: set CARGO_HOME/RUSTUP_HOME before rustup-init to avoid
SYSTEM profile path issue (Move-Item failure)
- nssm: fall back to blob storage mirror when nssm.cc returns 503