From 20aeb0cb990a17f328b673f51717824d2f9c10ea Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:52:37 -0700 Subject: [PATCH] Prepare mobile 0.0.42 and fix TestFlight CI hang (#12961) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Bump mobile app.json to 0.0.42 * fix(mobile-ios): stop TestFlight CI from waiting on ASC processing 0.0.42 builds 1–2 uploaded successfully then hung for hours polling processing with no Ready build and no Apple email. Exit after upload and cap the job at 90m so the next cut does not repeat that hang. * fix(mobile-ios): fully skip Pilot wait (no changelog) Pilot only returns immediately after upload when changelog is nil; passing notes re-enters the ASC build-list poll. --- .github/workflows/mobile-ios-release.yml | 3 +++ mobile/app.json | 2 +- mobile/fastlane/Fastfile | 25 ++++++++---------------- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/.github/workflows/mobile-ios-release.yml b/.github/workflows/mobile-ios-release.yml index f759bd3ef..9e31a0b94 100644 --- a/.github/workflows/mobile-ios-release.yml +++ b/.github/workflows/mobile-ios-release.yml @@ -30,6 +30,9 @@ jobs: # (@MainActor isolation). Xcode 16.x (macos-15) can't even parse it # ("unknown attribute 'MainActor'"), so we need Xcode 26.x → macos-26. runs-on: macos-26 + # Archive + upload is ~30–40m when healthy; 90m leaves margin without + # sitting multi-hour on ASC processing polls (see Fastfile pilot wait). + timeout-minutes: 90 defaults: run: diff --git a/mobile/app.json b/mobile/app.json index 87b504464..e1749d34b 100644 --- a/mobile/app.json +++ b/mobile/app.json @@ -2,7 +2,7 @@ "expo": { "name": "Orca", "slug": "orca-mobile", - "version": "0.0.41", + "version": "0.0.42", "orientation": "default", "icon": "./assets/icon.png", "userInterfaceStyle": "automatic", diff --git a/mobile/fastlane/Fastfile b/mobile/fastlane/Fastfile index d08ce9462..45819c55f 100644 --- a/mobile/fastlane/Fastfile +++ b/mobile/fastlane/Fastfile @@ -28,8 +28,6 @@ WORKSPACE = File.join(MOBILE_ROOT, "ios", "Orca.xcworkspace") BUILD_OUTPUT_DIRECTORY = File.join(MOBILE_ROOT, "build") SCHEME = "Orca" BUNDLE_ID = "com.stably.orca.mobile" -TESTFLIGHT_GROUPS = ["peeps"].freeze -DEFAULT_TESTFLIGHT_CHANGELOG = "Latest Orca Mobile updates and fixes.".freeze # App Store version states in which the version "train" is terminally closed to # new TestFlight build uploads (altool rejects with 90186 "train ... is @@ -112,11 +110,6 @@ rescue StandardError => error nil end -def testflight_changelog - changelog = ENV.fetch("TESTFLIGHT_CHANGELOG", "").strip - changelog.empty? ? DEFAULT_TESTFLIGHT_CHANGELOG : changelog -end - platform :ios do desc "Resolve the iOS release version and next TestFlight build number" lane :prepare_release_version do |options| @@ -178,7 +171,7 @@ platform :ios do UI.message("Prepared Orca Mobile iOS #{version} (#{build_number})") end - desc "Build, sign, upload, and share Orca Mobile on TestFlight" + desc "Build, sign, and upload Orca Mobile to App Store Connect / TestFlight" lane :release do api_key = app_store_connect_api_key_from_env @@ -221,15 +214,13 @@ platform :ios do upload_to_testflight( api_key: api_key, - # Why: fastlane can only assign external TestFlight groups after Apple - # finishes processing the uploaded build. - skip_waiting_for_build_processing: false, - distribute_external: true, - groups: TESTFLIGHT_GROUPS, - notify_external_testers: true, - # Why: fastlane requires release notes when distributing to external - # TestFlight testers, even for CI-triggered smoke releases. - changelog: testflight_changelog, + # Why: ASC processing wait hung for hours (0.0.42 builds 1–2) with no Ready + # build and no email. Exit after upload acceptance. Do not pass changelog — + # Pilot only fully skips waiting when changelog is nil (otherwise it still + # polls until the build appears). External distribute (e.g. peeps) from ASC + # or a follow-up lane once Ready. + skip_waiting_for_build_processing: true, + distribute_external: false, ) end end