Skip to content

ci(release): sign both Windows .zips through Azure Artifact Signing, replacing SignPath (#2302) [backport 0.9] - #2974

Merged
mgradwohl merged 1 commit into
release/0.9from
candidate/azure-signing-2302-0.9
Oct 26, 2026
Merged

mgradwohl merged 1 commit into
release/0.9from
candidate/azure-signing-2302-0.9

Conversation

@mgradwohl

Copy link
Copy Markdown
Owner

Description

The hand backport of #2944 to release/0.9, for v0.9.1. It's git cherry-pick -x 572e115b (#2944's squash commit on main) with the conflicts resolved by hand. The backport action can't push workflow changes, so this one wasn't opened automatically. A tag runs the release.yml at the tagged commit, so release/0.9 needs this file for v0.9.1 to be signed.

Branch name: this branch is called candidate/azure-signing-2302-0.9 only so that its dry run can enter the release-signing environment and really sign. That environment admits only v* tags and the main, release/* and candidate/* branches.

Brought over from #2944, unchanged:

  • sign-windows runs on windows-2025 in environment: release-signing. It signs in with azure/login at tenant level (allow-no-subscriptions: true, with client-id/tenant-id from the environment's secrets, over OIDC). It then signs TaskSmack.exe and TaskSmackHelper.exe from both the x64 and the ARM64 .zip with azure/artifact-signing-action, writes each signed exe back over its own entry in its .zip, and checks that only those entries changed.
  • Pins: the same SHAs as main:
    • azure/login@a641126d1b8aa4d1fa005f4f92df94a3a4c4c906 # v3.1.0
    • azure/artifact-signing-action@c7ab2a863ab5f9a846ddb8265964877ef296ee82 # v2.0.0
  • Gating:
  • Signer:
    • WINDOWS_EXPECTED_SIGNER: 'Matt Gradwohl', and the TASKSMACK_EXPECTED_SIGNER default in cmake/Options.cmake is Matt Gradwohl.
    • cmake/VerifyWindowsSignatures.cmake now requires the same subject, not the same thumbprint.
    • cmake/CPackProjectConfig.cmake.in is updated to match.
  • SignPath retired: SIGNPATH_SIGNING_POLICY, vars.SIGNPATH_SIGNING_ENABLED, the SignPath action and steps, and the test-signing trust step are all gone. grep -rn 'SIGNPATH\|SignPath\|test-signing\|SigningPolicy' .github cmake tools docs CONTRIBUTING.md README.md tasksmack.md finds nothing.
  • Docs: CONTRIBUTING.md's Windows code signing section, README, docs/code-signing-policy.md, the User Guide's Verifying a Release section, the FAQ and tasksmack.md. All of these exist on release/0.9, and each merged without conflict.

Left out: everything below is main-only and isn't on release/0.9.

One extra edit the cherry-pick needed. On release/0.9, validate-windows-package's sparse checkout of cmake/VerifyWindowsSignatures.cmake was gated on matrix.signed && env.SIGNING_ENABLED == 'true'. On main that step had already been reworked by #2946/#2933, so #2944 never touched it here. Once matrix.signed is removed, that condition is always false: the checkout would be skipped and the signature check would find no script. It is now if: env.SIGNING_ENABLED == 'true'.

Part of #2302

PR Size

🔴 Large (~431 added / ~294 removed lines over 10 files): the same change as #2944, minus the main-only parts. Most of it is the rewritten sign-windows job and the rewritten signing docs.

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Build/CI improvement

Checklist

  • I have read the CONTRIBUTING guidelines
  • My code follows the project's coding standards
  • I have run clang-tidy and addressed any warnings (no C++ changed)
  • I have run clang-format on my changes (no C++ changed)
  • I have run pre-commit run --all-files or installed pre-commit hooks (pre-commit run --files <touched>, actionlint included: all passed)
  • I have added tests that prove my fix/feature works (proved by the signed dry run below; the existing WindowsSignatureGateScript test still covers the unsigned refusal)
  • All new and existing tests pass
  • I have updated documentation as needed

Testing

pre-commit run --files <touched files>     # all hooks passed, actionlint included
gh workflow run release.yml --ref candidate/azure-signing-2302-0.9 -f dry_run=true

Dry run: 40250896796, run from this branch on 45ff48d with dry_run=true. Every job passed: Validate, both Linux and both Windows builds, Sign Windows Packages (Azure Artifact Signing), both Linux and both Windows validations, all four reproducibility checks, and Create GitHub Release. Nothing was cancelled.

sign-windows: azure/login reported "Azure CLI login succeeds by using OIDC", and the signing call reported "Signing completed with status 'Succeeded'".

File Status Signer Issuer Timestamp
x64 TaskSmack.exe Valid CN=Matt Gradwohl, O=Matt Gradwohl, L=REDMOND, S=wa, C=US Microsoft ID Verified CS EOC CA 04 Microsoft Public RSA Time Stamping Authority
x64 TaskSmackHelper.exe Valid same same same
arm64 TaskSmack.exe Valid same same same
arm64 TaskSmackHelper.exe Valid same same same

Each .zip (TaskSmack-0.9.0-win64.zip, TaskSmack-0.9.0-windows-arm64.zip) reported "65 entries, only the signed executables changed."

validate-windows-package, both x64 and arm64: "VerifyWindowsSignatures: TaskSmack.exe and TaskSmackHelper.exe are signed and timestamped by Matt Gradwohl". Both executables were Valid, CN=Matt Gradwohl.

Additional Notes

🤖 Generated with Claude Code

…replacing SignPath (#2302) (#2944)

* ci(release): sign both Windows .zips through Azure Artifact Signing, replacing SignPath (#2302)

sign-windows now runs on windows-2025 in the release-signing environment, signs in with
azure/login over GitHub OIDC (no client secret) and signs TaskSmack.exe and
TaskSmackHelper.exe from the x64 and ARM64 .zips with azure/artifact-signing-action
(account tasksmacksigning, profile tasksmack-release, SHA-256 digest, RFC 3161 SHA-256
timestamp from timestamp.acs.microsoft.com, every credential but the Azure CLI's
excluded). Each signed executable is written back over its own .zip entry, and the job
checks nothing else in the .zip changed, so packaging, the .zip layout and the
reproducibility comparison against the unsigned .zip work as they did with SignPath.

Signing is on exactly when the run may enter release-signing (v* tags; main, release/*
and candidate/* branches), defined once as SIGNING_ENABLED and exposed to job `if:`s
through validate's `signing` output; other dry runs package unsigned, without the
helper, as before. validate now refuses any real release SIGNING_ENABLED would leave
unsigned (#2745), and validate-windows-package checks both architectures' signatures.

WINDOWS_EXPECTED_SIGNER and TASKSMACK_EXPECTED_SIGNER become 'Matt Gradwohl'.
VerifyWindowsSignatures.cmake matches the signer by name and requires both files to
name the same subject instead of the same thumbprint, since Artifact Signing
certificates rotate every few days. SignPath's env, steps and test-signing trust
handling are gone; the docs describe the new signer and how to check it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci(release): sign in to Azure at tenant level, as the signer role doesn't make the subscription visible (#2302)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 572e115)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mgradwohl mgradwohl added this to the v0.9.1 milestone Oct 26, 2026
@mgradwohl mgradwohl added ci Refers to issues in the ci workflow release security agent:Windows Owned by the Windows Claude session (bug-fix conveyor) labels Oct 26, 2026
@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling Developer tooling, CI, editor config, and automation labels Oct 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

OpenSSF Scorecard

PackageVersionScoreDetails
actions/azure/artifact-signing-action c7ab2a863ab5f9a846ddb8265964877ef296ee82 UnknownUnknown
actions/azure/login a641126d1b8aa4d1fa005f4f92df94a3a4c4c906 UnknownUnknown

Scanned Files

  • .github/workflows/release.yml

This branch was successfully deployed

1 active deployment
release-signing — 45ff48d9 Deployed Oct 26, 2026 by mgradwohl via Sign Windows Packages (Azure Artifact Signing) #37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent:Windows Owned by the Windows Claude session (bug-fix conveyor) ci Refers to issues in the ci workflow documentation Improvements or additions to documentation release security tooling Developer tooling, CI, editor config, and automation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant