Repository navigation
ci(release): sign both Windows .zips through Azure Artifact Signing, replacing SignPath (#2302) [backport 0.9] - #2974
Merged
Conversation
…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>
Contributor
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.OpenSSF Scorecard
Scanned Files
|
mgradwohl
enabled auto-merge (squash)
October 26, 2026 01:36
5 of 13 tasks
This was referenced Oct 26, 2026
Closed
Closed
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
The hand backport of #2944 to
release/0.9, for v0.9.1. It'sgit cherry-pick -x 572e115b(#2944's squash commit onmain) with the conflicts resolved by hand. The backport action can't push workflow changes, so this one wasn't opened automatically. A tag runs therelease.ymlat the tagged commit, sorelease/0.9needs this file for v0.9.1 to be signed.Brought over from #2944, unchanged:
sign-windowsruns onwindows-2025inenvironment: release-signing. It signs in withazure/loginat tenant level (allow-no-subscriptions: true, withclient-id/tenant-idfrom the environment's secrets, over OIDC). It then signsTaskSmack.exeandTaskSmackHelper.exefrom both the x64 and the ARM64.zipwithazure/artifact-signing-action, writes each signed exe back over its own entry in its.zip, and checks that only those entries changed.main:azure/login@a641126d1b8aa4d1fa005f4f92df94a3a4c4c906 # v3.1.0azure/artifact-signing-action@c7ab2a863ab5f9a846ddb8265964877ef296ee82 # v2.0.0SIGNING_ENABLEDis defined once, by ref (v*tags,main,release/*,candidate/*), and reaches jobif:s throughvalidate'ssigningoutput.validaterefuses a real release that would be unsigned.matrix.signedis gone: both architectures sign.WINDOWS_EXPECTED_SIGNER: 'Matt Gradwohl', and theTASKSMACK_EXPECTED_SIGNERdefault incmake/Options.cmakeisMatt Gradwohl.cmake/VerifyWindowsSignatures.cmakenow requires the same subject, not the same thumbprint.cmake/CPackProjectConfig.cmake.inis updated to match.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.mdfinds nothing.docs/code-signing-policy.md, the User Guide's Verifying a Release section, the FAQ andtasksmack.md. All of these exist onrelease/0.9, and each merged without conflict.Left out: everything below is
main-only and isn't onrelease/0.9.verify-published-releasejob and the sharedtools/verify-windows-signatures.ps1:validate-windows-packagekeepsrelease/0.9's inline signature check. It is now equivalent to the script's body: it prints each exe's status, signer, thumbprint, issuer and timestamper, then runscmake -DTASKSMACK_VERIFY_DIR=$pkg -DTASKSMACK_EXPECTED_SIGNER=$env:WINDOWS_EXPECTED_SIGNER -P repo/cmake/VerifyWindowsSignatures.cmake.SIGNING_ENABLED.TASKSMACK_SCREENSHOTclean-quit smoke checks andtools/release-smoke-check.*: not brought over.release/0.9keeps its own smoke checks.validate-linux-upgrade) and ci(release): the installed helper's polkit action registers, and the helper answers TaskSmack's handshake through pkexec, before a release (#2723) #2891 (validate-linux-helper): not brought over.create-release'sneedsisrelease/0.9's list plusvalidate, which ci(release): sign both Windows .zips through Azure Artifact Signing, replacing SignPath (#2302) #2944 added so that theif:can readneeds.validate.outputs.signing. It doesn't includevalidate-linux-upgradeorvalidate-linux-helper.One extra edit the cherry-pick needed. On
release/0.9,validate-windows-package's sparse checkout ofcmake/VerifyWindowsSignatures.cmakewas gated onmatrix.signed && env.SIGNING_ENABLED == 'true'. Onmainthat step had already been reworked by #2946/#2933, so #2944 never touched it here. Oncematrix.signedis removed, that condition is always false: the checkout would be skipped and the signature check would find no script. It is nowif: 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 rewrittensign-windowsjob and the rewritten signing docs.Type of Change
Checklist
clang-tidyand addressed any warnings (no C++ changed)clang-formaton my changes (no C++ changed)pre-commit run --all-filesor installed pre-commit hooks (pre-commit run --files <touched>, actionlint included: all passed)WindowsSignatureGateScripttest still covers the unsigned refusal)Testing
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/loginreported "Azure CLI login succeeds by using OIDC", and the signing call reported "Signing completed with status 'Succeeded'".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 wereValid, CN=Matt Gradwohl.Additional Notes
SIGNPATH_ORGANIZATION_IDand secretSIGNPATH_API_TOKEN(see ci(release): sign both Windows .zips through Azure Artifact Signing, replacing SignPath (#2302) #2944). Nothing onmainorrelease/0.9reads them any more.🤖 Generated with Claude Code