publish-ios.sh (4077B)
1 #!/bin/bash 2 set -euo pipefail 3 4 REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" 5 SECRETS="$REPO_ROOT/.asc/secrets.sh" 6 7 if [[ ! -f "$SECRETS" ]]; then 8 echo "Error: $SECRETS not found. See Scripts/secrets.sh.example for the required format." 9 exit 1 10 fi 11 12 source "$SECRETS" 13 14 SCHEME="Crossmate" 15 ARCHIVE_PATH="/tmp/Crossmate-latest.xcarchive" 16 EXPORT_PATH="/tmp/Crossmate-export" 17 EXPORT_PLIST="/tmp/Crossmate-ExportOptions.plist" 18 IPA_PATH="$EXPORT_PATH/Crossmate.ipa" 19 DEV_P12="$REPO_ROOT/.asc/dev.p12" 20 DIST_P12="$REPO_ROOT/.asc/ios-signing/dist-headless.p12" 21 TMP_KEYCHAIN="$REPO_ROOT/.asc/build.keychain-db" 22 23 CHECK_ONLY=false 24 if [[ "${1:-}" == "--check" ]]; then 25 CHECK_ONLY=true 26 fi 27 28 cd "$REPO_ROOT" 29 30 if ! git diff --quiet || ! git diff --cached --quiet; then 31 echo "Error: Git repository is dirty. Commit or stash changes before publishing." 32 exit 1 33 fi 34 35 echo "==> Setting up temporary keychain..." 36 security delete-keychain "$TMP_KEYCHAIN" 2>/dev/null || true 37 security create-keychain -p "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN" 38 security unlock-keychain -p "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN" 39 security set-keychain-settings -lut 21600 "$TMP_KEYCHAIN" 40 security import "$DEV_P12" -k "$TMP_KEYCHAIN" -P "$DEV_P12_PASS" \ 41 -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild 42 security import "$DIST_P12" -k "$TMP_KEYCHAIN" -P "$DIST_P12_PASS" \ 43 -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild 44 security set-key-partition-list -S apple-tool:,apple:,codesign:,productbuild: \ 45 -s -k "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN" 46 security list-keychains -d user -s "$TMP_KEYCHAIN" ~/Library/Keychains/login.keychain-db 47 48 cleanup_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 } 54 trap cleanup_keychain EXIT 55 56 echo "==> Archiving $SCHEME..." 57 xcodebuild \ 58 -scheme "$SCHEME" \ 59 -project Crossmate.xcodeproj \ 60 -configuration Release \ 61 -destination 'generic/platform=iOS' \ 62 -archivePath "$ARCHIVE_PATH" \ 63 archive 64 65 echo "==> Writing export options..." 66 cat > "$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>iPhone Distribution</string> 80 <key>provisioningProfiles</key> 81 <dict> 82 <key>net.inqk.crossmate</key> 83 <string>Crossmate iOS Distribution</string> 84 <key>net.inqk.crossmate.notificationservice</key> 85 <string>Crossmate Notification Service iOS 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> 95 PLIST 96 97 echo "==> Exporting IPA..." 98 xcodebuild \ 99 -exportArchive \ 100 -archivePath "$ARCHIVE_PATH" \ 101 -exportPath "$EXPORT_PATH" \ 102 -exportOptionsPlist "$EXPORT_PLIST" 103 104 echo "==> Checking entitlements in exported IPA..." 105 CHECK_DIR="/tmp/Crossmate-ipa-check" 106 rm -rf "$CHECK_DIR" 107 unzip -q "$IPA_PATH" -d "$CHECK_DIR" 108 echo "--- iOS app entitlements ---" 109 codesign -d --entitlements - "$CHECK_DIR/Payload/Crossmate.app" 110 rm -rf "$CHECK_DIR" 111 112 if $CHECK_ONLY; then 113 echo "==> Check complete. Skipping upload." 114 exit 0 115 fi 116 117 echo "==> Uploading to App Store Connect..." 118 mkdir -p "$REPO_ROOT/private_keys" 119 cp "$REPO_ROOT/.asc/AuthKey_${KEY_ID}.p8" "$REPO_ROOT/private_keys/" 120 xcrun iTMSTransporter \ 121 -m upload \ 122 -assetFile "$IPA_PATH" \ 123 -apiKey "$KEY_ID" \ 124 -apiIssuer "$ISSUER_ID" \ 125 -v informational 126 rm -f "$REPO_ROOT/private_keys/AuthKey_${KEY_ID}.p8" 127 rmdir "$REPO_ROOT/private_keys" 2>/dev/null || true 128 129 echo "==> Done!"