Skip to content

fix(ci): notarize release candidates like stable releases - #262

Merged
EtienneLescot merged 1 commit into
release/v1.9.0from
fix/notarize-release-candidates
Aug 4, 2026
Merged

fix(ci): notarize release candidates like stable releases#262
EtienneLescot merged 1 commit into
release/v1.9.0from
fix/notarize-release-candidates

Conversation

@EtienneLescot

@EtienneLescot EtienneLescot commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Summary

The four macOS notarization steps carried && !contains(github.ref_name, '-'), which skipped them for every pre-release — -rc.N tags included. This removes that clause from all four.

Why

Testers paid the visible cost. A DMG signed with Developer ID but not notarized is still refused by Gatekeeper. Measured on the v1.9.0-rc.1 bundle after signing it with the real certificate:

$ spctl -a -vv Openscreen.app
rejected
source=Unnotarized Developer ID
origin=Developer ID Application: Etienne Lescot (M4LK7C6S84)

So every RC tester had to know about xattr -rd com.apple.quarantine before they could open the build they were being asked to test. That drop-off does not show up anywhere.

The release paid the cost that mattered more. With the skip in place, notarization never ran until the stable tag — meaning the first real exercise of the credentials, the certificate chain, and Apple's acceptance of every nested Mach-O landed on the highest-stakes build in the cycle.

That is not hypothetical. The very first run with signing enabled (30950523913) died in Package .app bundle:

⨯ Please remove prefix "Developer ID Application:" from the specified name
  — appropriate certificate will be chosen automatically

A malformed MAC_CSC_NAME. It was caught only because a full build was dispatched deliberately to test the pipeline. Under the old condition, that same class of drift would surface during a promotion.

Notarizing each RC turns every candidate into a rehearsal of the path the stable build depends on.

Verified

Run 30952306419, a workflow_dispatch on release/v1.9.0 — which notarizes today only because the branch name happens to have no hyphen:

Package .app bundle
  • signing  identityHash=A0FBC5FB289F9C2B66E1DA2BC7A8F8E8C54A76D1

Verify .app code signature
  signature identifier=com.etiennelescot.openscreen  expected=com.etiennelescot.openscreen

Notarize DMG
  status: Accepted

Validate stapled DMG
  The validate action worked!
  Openscreen-macOS-Apple-Silicon-1.9.0-rc.1.dmg: accepted
  source=Notarized Developer ID

status: Accepted also settles an open question: Apple inspects every Mach-O in the bundle, so the three helpers under Contents/Resources/electron/native/bin/ do inherit the Developer ID from electron-builder. They are not reached by a manual codesign --deep, only by electron-builder's own signing pass.

Trade-off

A few minutes per macOS job, and a new dependency on Apple's notary service being reachable — --wait is capped at 15 minutes. If that ever turns flaky enough to block RCs, the answer is continue-on-error on pre-releases, not restoring the skip. Not adding it pre-emptively.

Documentation

Five places asserted the old behaviour and are corrected in the same commit, so nothing claims RCs are unnotarized once this lands: AGENTS.md, .harness/docs/git-workflow.md, and the build-and-packaging, ci-workflows and release-and-secrets pages. npm run docs:check passes (22 files).

Related issue

Refs #

Type of change

  • Enhancement

Release impact

  • Patch

Desktop impact

  • macOS
  • Installer / packaging

Testing

Workflow YAML parses (js-yaml); npm run docs:check OK. No contains(github.ref_name, ...) remains in build.yml outside the explanatory comment. The notarization path itself is proven green by run 30952306419 above — this PR only widens which tags reach it.

The four notarization steps carried `&& !contains(github.ref_name, '-')`,
which skipped them for every pre-release. Two costs, and the second is
the one that mattered.

Testers paid the first. A DMG signed with Developer ID but not notarized
is still refused by Gatekeeper — `spctl` answers `rejected, source=
Unnotarized Developer ID` — so anyone testing an RC had to know about
`xattr -rd com.apple.quarantine` before they could open the build they
were being asked to try.

The release paid the second. Notarization never ran until the stable tag,
so the first exercise of the credentials, the certificate chain and
Apple's acceptance of every nested Mach-O landed on the highest-stakes
build there is. The run that first enabled signing died in `Package .app
bundle` on a malformed `MAC_CSC_NAME`; it was caught only because a full
build was dispatched deliberately. Notarizing each RC makes every
candidate a rehearsal.

The trade is a few minutes per macOS job and a dependency on Apple's
notary service being reachable, with `--wait` capped at 15 minutes. If
that turns flaky enough to block RCs, the answer is `continue-on-error`
on pre-releases rather than skipping them again.

Five documentation sites asserted the old behaviour and are corrected
here, so nothing claims RCs are unnotarized after this lands.
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6e1fee55-89f5-40b0-a75b-f5f377fd6988

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@EtienneLescot
EtienneLescot merged commit a19207a into release/v1.9.0 Aug 4, 2026
12 checks passed
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