1515 id : version
1616 run : echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
1717
18+ - name : Install signing certificate
19+ env :
20+ CERTIFICATE_P12 : ${{ secrets.CERTIFICATE_P12 }}
21+ CERTIFICATE_PASSWORD : ${{ secrets.CERTIFICATE_PASSWORD }}
22+ run : |
23+ # Create a temporary keychain
24+ KEYCHAIN_PATH="$RUNNER_TEMP/signing.keychain-db"
25+ KEYCHAIN_PASSWORD="$(openssl rand -base64 32)"
26+
27+ security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
28+ security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
29+ security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
30+
31+ # Import certificate
32+ CERT_PATH="$RUNNER_TEMP/certificate.p12"
33+ echo "$CERTIFICATE_P12" | base64 --decode > "$CERT_PATH"
34+ security import "$CERT_PATH" \
35+ -P "$CERTIFICATE_PASSWORD" \
36+ -A \
37+ -t cert \
38+ -f pkcs12 \
39+ -k "$KEYCHAIN_PATH"
40+ rm -f "$CERT_PATH"
41+
42+ # Add keychain to search list
43+ security list-keychains -d user -s "$KEYCHAIN_PATH" $(security list-keychains -d user | tr -d '"')
44+ security set-key-partition-list -S apple-tool:,apple: -s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
45+
46+ # Store identity name for later steps
47+ IDENTITY=$(security find-identity -v -p codesigning "$KEYCHAIN_PATH" | head -1 | sed 's/.*"\(.*\)".*/\1/')
48+ echo "SIGNING_IDENTITY=$IDENTITY" >> "$GITHUB_ENV"
49+
50+ - name : Set up notarization credentials
51+ env :
52+ APPLE_ID : ${{ secrets.APPLE_ID }}
53+ APPLE_TEAM_ID : ${{ secrets.APPLE_TEAM_ID }}
54+ APP_SPECIFIC_PASSWORD : ${{ secrets.APP_SPECIFIC_PASSWORD }}
55+ run : |
56+ xcrun notarytool store-credentials "FreeWispr-notarize" \
57+ --apple-id "$APPLE_ID" \
58+ --team-id "$APPLE_TEAM_ID" \
59+ --password "$APP_SPECIFIC_PASSWORD"
60+
1861 - name : Build release binary
1962 run : |
2063 cd FreeWispr
@@ -33,15 +76,12 @@ jobs:
3376 cp "FreeWispr/.build/arm64-apple-macosx/release/$APP_NAME" "$APP_BUNDLE/Contents/MacOS/$APP_NAME"
3477 cp "FreeWispr/Sources/$APP_NAME/Info.plist" "$APP_BUNDLE/Contents/Info.plist"
3578 cp "FreeWispr/Sources/$APP_NAME/Resources/AppIcon.icns" "$APP_BUNDLE/Contents/Resources/"
36- cp -R "FreeWispr/.build/arm64-apple-macosx/release/${APP_NAME}_${APP_NAME}.bundle" "$APP_BUNDLE/Contents/Resources/ "
79+ cp -R "FreeWispr/.build/arm64-apple-macosx/release/${APP_NAME}_${APP_NAME}.bundle" "$APP_BUNDLE/"
3780
3881 /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $VERSION" "$APP_BUNDLE/Contents/Info.plist"
3982 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $VERSION" "$APP_BUNDLE/Contents/Info.plist"
4083
4184 - name : Code sign
42- if : env.SIGNING_IDENTITY != ''
43- env :
44- SIGNING_IDENTITY : ${{ secrets.SIGNING_IDENTITY }}
4585 run : |
4686 codesign --force --deep \
4787 --sign "$SIGNING_IDENTITY" \
5090 --timestamp \
5191 "build/FreeWispr.app"
5292
93+ - name : Notarize
94+ run : |
95+ # Zip for notarization
96+ ditto -c -k --keepParent "build/FreeWispr.app" "build/FreeWispr-notarize.zip"
97+
98+ xcrun notarytool submit "build/FreeWispr-notarize.zip" \
99+ --keychain-profile "FreeWispr-notarize" \
100+ --wait
101+
102+ rm -f "build/FreeWispr-notarize.zip"
103+
104+ # Staple the ticket
105+ xcrun stapler staple "build/FreeWispr.app"
106+
53107 - name : Create DMG
54108 run : |
55109 APP_NAME="FreeWispr"
70124
71125 rm -rf "$DMG_STAGING"
72126
127+ # Sign the DMG too
128+ codesign --force --sign "$SIGNING_IDENTITY" --timestamp "$DMG_PATH"
129+
73130 - name : Create GitHub Release
74131 env :
75132 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
79136 "build/FreeWispr-$VERSION.dmg" \
80137 --title "FreeWispr v$VERSION" \
81138 --generate-notes
139+
140+ - name : Clean up keychain
141+ if : always()
142+ run : |
143+ KEYCHAIN_PATH="$RUNNER_TEMP/signing.keychain-db"
144+ security delete-keychain "$KEYCHAIN_PATH" 2>/dev/null || true
0 commit comments