Skip to content

Sign and notarize release DMG#14

Merged
GordonBeeming merged 1 commit into
mainfrom
gb/sign-notarize-dmg
Jul 15, 2026
Merged

Sign and notarize release DMG#14
GordonBeeming merged 1 commit into
mainfrom
gb/sign-notarize-dmg

Conversation

@GordonBeeming

@GordonBeeming GordonBeeming commented Jul 15, 2026

Copy link
Copy Markdown
Owner

Summary

  • sign the final Vista DMG with the Developer ID certificate
  • notarize and staple the DMG distributed through GitHub and Homebrew
  • validate its signature, notarization ticket, disk image integrity, and Gatekeeper assessment before upload

Why

The app bundle was signed and notarized before packaging, but the downloaded DMG itself was unsigned. Notarizing the outermost distribution artifact gives macOS a signed, stapled container to assess.

User impact

Future Vista release DMGs will carry their own Developer ID signature and notarization ticket. No release is created by this PR.

Validation

  • git diff --check
  • workflow YAML parsed successfully with Ruby Psych
  • actionlint .github/workflows/build.yml (only existing Homebrew heredoc/backtick shellcheck warnings remain)

Summary by CodeRabbit

  • Bug Fixes
    • Improved macOS release packaging by signing, notarizing, and validating the DMG directly.
    • Added additional verification steps to help ensure distributed DMG files pass security checks.

Copilot AI review requested due to automatic review settings July 15, 2026 09:19
@gemini-code-assist

Copy link
Copy Markdown

Note

Gemini is unable to generate a review for this pull request due to the file types involved not being currently supported.

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The release workflow consolidates DMG creation, code signing, Apple notarization, ticket stapling, signature validation, image verification, and Gatekeeper assessment into one step.

Changes

Release packaging

Layer / File(s) Summary
DMG signing and notarization
.github/workflows/build.yml
The release job creates and signs the DMG, submits it for notarization, staples the ticket, and validates the signed image and Gatekeeper assessment.

Estimated code review effort: 2 (Simple) | ~10 minutes

Suggested reviewers: copilot

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely matches the main change: signing and notarizing the release DMG.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch gb/sign-notarize-dmg

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

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the release workflow to ensure the distributed DMG artifact (not just the app bundle inside it) is codesigned, notarized, stapled, and validated prior to uploading to GitHub Releases and updating the Homebrew cask. This aligns the release pipeline with macOS Gatekeeper expectations for the outermost downloadable container.

Changes:

  • Consolidates DMG creation and notarization into a single step and switches notarization target from an app ZIP to the final DMG.
  • Adds DMG codesigning plus verification, stapling, and multiple validation checks (stapler, hdiutil, spctl) before upload.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@GordonBeeming

Copy link
Copy Markdown
Owner Author

@codex review

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
.github/workflows/build.yml (1)

133-137: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider capturing the notarization log on failure for easier CI debugging.

notarytool submit --wait reports a terminal status but the detailed rejection reason (if Invalid) requires a separate xcrun notarytool log <submission-id> call. Without capturing the id/log, a failed release run gives little actionable detail beyond "non-zero exit."

♻️ Example: capture submission id and fetch log on failure
-          xcrun notarytool submit "${DMG}" \
-            --apple-id "${APPLE_ID}" \
-            --team-id "${APPLE_TEAM_ID}" \
-            --password "${APPLE_APP_PASSWORD}" \
-            --wait
+          SUBMISSION_ID=$(xcrun notarytool submit "${DMG}" \
+            --apple-id "${APPLE_ID}" \
+            --team-id "${APPLE_TEAM_ID}" \
+            --password "${APPLE_APP_PASSWORD}" \
+            --wait --output-format json | tee /tmp/notary-submit.json | jq -r .id)
+          xcrun notarytool log "${SUBMISSION_ID}" \
+            --apple-id "${APPLE_ID}" \
+            --team-id "${APPLE_TEAM_ID}" \
+            --password "${APPLE_APP_PASSWORD}" || true
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/build.yml around lines 133 - 137, Update the notarization
submission step around xcrun notarytool submit to capture its submission ID and,
when the submission fails or returns Invalid, invoke xcrun notarytool log with
that ID and print the detailed rejection log before exiting. Preserve the
existing Apple credentials, DMG input, and --wait behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In @.github/workflows/build.yml:
- Around line 133-137: Update the notarization submission step around xcrun
notarytool submit to capture its submission ID and, when the submission fails or
returns Invalid, invoke xcrun notarytool log with that ID and print the detailed
rejection log before exiting. Preserve the existing Apple credentials, DMG
input, and --wait behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: cef5b8af-eebb-4587-b711-fab2e32554e9

📥 Commits

Reviewing files that changed from the base of the PR and between cd38bbe and 90a183d.

📒 Files selected for processing (1)
  • .github/workflows/build.yml

@GordonBeeming

Copy link
Copy Markdown
Owner Author

CodeRabbit nitpick outcome: no change. notarytool submit --wait already emits the submission ID and terminal status in the release log; fetching the full rejection log is a separate debugging enhancement and is not needed to sign, notarize, staple, or validate the DMG.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Chef's kiss.

Reviewed commit: 90a183db1d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@GordonBeeming
GordonBeeming merged commit 073d7ba into main Jul 15, 2026
4 checks passed
@GordonBeeming
GordonBeeming deleted the gb/sign-notarize-dmg branch July 15, 2026 10:13
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.

2 participants