Skip to content

Commit 093856d

Browse files
ygivenxclaude
andcommitted
fix: resource bundle path + CI/CD signing and notarization
- Fix resource bundle copied to wrong location in .app (caused crash on other Macs) - Add certificate import, notarization, and stapling to release workflow - Add certs/ to .gitignore Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 145bf27 commit 093856d

File tree

3 files changed

+70
-5
lines changed

3 files changed

+70
-5
lines changed

.github/workflows/release.yml

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,49 @@ jobs:
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" \
@@ -50,6 +90,20 @@ jobs:
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"
@@ -70,6 +124,9 @@ jobs:
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 }}
@@ -79,3 +136,9 @@ jobs:
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

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ xcuserdata/
55
DerivedData/
66
.DS_Store
77
build/
8+
certs/
9+
*.p12

scripts/build-and-notarize.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ mkdir -p "$APP_BUNDLE/Contents/Resources"
4848
cp "$BUILT_BINARY" "$APP_BUNDLE/Contents/MacOS/$APP_NAME"
4949
cp "$INFO_PLIST" "$APP_BUNDLE/Contents/Info.plist"
5050
cp "$PROJECT_DIR/Sources/$APP_NAME/Resources/AppIcon.icns" "$APP_BUNDLE/Contents/Resources/"
51-
cp -R "$PROJECT_DIR/.build/arm64-apple-macosx/release/${APP_NAME}_${APP_NAME}.bundle" "$APP_BUNDLE/Contents/Resources/"
51+
cp -R "$PROJECT_DIR/.build/arm64-apple-macosx/release/${APP_NAME}_${APP_NAME}.bundle" "$APP_BUNDLE/"
5252

5353
# Stamp version into the bundle plist
5454
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $VERSION" "$APP_BUNDLE/Contents/Info.plist"

0 commit comments

Comments
 (0)