From f5ca475e49a3e755e3673001af9dc924865d0079 Mon Sep 17 00:00:00 2001 From: Adam Borbas Date: Tue, 14 Jul 2026 13:28:19 +0200 Subject: [PATCH] Decouple TestFlight distribution to avoid CI hangs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit upload_to_testflight waited for build processing so it could assign the build to a group, but that wait is a well-known source of CI hangs (pilot polls the oldest processing build, not the one just uploaded). Switch to skip_waiting_for_build_processing: true so the job returns right after upload. Distribution to internal testers is now automatic: the "Testers (all builds)" group is configured with access to all builds, so every build reaches testers once App Store Connect finishes processing — no in-lane group assignment (which forced the wait) needed. Add a 30-minute job timeout as a safety cap. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/release.yml | 1 + fastlane/Fastfile | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f92bb5d..8a3cb74 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,6 +15,7 @@ jobs: build: name: Upload to TestFlight runs-on: macos-15 + timeout-minutes: 30 environment: release if: github.actor == 'adborbas' steps: diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 2b2fae2..02082a6 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -1,7 +1,7 @@ default_platform(:ios) XCCONFIG = "Config/Shared.xcconfig".freeze -BETA_GROUP = "Testers".freeze # internal TestFlight group builds are enabled for +BETA_GROUP = "Testers (all builds)".freeze # internal group set to auto-receive all builds platform :ios do # --------------------------------------------------------------------------- @@ -87,20 +87,19 @@ platform :ios do } ) - # Assign the build to the internal "Testers" group. This requires the build - # to finish processing first, so we wait (can take a few minutes). Internal - # groups need no beta review, so submit_beta_review is disabled — otherwise - # pilot would try (and fail) to submit for external review, which requires a - # Beta App Description. The build is still linked to the group. + # Upload and return immediately — do NOT wait for App Store Connect to + # finish processing. Waiting is a well-known source of CI hangs (pilot polls + # the oldest processing build, not the one just uploaded), and it's the only + # reason the job needs to wait at all. Distribution to internal testers is + # decoupled: the "Testers" group has access to all builds, so every build is + # delivered automatically once Apple finishes processing it — no in-lane + # group assignment (which would force the wait) required. upload_to_testflight( api_key: api_key, - groups: [BETA_GROUP], - distribute_external: false, - submit_beta_review: false, - skip_waiting_for_build_processing: false + skip_waiting_for_build_processing: true ) - UI.success("Uploaded build #{next_build} to TestFlight and enabled it for '#{BETA_GROUP}'.") + UI.success("Uploaded build #{next_build} to TestFlight. It will reach the '#{BETA_GROUP}' group once App Store Connect finishes processing it.") end # ---------------------------------------------------------------------------