Skip to content

Commit 47c7625

Browse files
committed
Merge remote-tracking branch 'origin/main' into HEAD
2 parents 09b8ece + 35ca233 commit 47c7625

2 files changed

Lines changed: 30 additions & 4 deletions

File tree

.github/workflows/desktop-release.yml

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,31 @@ jobs:
236236
working-directory: apps/desktop
237237
run: pnpm exec electron-builder --mac dmg zip --publish never
238238
239+
# electron-builder notarizes and staples the .app but never the disk
240+
# image around it. A quarantined, unnotarized DMG is what Gatekeeper
241+
# reports as "damaged" on some macOS builds, so give the image its own
242+
# ticket and staple it. The API key is preferred; the Apple ID +
243+
# app-specific password pair is the fallback, mirroring electron-builder.
244+
- name: Notarize and staple macOS DMG
245+
shell: bash
246+
run: |
247+
set -euo pipefail
248+
dmg_path="$(find apps/desktop/dist -maxdepth 1 -type f -name '*.dmg' -print -quit)"
249+
if [ -z "$dmg_path" ]; then
250+
echo 'macOS DMG not found' >&2
251+
exit 1
252+
fi
253+
if [ -n "${APPLE_API_KEY:-}" ]; then
254+
auth=(--key "$APPLE_API_KEY" --key-id "$APPLE_API_KEY_ID" --issuer "$APPLE_API_ISSUER")
255+
elif [ -n "${APPLE_ID:-}" ]; then
256+
auth=(--apple-id "$APPLE_ID" --password "$APPLE_APP_SPECIFIC_PASSWORD" --team-id "$APPLE_TEAM_ID")
257+
else
258+
echo 'No notarization credentials configured; the DMG cannot be notarized.' >&2
259+
exit 1
260+
fi
261+
xcrun notarytool submit "$dmg_path" "${auth[@]}" --wait --timeout 30m
262+
xcrun stapler staple "$dmg_path"
263+
239264
- name: Verify macOS update artifacts
240265
shell: bash
241266
env:
@@ -293,12 +318,13 @@ jobs:
293318
exit 1
294319
fi
295320
verify_app "$dmg_app"
296-
# electron-builder notarizes and staples the .app, then packs the
297-
# already-stapled bundle into the disk image; the image itself never
298-
# receives a ticket. Validate the staple where it actually lives.
299321
xcrun stapler validate "$dmg_app"
300322
cleanup_mount
301323
trap - EXIT
324+
# The image carries its own ticket (see the notarize step above);
325+
# Gatekeeper must accept it exactly as a user's browser download.
326+
xcrun stapler validate "$dmg_path"
327+
spctl --assess --type open --context context:primary-signature --verbose=2 "$dmg_path"
302328
303329
- name: Mint releases-repo token
304330
if: needs.prepare.outputs.publish == 'true'

apps/desktop/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@pymodel/pythinker-desktop",
33
"description": "Pythinker desktop application with tray-owned Host lifecycle",
4-
"version": "0.3.1",
4+
"version": "0.3.2",
55
"private": true,
66
"type": "module",
77
"main": "dist/main.js",

0 commit comments

Comments
 (0)