Repository navigation
Conversation
Azure Artifact Signing bills per signature (AINFRA-3664, part of AINFRA-3645). Each Windows build makes about 94 signatures, and 73% of them came from feature branches between 1 Aug and 11 Nov. Trunk and `release/*` keep signing, because `RELEASING.md` ships the version-bump pull request's artifacts. --- Generated with the help of Claude Code (Opus 5.5), https://code.claude.com
--- Generated with the help of Claude Code (Opus 5.5), https://code.claude.com
Trunk and `release/*` builds can ship, so dropping `SIGN_WINDOWS_BUILD` from their step must not produce a green, unsigned installer. `$LASTEXITCODE -ne 0` passes when no native command ran (`exit $null` exits 0), which the test for a signed feature branch reproduced. --- Generated with the help of Claude Code (Opus 5.5), https://code.claude.com
--- Generated with the help of Claude Code (Opus 5.5), https://code.claude.com
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the
|
PowerShell on Windows skips extensionless `#!/bin/sh` stubs and runs the real `bash` and `npm` further down `PATH`, so `unit (windows-latest)` failed 5 of these tests. --- Generated with the help of Claude Code (Opus 5.5), https://code.claude.com
|
@mokagio does this take into account beta releases? I assumed we'd need to sign those for testing? |
|
@ryanwelcher hey Ryan, thank you for checking on beta releases! If my understanding of the release flow is correct, then yes this takes them into account, too. That's because: Betas start like stable release, from a contributor-toolkit/RELEASING.md Lines 5 to 11 in bb15f32 The filter is on |
Why
Azure Artifact Signing bills per signature, and the October bill jumped (AINFRA-3645).
Each Windows build here makes about 94 signatures, and from 1 Aug to 11 Nov 73% of this repo's 66k signatures came from feature branches.
Given those builds are for reviewers to try, not to ship, I think it's okay to compromise and disable code signing, at least temporarily while we get to the bottom of the billing overage.
What changes
release/*keep signing, becauseRELEASING.mdships the artifacts from therelease/X.Y.Zpull request's build.build_windows.ps1fails either if it would build unsigned.macOS and Linux don't change. Apple doesn't bill per signature.
How to test this
Platforms: Windows, because the change is to Windows signing in CI. There's no app change, so there's nothing to click through.
SIGN_WINDOWS_BUILD is not set, building unsigned, has no Setup code signing section, and uploads the.exe.node --test tests/unit/windows-build-signing.test.cjs(needspwsh; it skips without). It fails against the previousbuild_windows.ps1: unsigned trunk andrelease/*builds went green, and a signed build exited 0 straight after the signing setup.What must not have happened: a trunk or
release/*build producing an unsigned installer. The tests cover it, and the first trunk build after merging shows it for real.Risks and limitations
release/X.Y.Zwould build unsigned and the release checklist would catch it.RELEASING.mdalready requires that name.Related
Part of AINFRA-3664. Studio made the same change in Automattic/studio#5879.
Design decisions and alternatives considered
The issue suggested gating every build behind a block. Trunk and
release/*sign automatically instead, because the release ships the bump PR's build, and a forgotten unblock there would ship unsigned or cost a rebuild. Trunk was 27% of signatures, so it isn't worth the extra release step.Signing only the installer after the build would leave the inner binaries unsigned, so the on-demand path rebuilds instead.
87 of the 94 signatures are dugite's bundled Git binaries. Skipping already-signed third-party files would cut the cost of signed builds too. That's a separate follow-up.
Review outcome (required — see AGENTS.md)
3 [fix here] · 2 [follow-up]: all 3 fixed, and 1 follow-up is addressed in the docs.
Fixed: nothing in CI caught a shipping branch building unsigned.
build_windows.ps1now fails it, andtests/unit/windows-build-signing.test.cjscovers it.Fixed:
if ($LASTEXITCODE -ne 0)letexit $nullpass. It now usesif ($LASTEXITCODE).Fixed (no change needed): the worry was that a build left at the block would hold a PR as pending on GitHub. This pipeline doesn't publish commit statuses, and
publish_blocked_as_pendingis off.Follow-up: the block waits for macOS and Linux. Listed under Risks.
Addressed in docs: the signed and unsigned installers have the same file name. The docs point to the Windows Build (signed) job.
Review: completed. A separate Claude agent (Opus 5.5) followed
.github/instructions/code-review.instructions.mdon15c51e9against basebb15f32.npm run lintpasses. Innpm test, the 7 new tests and the signing tests pass. The other 309 failures are local only: dugite's bundled Git wasn't downloaded because install scripts are disabled on this machine.Since review:
15c51e9 → d704556adds the fixes above, the test, and Windows-compatible stubs afterunit (windows-latest)failed on the first push. Not re-reviewed;unitpasses on macOS and Windows.