Skip to content

ci: harden Windows release gates - #41

Draft
deepc0py wants to merge 9 commits into
mainfrom
ci/windows-release
Draft

deepc0py wants to merge 9 commits into
mainfrom
ci/windows-release

Conversation

@deepc0py

@deepc0py deepc0py commented Jul 19, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • compile releases with the exact Rust 1.97.1 compiler while retaining a distinct Rust 1.88.0 MSRV job
  • run exact Pester 6.0.1 installer coverage and native ARM64 Windows compile checks on windows-11-arm
  • build six native release targets on matching x64/ARM64 Linux, Intel/Apple Silicon macOS, and x64/ARM64 Windows runners
  • package verified, checksummed archives, install.ps1, exact SHA-256 checksums, and substantive CycloneDX/SPDX JSON SBOMs from cargo-auditable binaries
  • attest every payload plus the aggregate checksum manifest with SHA-pinned GitHub actions
  • keep candidate assets private until both native Windows runners install through the checksum-enforcing downloader and prove version, detached daemon lifecycle, concurrent named-pipe queries, uninstall, and config/profile preservation
  • expose only a prerelease for the identical clean-runner public-download proof, verify all 20 public asset attestations plus all public checksums, then promote to stable; failed verification removes the release and tag
  • scope contents: write to publication, promotion, and rollback jobs, with the release environment guarding first public exposure and final promotion

Release matrix

Target Native runner
x86_64-unknown-linux-gnu ubuntu-latest
aarch64-unknown-linux-gnu ubuntu-24.04-arm
x86_64-apple-darwin macos-15-intel
aarch64-apple-darwin macos-latest
x86_64-pc-windows-msvc windows-latest
aarch64-pc-windows-msvc windows-11-arm

Verification

  • actionlint .github/workflows/ci.yml .github/workflows/release.yml
  • embedded fail-closed workflow contract assertions
  • cargo +1.97.1 test --locked --all-targets — 107 passed
  • cargo +1.88.0 test --locked --all-targets — 107 passed
  • Pester 6.0.1 tests/install.Tests.ps1 — 16 passed locally; hosted Windows proof is tracked by the PR checks
  • local SBOM experiment with pinned Syft 1.48.0 confirmed cargo-auditable staging exposes 259 Rust dependency packages/components versus zero from a stripped plain-binary scan

Related to #34. Does not close #34; the issue remains open until a real v0.3.0 release exercises the hosted release path.

deepc0py added 9 commits July 19, 2026 05:26
…tests

The test matrix gains windows-latest so every PR builds and tests the
Windows code paths on stable MSVC. The binary is smoke-tested with
'incant.exe --version' from both pwsh and CMD before the suite runs, so
version parity with local VM checks holds even while the daemon
integration tests are being made cross-platform. A dedicated
'clippy (windows-latest)' job lints cfg(windows) code without renaming
the existing required 'clippy' context, and workflow_dispatch allows
manual reruns against VM findings.
Adds the Windows MSVC target to the release matrix. The release binary
is smoke-tested from both pwsh and CMD, then packaged with pwsh-native
commands into a zip containing incant.exe, README, LICENSE, CHANGELOG,
SECURITY.md, and the example config. The checksum is emitted as a
shasum-compatible line (lowercase hash, two spaces, bare file name, LF)
so the Linux publish job aggregates all *.sha256 files into SHA256SUMS
unchanged. Unix tarballs and their packaging are untouched.
Cross-compiles the ARM64 Windows binary on the x64 windows-latest
runner and packages it identically to the x86_64 zip
(incant-{version}-{target}.zip, shasum-compatible .sha256 line).
The pwsh/CMD smoke steps stay x86_64-only because the hosted runner
cannot execute ARM64 binaries; the native ARM64 smoke test runs in the
Windows 11 ARM VM before the release is cut.
A standalone windows-latest job installs the ARM64 MSVC target on
stable Rust and runs a locked debug build, surfacing missing
linker/SDK/target-lib setup on the x64 runner in every PR instead of
at tag time. Same SHA pins, unpersisted credentials, and read-only
permissions as the rest of the workflow.
Dedicated pester (windows-latest) job executes
tests/install.Tests.ps1 with Pester 5 from the runner image. A missing
or too-old Pester module, zero discovered tests, or any failing test
aborts the job; no module is ever installed from the gallery as an
unpinned fallback. The suite lands with the installer branch, so the
job stays red until that merge, matching the dependency already
accepted for the Windows test lane.
The publish job now runs 'shasum -a 256 --check --strict' against the
aggregated SHA256SUMS while the archives are still in dist, so
corruption or tampering between build and publish fails the release
instead of shipping, and the Windows-emitted checksum lines are proven
shasum-parseable. Version stripping in the Windows package step now
uses -creplace to match bash's case-sensitive ${GITHUB_REF_NAME#v}.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI/release: test Windows and publish verified Windows artifacts

1 participant