From 9ae2a18cffbd36da4607612d0e7b465d87b3f895 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 15 Jun 2026 20:00:25 -0700 Subject: [PATCH] CI: drop ios-testflight push trigger (stop cancelled-run red on main) A TestFlight upload is a release action: you only want the latest main state in beta, exactly once per change. The push:[main] trigger forced a concurrency group to dedup concurrent uploads, and GitHub cancels superseded *pending* runs in that group during merge bursts. Those cancellations show as red checks on the intermediate main commits, so main looks like CI is failing (observed: bursts of iOS merges leave cancelled ios-testflight runs; isolated pushes upload fine). The schedule already has the right primitive: the decide job SHA-compares HEAD to the last uploaded commit and uploads only when main advanced (skips green otherwise), retrying an un-uploaded commit if a run was missed. Keep workflow_dispatch for an immediate on-demand beta and the release flow for intentional cuts. Removing push eliminates the cancellation red without losing beta coverage. --- .github/workflows/ios-testflight.yml | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ios-testflight.yml b/.github/workflows/ios-testflight.yml index c25f89bf194d..c3b99935b8ac 100644 --- a/.github/workflows/ios-testflight.yml +++ b/.github/workflows/ios-testflight.yml @@ -1,22 +1,17 @@ name: iOS TestFlight (beta) on: - # Publish to the beta lane on every iOS-affecting merge to main, so testers get - # changes immediately instead of waiting for the nightly. Path-filtered to the - # inputs that actually change the iOS app (the iOS target, the linked Swift - # packages, and GhosttyKit); macOS-only Sources/ changes don't rebuild the iOS - # app, so they don't trigger an upload. Push runs always build (the SHA gate is - # schedule-only); each merge is a new commit, so there's no duplicate upload. - push: - branches: [main] - paths: - - "ios/**" - - "Packages/**" - - "ghostty" - - "scripts/ensure-ghosttykit.sh" - - "scripts/install-zig-ci.sh" - - "scripts/ghosttykit-checksums.txt" - - ".github/workflows/ios-testflight.yml" + # No push trigger. A TestFlight upload is a release action: you only ever want + # the LATEST main state in beta, exactly once per change, never one upload per + # commit. Triggering on every iOS-affecting push forced a concurrency group to + # dedup concurrent uploads, and GitHub cancels the superseded *pending* runs in + # that group during merge bursts; those cancelled runs surface as red checks on + # the intermediate main commits, making main look like CI is failing. The + # schedule below already SHA-compares HEAD to the last uploaded commit (the + # `decide` job), which is the correct primitive for a beta lane: it uploads the + # current main only when it has actually advanced, and skips (green) otherwise. + # For an immediate beta, use workflow_dispatch; intentional cuts go through the + # release flow. See nightly.yml for the rolling dogfood lane. workflow_dispatch: inputs: build_number: