← All repositories

listless

A simple list app for Apple platforms

git clone https://code.inqk.net/listless.git


Scripts/publish-ios.sh (4174B)

1#!/bin/bash
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
14SCHEME="Listless iOS"
15ARCHIVE_PATH="/tmp/Listless-latest.xcarchive"
16EXPORT_PATH="/tmp/Listless-export"
17EXPORT_PLIST="/tmp/Listless-ExportOptions.plist"
18IPA_PATH="$EXPORT_PATH/Listless iOS.ipa"
19DEV_P12="$REPO_ROOT/.asc/dev.p12"
20DIST_P12="$REPO_ROOT/.asc/ios-signing/dist-headless.p12"
21TMP_KEYCHAIN="$REPO_ROOT/.asc/build.keychain-db"
22
23CHECK_ONLY=false
24if [[ "${1:-}" == "--check" ]]; then
25    CHECK_ONLY=true
26fi
27
28cd "$REPO_ROOT"
29
30if ! git diff --quiet || ! git diff --cached --quiet; then
31    echo "Error: Git repository is dirty. Commit or stash changes before publishing."
32    exit 1
33fi
34
35echo "==> Setting up temporary keychain..."
36security delete-keychain "$TMP_KEYCHAIN" 2>/dev/null || true
37security create-keychain -p "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN"
38security unlock-keychain -p "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN"
39security set-keychain-settings -lut 21600 "$TMP_KEYCHAIN"
40security import "$DEV_P12" -k "$TMP_KEYCHAIN" -P "$DEV_P12_PASS" \
41    -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
42security import "$DIST_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=iOS' \
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>iPhone Distribution</string>
80    <key>provisioningProfiles</key>
81    <dict>
82        <key>net.inqk.listless</key>
83        <string>Listless iOS Distribution</string>
84        <key>net.inqk.listless.watchos</key>
85        <string>Listless watchOS 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 IPA..."
98xcodebuild \
99    -exportArchive \
100    -archivePath "$ARCHIVE_PATH" \
101    -exportPath "$EXPORT_PATH" \
102    -exportOptionsPlist "$EXPORT_PLIST"
103
104echo "==> Checking entitlements in exported IPA..."
105CHECK_DIR="/tmp/Listless-ipa-check"
106rm -rf "$CHECK_DIR"
107unzip -q "$IPA_PATH" -d "$CHECK_DIR"
108echo "--- iOS app entitlements ---"
109codesign -d --entitlements - "$CHECK_DIR/Payload/Listless iOS.app"
110echo "--- watchOS app entitlements ---"
111codesign -d --entitlements - "$CHECK_DIR/Payload/Listless iOS.app/Watch/Listless.app"
112rm -rf "$CHECK_DIR"
113
114if $CHECK_ONLY; then
115    echo "==> Check complete. Skipping upload."
116    exit 0
117fi
118
119echo "==> Uploading to App Store Connect..."
120mkdir -p "$REPO_ROOT/private_keys"
121cp "$REPO_ROOT/.asc/AuthKey_${KEY_ID}.p8" "$REPO_ROOT/private_keys/"
122xcrun iTMSTransporter \
123    -m upload \
124    -assetFile "$IPA_PATH" \
125    -apiKey "$KEY_ID" \
126    -apiIssuer "$ISSUER_ID" \
127    -v informational
128rm -f "$REPO_ROOT/private_keys/AuthKey_${KEY_ID}.p8"
129rmdir "$REPO_ROOT/private_keys" 2>/dev/null || true
130
131echo "==> Done!"