2626 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
2727
2828 steps :
29- # 1️⃣ Checkout code
29+ # Checkout code
3030 - name : Checkout repository
3131 uses : actions/checkout@v4
3232
@@ -108,7 +108,7 @@ jobs:
108108 IOS_PROFILE_BASE64 : ${{ secrets.IOS_PROFILE_BASE64 }}
109109 ASC_API_KEY_BASE64 : ${{ secrets.ASC_API_KEY_BASE64 }}
110110
111- # 2️⃣ Setup Ruby and Fastlane
111+ # Setup Ruby and Fastlane
112112 - name : Setup Ruby
113113 uses : ruby/setup-ruby@v1
114114 with :
@@ -118,7 +118,7 @@ jobs:
118118 - name : Install gems
119119 run : bundle install
120120
121- # 3️⃣ Build Kotlin framework before Xcode (required for KMP - Xcode expects it at XCFrameworks/debug)
121+ # Build Kotlin framework before Xcode (required for KMP - Xcode expects it at XCFrameworks/debug)
122122 - name : Build Kotlin framework for Release
123123 run : |
124124 export JAVA_HOME=$(/usr/libexec/java_home -v 17)
@@ -139,13 +139,13 @@ jobs:
139139 echo "✅ Info.plist already exists"
140140 fi
141141
142- # 4️⃣ Setup Xcode 26.2 (macos-26 has it pre-installed)
142+ # Setup Xcode 26.2 (macos-26 has it pre-installed)
143143 - name : Select Xcode version
144144 uses : maxim-lobanov/setup-xcode@v1
145145 with :
146146 xcode-version : ' 26.2'
147147
148- # 4️⃣ Decode certificate (Fastlane will import it)
148+ # Decode certificate (Fastlane will import it)
149149 - name : Decode iOS certificate
150150 run : |
151151 # Check if the secret exists and is not empty
@@ -168,7 +168,7 @@ jobs:
168168 env :
169169 IOS_P12_BASE64 : ${{ secrets.IOS_P12_BASE64 }}
170170
171- # 6️⃣ Validate iOS certificate contains private key
171+ # Validate iOS certificate contains private key
172172 - name : Validate iOS certificate contains private key
173173 run : |
174174 set +e # Don't exit on openssl failure - we need to show the error
@@ -282,7 +282,7 @@ jobs:
282282 env :
283283 IOS_P12_PASSWORD : ${{ secrets.IOS_P12_PASSWORD }}
284284
285- # 7️⃣ Decode provisioning profile (Fastlane will install it)
285+ # Decode provisioning profile (Fastlane will install it)
286286 - name : Decode provisioning profile
287287 run : |
288288 # Check if the secret exists
@@ -299,53 +299,54 @@ jobs:
299299 env :
300300 IOS_PROFILE_BASE64 : ${{ secrets.IOS_PROFILE_BASE64 }}
301301
302- - name : Decode and validate GoogleService-Info.plist
303- run : |
304- set -euo pipefail
302+ # Decode and validate Firebase config from Environment secrets
303+ - name : Decode and validate GoogleService-Info.plist
304+ run : |
305+ set -euo pipefail
305306
306- PLIST_PATH="iosApp/iosApp/GoogleService-Info.plist"
307+ PLIST_PATH="iosApp/iosApp/GoogleService-Info.plist"
307308
308- if [ -z "${GOOGLE_SERVICE_INFO_BASE64:-}" ]; then
309- echo "❌ ERROR: GOOGLE_SERVICE_INFO_BASE64 secret is missing or empty"
310- exit 1
311- fi
309+ if [ -z "${GOOGLE_SERVICE_INFO_BASE64:-}" ]; then
310+ echo "❌ ERROR: GOOGLE_SERVICE_INFO_BASE64 secret is missing or empty"
311+ exit 1
312+ fi
312313
313- echo "$GOOGLE_SERVICE_INFO_BASE64" | base64 -D > "$PLIST_PATH"
314+ echo "$GOOGLE_SERVICE_INFO_BASE64" | base64 -D > "$PLIST_PATH"
314315
315- FILE_SIZE=$(stat -f%z "$PLIST_PATH")
316- echo "✅ GoogleService-Info.plist created ($FILE_SIZE bytes)"
316+ FILE_SIZE=$(stat -f%z "$PLIST_PATH")
317+ echo "✅ GoogleService-Info.plist created ($FILE_SIZE bytes)"
317318
318- if [ "$FILE_SIZE" -lt 100 ]; then
319- echo "❌ ERROR: GoogleService-Info.plist is too small, likely corrupted"
320- exit 1
321- fi
319+ if [ "$FILE_SIZE" -lt 100 ]; then
320+ echo "❌ ERROR: GoogleService-Info.plist is too small, likely corrupted"
321+ exit 1
322+ fi
322323
323- if ! plutil -lint "$PLIST_PATH"; then
324- echo "❌ ERROR: GoogleService-Info.plist is invalid"
325- exit 1
326- fi
324+ if ! plutil -lint "$PLIST_PATH"; then
325+ echo "❌ ERROR: GoogleService-Info.plist is invalid"
326+ exit 1
327+ fi
327328
328- for key in GOOGLE_APP_ID BUNDLE_ID API_KEY GCM_SENDER_ID PROJECT_ID; do
329- if ! /usr/libexec/PlistBuddy -c "Print :$key" "$PLIST_PATH" >/dev/null; then
330- echo "❌ ERROR: Missing plist key: $key"
331- exit 1
332- fi
333- done
329+ for key in GOOGLE_APP_ID BUNDLE_ID API_KEY GCM_SENDER_ID PROJECT_ID; do
330+ if ! /usr/libexec/PlistBuddy -c "Print :$key" "$PLIST_PATH" >/dev/null; then
331+ echo "❌ ERROR: Missing plist key: $key"
332+ exit 1
333+ fi
334+ done
334335
335- PLIST_BUNDLE_ID=$(/usr/libexec/PlistBuddy -c "Print :BUNDLE_ID" "$PLIST_PATH")
336+ PLIST_BUNDLE_ID=$(/usr/libexec/PlistBuddy -c "Print :BUNDLE_ID" "$PLIST_PATH")
336337
337- if [ "$PLIST_BUNDLE_ID" != "$APP_BUNDLE_ID" ]; then
338- echo "❌ ERROR: Firebase BUNDLE_ID mismatch"
339- echo "Expected: $APP_BUNDLE_ID"
340- echo "Actual: $PLIST_BUNDLE_ID"
341- exit 1
342- fi
338+ if [ "$PLIST_BUNDLE_ID" != "$APP_BUNDLE_ID" ]; then
339+ echo "❌ ERROR: Firebase BUNDLE_ID mismatch"
340+ echo "Expected: $APP_BUNDLE_ID"
341+ echo "Actual: $PLIST_BUNDLE_ID"
342+ exit 1
343+ fi
343344
344- echo "✅ GoogleService-Info.plist validation passed"
345- env :
346- GOOGLE_SERVICE_INFO_BASE64 : ${{ secrets.GOOGLE_SERVICE_INFO_BASE64 }}
345+ echo "✅ GoogleService-Info.plist validation passed"
346+ env :
347+ GOOGLE_SERVICE_INFO_BASE64 : ${{ secrets.GOOGLE_SERVICE_INFO_BASE64 }}
347348
348- # 8️⃣ Setup App Store Connect API Key
349+ # Setup App Store Connect API Key
349350 - name : Setup App Store Connect API Key
350351 run : |
351352 # Check if secrets exist
@@ -373,23 +374,23 @@ jobs:
373374 env :
374375 ASC_API_KEY_BASE64 : ${{ secrets.ASC_API_KEY_BASE64 }}
375376
376- # 8b Set build number (Config.xcconfig overrides agvtool; must be > previous TestFlight build)
377+ # Set build number (Config.xcconfig overrides agvtool; must be > previous TestFlight build)
377378 - name : Set build number for TestFlight
378379 run : |
379380 BUILD_NUM=$(date +%s)
380381 sed -i.bak "s/CURRENT_PROJECT_VERSION=.*/CURRENT_PROJECT_VERSION=$BUILD_NUM/" iosApp/Configuration/Config.xcconfig
381382 rm -f iosApp/Configuration/Config.xcconfig.bak
382383 echo "Set CURRENT_PROJECT_VERSION to $BUILD_NUM"
383384
384- # 9️⃣ Build & Upload to TestFlight via Fastlane (includes verification inside)
385+ # Build & Upload to TestFlight via Fastlane (includes verification inside)
385386 - name : Build & Upload to TestFlight
386387 run : bundle exec fastlane beta
387388 env :
388389 IOS_P12_PASSWORD : ${{ secrets.IOS_P12_PASSWORD }}
389390 APP_STORE_CONNECT_API_KEY_ID : ${{ secrets.ASC_KEY_ID }}
390391 APP_STORE_CONNECT_API_KEY_ISSUER_ID : ${{ secrets.ASC_ISSUER_ID }}
391392
392- # 9️⃣ Upload build artifacts
393+ # Upload build artifacts
393394 - name : Upload IPA artifact
394395 uses : actions/upload-artifact@v4
395396 if : success()
@@ -398,7 +399,7 @@ jobs:
398399 path : build/ARK-Drop.ipa
399400 retention-days : 30
400401
401- # 📋 Show build errors if build failed
402+ # Show build errors if build failed
402403 - name : Show Build Log Tail
403404 if : failure()
404405 run : |
@@ -409,7 +410,7 @@ jobs:
409410 echo "🔍 Checking for error lines:"
410411 find build/logs -name "*.log" -exec grep -i "error:" {} \; 2>/dev/null || echo "No errors found in log"
411412
412- # 📋 Upload build logs for debugging
413+ # Upload build logs for debugging
413414 - name : Upload Build Logs
414415 uses : actions/upload-artifact@v4
415416 if : always()
@@ -420,7 +421,7 @@ jobs:
420421 build/
421422 retention-days : 7
422423
423- # 🔟 Cleanup
424+ # Cleanup
424425 - name : Cleanup
425426 if : always()
426427 run : |
0 commit comments