Skip to content

Sign Windows release binaries on tag builds - #1482

Merged
frankslin merged 1 commit into
masterfrom
fix-winget-tag-signing
Aug 22, 2026
Merged

frankslin merged 1 commit into
masterfrom
fix-winget-tag-signing

Conversation

@frankslin

Copy link
Copy Markdown
Collaborator

The five SignPath steps in release-winget.yml were gated on github.event_name == 'workflow_dispatch', so the run triggered by pushing a ver.* tag skipped signing entirely — while Upload to GitHub release (gated only on startsWith(github.ref, 'refs/tags/')) still uploaded the portable zip to the release.

That is how the 1.4.1 Windows zip shipped unsigned: run 29196952454 shows all five signing steps as skipped. README and NEWS now state that Windows binaries are Authenticode-signed from 1.4.2 on, so the default path has to actually sign.

Changes

  • Gate the signing steps on inputs.sign_windows_binaries || startsWith(github.ref, 'refs/tags/'). A tag build always signs, and a failed signing request fails the job rather than silently producing an unsigned artifact. Manual dispatch on a non-tag ref is unchanged and still opt-in.
  • Set wait-for-completion-timeout-in-seconds: 1800. The release-signing policy requires a human approver (confirmed in run 32588647662, where approval took ~2m40s), and the action's default is 600s.
  • Note in the input description that tag builds always sign.

Verification

release-signing was exercised end to end in run 32588647662 (dry-run) and 32589112455 (publish); both Windows npm binaries came back signed by CN=SignPath Foundation, ...; status: Valid. The winget artifact configuration (opencc-winget-portable-win32-x64) has not yet been signed under release-signing — the first ver.* tag after this merge will be its first run, and it will need a manual approval.

The five SignPath steps were gated on github.event_name ==
'workflow_dispatch', so the run triggered by pushing a ver.* tag skipped
signing entirely while still uploading the portable zip to the release.
That is how the 1.4.1 Windows zip shipped unsigned, and README and NEWS
now state that 1.4.2 onwards is Authenticode-signed.

Detailed Changes:
- **Signing condition**: gate the steps on
  `inputs.sign_windows_binaries || startsWith(github.ref, 'refs/tags/')`
  so a tag build always signs. A failed signing request now fails the job
  instead of silently producing an unsigned artifact. Manual dispatch on a
  non-tag ref is unchanged and still opt-in.
- **Approval timeout**: set wait-for-completion-timeout-in-seconds to 1800.
  The release-signing policy requires a human approver, and the action's
  600s default leaves little room to notice the request and approve it.
- **Input description**: note that tag builds always sign.
@frankslin
frankslin merged commit 025f371 into master Aug 22, 2026
46 of 47 checks passed
@frankslin
frankslin deleted the fix-winget-tag-signing branch August 22, 2026 18:22
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.

1 participant