@@ -12,7 +12,7 @@ permissions:
1212jobs :
1313 build :
1414 runs-on : macos-latest
15-
15+
1616 steps :
1717 - name : Checkout code
1818 uses : actions/checkout@v5
@@ -26,48 +26,88 @@ jobs:
2626 - name : Install dependencies
2727 run : npm ci
2828
29- - name : Import code signing certificate
29+ - name : Setup code signing
3030 if : env.APPLE_CERTIFICATE != ''
3131 env :
3232 APPLE_CERTIFICATE : ${{ secrets.APPLE_CERTIFICATE }}
3333 APPLE_CERTIFICATE_PASSWORD : ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
3434 run : |
35- echo "$APPLE_CERTIFICATE" | base64 --decode > certificate.p12
36- security create-keychain -p "" build.keychain
35+ # Create keychain
36+ security create-keychain -p "build " build.keychain
3737 security default-keychain -s build.keychain
38- security unlock-keychain -p "" build.keychain
39- security import certificate.p12 -k build.keychain -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign -T /usr/bin/security
40- security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "" build.keychain
41- rm certificate.p12
38+ security unlock-keychain -p "build" build.keychain
39+ security set-keychain-settings -t 3600 -u build.keychain
40+
41+ # Import certificate
42+ echo "$APPLE_CERTIFICATE" | base64 --decode > $RUNNER_TEMP/certificate.p12
43+ security import $RUNNER_TEMP/certificate.p12 -k build.keychain -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign -T /usr/bin/security
44+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "build" build.keychain
45+ security list-keychains -d user -s build.keychain $(security list-keychains -d user | tr -d '"')
46+ rm $RUNNER_TEMP/certificate.p12
47+
48+ # Verify certificate import
49+ echo "=== Signing identities ==="
50+ security find-identity -v -p codesigning
51+
52+ IDENTITY_COUNT=$(security find-identity -v -p codesigning | grep -c "valid identities found" || echo "0")
53+ if echo "$IDENTITY_COUNT" | grep -q "0"; then
54+ echo "WARNING: No code signing identity found. Check that APPLE_CERTIFICATE contains a Developer ID Application certificate with private key."
55+ fi
4256
4357 - name : Build application
4458 run : npm run build
4559
60+ - name : Sign native binary
61+ if : env.APPLE_CERTIFICATE != ''
62+ env :
63+ APPLE_CERTIFICATE : ${{ secrets.APPLE_CERTIFICATE }}
64+ run : |
65+ security unlock-keychain -p "build" build.keychain
66+
67+ IDENTITY=$(security find-identity -v -p codesigning | grep "Developer ID Application" | head -1 | awk -F'"' '{print $2}')
68+
69+ if [ -n "$IDENTITY" ] && [ -f "native/mouse-telemetry" ]; then
70+ echo "Signing native/mouse-telemetry with: $IDENTITY"
71+ codesign --force --options runtime --timestamp --sign "$IDENTITY" native/mouse-telemetry
72+ codesign -vv native/mouse-telemetry
73+ else
74+ echo "Skipping native binary signing (no identity or binary not found)"
75+ fi
76+
4677 - name : Package application
4778 env :
48- APPLE_ID : ${{ secrets.APPLE_ID }}
49- APPLE_APP_SPECIFIC_PASSWORD : ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
50- APPLE_TEAM_ID : ${{ secrets.APPLE_TEAM_ID }}
51- run : npm run package:mac -- --publish never
79+ CSC_KEYCHAIN : build.keychain
80+ CSC_KEYCHAIN_PASSWORD : build
81+ run : |
82+ security unlock-keychain -p "build" build.keychain
83+ npm run package:mac -- --publish never
5284
5385 - name : Notarize application
54- if : env.APPLE_ID != '' && env.APPLE_APP_SPECIFIC_PASSWORD != ''
5586 env :
5687 APPLE_ID : ${{ secrets.APPLE_ID }}
5788 APPLE_APP_SPECIFIC_PASSWORD : ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
5889 APPLE_TEAM_ID : ${{ secrets.APPLE_TEAM_ID }}
5990 run : |
60- xcrun notarytool submit release/*.zip \
91+ # Find the zip file
92+ ZIP_FILE=$(find release -name "*.zip" | head -1)
93+ echo "Notarizing: $ZIP_FILE"
94+
95+ # Submit for notarization
96+ xcrun notarytool submit "$ZIP_FILE" \
6197 --apple-id "$APPLE_ID" \
6298 --password "$APPLE_APP_SPECIFIC_PASSWORD" \
6399 --team-id "$APPLE_TEAM_ID" \
64100 --wait
65101
66102 - name : Staple notarization
67- if : env.APPLE_ID != '' && env.APPLE_APP_SPECIFIC_PASSWORD != ''
68103 run : |
69- xcrun stapler staple release/*.dmg
70- xcrun stapler staple release/*.zip
104+ # Staple the app inside the DMG
105+ for dmg in release/*.dmg; do
106+ if [ -f "$dmg" ]; then
107+ echo "Stapling $dmg"
108+ xcrun stapler staple "$dmg" || echo "Failed to staple $dmg"
109+ fi
110+ done
71111
72112 - name : Upload release artifacts
73113 uses : softprops/action-gh-release@v2
76116 files : |
77117 release/*.dmg
78118 release/*.zip
79-
0 commit comments