Skip to content

Commit eba94fe

Browse files
committed
🤖 Fix keychain race condition in parallel macOS signing
Problem: When running parallel electron-builder processes (x64 + arm64), both try to create the same keychain simultaneously, causing: SecKeychainCreate: A keychain with the same name already exists Solution: Pre-create and configure keychain in setup-macos-signing.sh before running parallel builds. This ensures: - Certificate is imported before electron-builder runs - Both parallel processes use the same pre-configured keychain - No race condition on keychain creation Changes: - Create unique keychain with timestamp - Import certificate into keychain before parallel builds - Configure keychain permissions for codesign - Export CSC_KEYCHAIN for electron-builder - Add verification step to confirm signing is enabled
1 parent 386f898 commit eba94fe

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

.github/workflows/build.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ jobs:
2828
AC_APIKEY_ID: ${{ secrets.AC_APIKEY_ID }}
2929
AC_APIKEY_ISSUER_ID: ${{ secrets.AC_APIKEY_ISSUER_ID }}
3030

31+
- name: Verify signing setup
32+
run: |
33+
if [ -n "${CSC_LINK:-}" ]; then
34+
echo "✅ Code signing enabled"
35+
security list-keychains -d user
36+
security find-identity -v -p codesigning
37+
else
38+
echo "⚠️ Code signing NOT enabled"
39+
fi
40+
3141
- name: Package for macOS
3242
run: make dist-mac
3343

scripts/setup-macos-signing.sh

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,40 @@ set -euo pipefail
1414
# Setup code signing certificate
1515
if [ -n "${MACOS_CERTIFICATE:-}" ]; then
1616
echo "Setting up code signing certificate..."
17-
echo "$MACOS_CERTIFICATE" | base64 -D >/tmp/certificate.p12
18-
echo "CSC_LINK=/tmp/certificate.p12" >>"$GITHUB_ENV"
17+
18+
# Decode certificate
19+
CERT_PATH=/tmp/certificate.p12
20+
echo "$MACOS_CERTIFICATE" | base64 -D >"$CERT_PATH"
21+
22+
# Create a unique keychain for this build (avoid parallel build conflicts)
23+
KEYCHAIN_NAME="build-$(date +%s).keychain"
24+
KEYCHAIN_PATH="$HOME/Library/Keychains/$KEYCHAIN_NAME"
25+
KEYCHAIN_PASSWORD=$(openssl rand -hex 32)
26+
27+
# Delete keychain if it already exists (cleanup from previous runs)
28+
security delete-keychain "$KEYCHAIN_PATH" 2>/dev/null || true
29+
30+
# Create new keychain
31+
security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
32+
security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
33+
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
34+
35+
# Import certificate to keychain
36+
security import "$CERT_PATH" -k "$KEYCHAIN_PATH" -P "$MACOS_CERTIFICATE_PWD" -T /usr/bin/codesign
37+
38+
# Add keychain to search list and set as default
39+
security list-keychains -d user -s "$KEYCHAIN_PATH" $(security list-keychains -d user | sed s/\"//g)
40+
security default-keychain -s "$KEYCHAIN_PATH"
41+
42+
# Allow codesign to access the keychain without prompting
43+
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
44+
45+
# Export for electron-builder (it will use the already-imported certificate)
46+
echo "CSC_LINK=$CERT_PATH" >>"$GITHUB_ENV"
1947
echo "CSC_KEY_PASSWORD=$MACOS_CERTIFICATE_PWD" >>"$GITHUB_ENV"
48+
echo "CSC_KEYCHAIN=$KEYCHAIN_PATH" >>"$GITHUB_ENV"
49+
50+
echo "✅ Code signing certificate imported to keychain"
2051
else
2152
echo "⚠️ No code signing certificate provided - building unsigned"
2253
fi

0 commit comments

Comments
 (0)