@@ -93,21 +93,18 @@ jobs:
9393 --sign "$APPLE_SIGNING_IDENTITY" "$ARTIFACT"
9494 codesign --verify --verbose "$ARTIFACT"
9595
96- # Notarize: zip, submit, wait. Bare binaries can't be stapled, so
97- # Gatekeeper does an online check on first run instead.
98- API_KEY_PATH="$RUNNER_TEMP/AuthKey.p8"
99- echo "$APPLE_API_KEY_BASE64" | base64 --decode > "$API_KEY_PATH"
96+ # Notarize: zip the binary and submit to the notary service.
97+ # Bare binaries can't be stapled, so Gatekeeper does an online check
98+ # on first run instead.
99+ export APPLE_API_KEY_PATH="$RUNNER_TEMP/AuthKey.p8"
100+ echo "$APPLE_API_KEY_BASE64" | base64 --decode > "$APPLE_API_KEY_PATH"
100101 ZIP_PATH="$RUNNER_TEMP/$ARTIFACT.zip"
101102 /usr/bin/ditto -c -k --keepParent "$ARTIFACT" "$ZIP_PATH"
102- xcrun notarytool submit "$ZIP_PATH" \
103- --key "$API_KEY_PATH" \
104- --key-id "$APPLE_API_KEY" \
105- --issuer "$APPLE_API_ISSUER" \
106- --wait
103+ ./scripts/notarize.sh "$ZIP_PATH"
107104
108105 # Cleanup
109106 security delete-keychain "$KEYCHAIN_PATH"
110- rm -f "$CERT_PATH" "$API_KEY_PATH " "$ZIP_PATH"
107+ rm -f "$CERT_PATH" "$APPLE_API_KEY_PATH " "$ZIP_PATH"
111108
112109 - name : Upload artifact
113110 uses : actions/upload-artifact@v4
@@ -153,29 +150,40 @@ jobs:
153150 sudo apt-get update
154151 sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
155152
156- - name : Write App Store Connect API key (macOS)
157- if : runner.os == 'macOS'
158- env :
159- APPLE_API_KEY_BASE64 : ${{ secrets.APPLE_API_KEY_BASE64 }}
160- run : |
161- mkdir -p ~/private_keys
162- echo "$APPLE_API_KEY_BASE64" | base64 --decode > ~/private_keys/AuthKey.p8
163- echo "APPLE_API_KEY_PATH=$HOME/private_keys/AuthKey.p8" >> $GITHUB_ENV
164-
165153 - name : Build Tauri app
166154 id : tauri
167155 uses : tauri-apps/tauri-action@v0
168156 env :
157+ # Signing only — notarization is done manually in the next step
158+ # because Tauri's built-in notarization uses `notarytool --wait`
159+ # which hangs on transient network errors in CI.
169160 APPLE_CERTIFICATE : ${{ secrets.APPLE_CERTIFICATE }}
170161 APPLE_CERTIFICATE_PASSWORD : ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
171162 APPLE_SIGNING_IDENTITY : ${{ secrets.APPLE_SIGNING_IDENTITY }}
172- APPLE_API_ISSUER : ${{ secrets.APPLE_API_ISSUER }}
173- APPLE_API_KEY : ${{ secrets.APPLE_API_KEY }}
174163 KEYCHAIN_PASSWORD : ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
175164 with :
176165 args : --target ${{ matrix.target }}
177166 includeUpdaterJson : false
178167
168+ - name : Notarize and staple DMG (macOS)
169+ if : runner.os == 'macOS'
170+ env :
171+ APPLE_API_KEY : ${{ secrets.APPLE_API_KEY }}
172+ APPLE_API_ISSUER : ${{ secrets.APPLE_API_ISSUER }}
173+ APPLE_API_KEY_BASE64 : ${{ secrets.APPLE_API_KEY_BASE64 }}
174+ run : |
175+ set -euo pipefail
176+ export APPLE_API_KEY_PATH="$RUNNER_TEMP/AuthKey.p8"
177+ echo "$APPLE_API_KEY_BASE64" | base64 --decode > "$APPLE_API_KEY_PATH"
178+
179+ DMG=$(ls target/${{ matrix.target }}/release/bundle/dmg/*.dmg | head -n1)
180+ echo "Notarizing $DMG"
181+ ./scripts/notarize.sh "$DMG"
182+ xcrun stapler staple "$DMG"
183+ xcrun stapler validate "$DMG"
184+
185+ rm -f "$APPLE_API_KEY_PATH"
186+
179187 - name : Upload desktop artifacts
180188 uses : actions/upload-artifact@v4
181189 with :
0 commit comments