Scripts/publish-macos.sh (3888B)
1
2set -euo pipefail
3
4REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5SECRETS="$REPO_ROOT/.asc/secrets.sh"
6
7if [[ ! -f "$SECRETS" ]]; then
8 echo "Error: $SECRETS not found. See Scripts/secrets.sh.example for the required format."
9 exit 1
10fi
11
12source "$SECRETS"
13
14APP_ID="6759801710"
15SCHEME="Listless macOS"
16ARCHIVE_PATH="/tmp/Listless-mac-latest.xcarchive"
17EXPORT_PATH="/tmp/Listless-mac-export"
18EXPORT_PLIST="/tmp/Listless-mac-ExportOptions.plist"
19PKG_PATH="$EXPORT_PATH/Listless.pkg"
20SIGNING_DIR="$REPO_ROOT/.asc/macos-signing"
21DEV_P12="$REPO_ROOT/.asc/dev.p12"
22APP_P12="$SIGNING_DIR/app-headless.p12"
23INSTALLER_P12="$SIGNING_DIR/installer-headless.p12"
24TMP_KEYCHAIN="$REPO_ROOT/.asc/build.keychain-db"
25
26cd "$REPO_ROOT"
27
28if ! git diff --quiet || ! git diff --cached --quiet; then
29 echo "Error: Git repository is dirty. Commit or stash changes before publishing."
30 exit 1
31fi
32
33echo "==> Setting up temporary keychain..."
34security delete-keychain "$TMP_KEYCHAIN" 2>/dev/null || true
35security create-keychain -p "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN"
36security unlock-keychain -p "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN"
37security set-keychain-settings -lut 21600 "$TMP_KEYCHAIN"
38security import "$DEV_P12" -k "$TMP_KEYCHAIN" -P "$DEV_P12_PASS" \
39 -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
40security import "$APP_P12" -k "$TMP_KEYCHAIN" -P "$DIST_P12_PASS" \
41 -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
42security import "$INSTALLER_P12" -k "$TMP_KEYCHAIN" -P "$DIST_P12_PASS" \
43 -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
44security set-key-partition-list -S apple-tool:,apple:,codesign:,productbuild: \
45 -s -k "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN"
46security list-keychains -d user -s "$TMP_KEYCHAIN" ~/Library/Keychains/login.keychain-db
47
48cleanup_keychain() {
49 echo "==> Restoring keychain search list..."
50 security list-keychains -d user -s ~/Library/Keychains/login.keychain-db
51 security default-keychain -d user -s ~/Library/Keychains/login.keychain-db
52 security delete-keychain "$TMP_KEYCHAIN" 2>/dev/null || true
53}
54trap cleanup_keychain EXIT
55
56echo "==> Archiving $SCHEME..."
57xcodebuild \
58 -scheme "$SCHEME" \
59 -project Listless.xcodeproj \
60 -configuration Release \
61 -destination 'generic/platform=macOS' \
62 -archivePath "$ARCHIVE_PATH" \
63 archive
64
65echo "==> Writing export options..."
66cat > "$EXPORT_PLIST" <<PLIST
67<?xml version="1.0" encoding="UTF-8"?>
68<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
69 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
70<plist version="1.0">
71<dict>
72 <key>method</key>
73 <string>app-store-connect</string>
74 <key>signingStyle</key>
75 <string>manual</string>
76 <key>teamID</key>
77 <string>$TEAM_ID</string>
78 <key>signingCertificate</key>
79 <string>3rd Party Mac Developer Application</string>
80 <key>installerSigningCertificate</key>
81 <string>3rd Party Mac Developer Installer</string>
82 <key>provisioningProfiles</key>
83 <dict>
84 <key>net.inqk.listless</key>
85 <string>Listless macOS Distribution</string>
86 </dict>
87 <key>destination</key>
88 <string>export</string>
89 <key>stripSwiftSymbols</key>
90 <true/>
91 <key>manageAppVersionAndBuildNumber</key>
92 <false/>
93</dict>
94</plist>
95PLIST
96
97echo "==> Exporting PKG..."
98xcodebuild \
99 -exportArchive \
100 -archivePath "$ARCHIVE_PATH" \
101 -exportPath "$EXPORT_PATH" \
102 -exportOptionsPlist "$EXPORT_PLIST"
103
104echo "==> Uploading to App Store Connect..."
105mkdir -p "$REPO_ROOT/private_keys"
106cp "$REPO_ROOT/.asc/AuthKey_${KEY_ID}.p8" "$REPO_ROOT/private_keys/"
107xcrun iTMSTransporter \
108 -m upload \
109 -assetFile "$PKG_PATH" \
110 -apiKey "$KEY_ID" \
111 -apiIssuer "$ISSUER_ID" \
112 -v informational
113rm -f "$REPO_ROOT/private_keys/AuthKey_${KEY_ID}.p8"
114rmdir "$REPO_ROOT/private_keys" 2>/dev/null || true
115
116echo "==> Done!"