Skip to content

CI: drop ios-testflight push trigger (fix cancelled-run red on main) - #6214

Merged
lawrencecchen merged 1 commit into
mainfrom
fix-ci-testflight-push-trigger
Jun 16, 2026
Merged

lawrencecchen merged 1 commit into
mainfrom
fix-ci-testflight-push-trigger

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jun 16, 2026 •

Copy link
Copy Markdown
Contributor

Problem

main shows red from the iOS TestFlight (beta) workflow: its jobs land as cancelled on intermediate main commits during merge bursts (e.g. two iOS merges close together). Isolated pushes upload fine; bursts don't.

Root cause

A TestFlight upload is a release action, so the workflow needs a concurrency group to avoid N concurrent uploads. With push: [main] + concurrency (cancel-in-progress: false), GitHub cancels the superseded pending runs in the group when newer commits queue. Those cancelled runs surface as red checks on the superseded commits → main looks like CI is failing. It is not a build failure, and ios-testflight is not a required check.

Fix (first principles)

You only ever want the latest main in beta, exactly once per change. The decide job already does exactly that for the schedule lane: it SHA-compares HEAD to the last uploaded commit and uploads only when main advanced (skips green otherwise, retries an un-uploaded commit). So:

  • Remove push: [main] (the sole source of the cancellation red).
  • Keep workflow_dispatch (immediate on-demand beta) and the decide-gated schedule.
  • Intentional cuts still go through the release flow; nightly.yml remains the rolling dogfood lane.

No required checks change. Eliminates the red without losing beta coverage.

🤖 Generated with Claude Code


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Note

Low Risk
CI trigger-only change; no app, signing, or upload job logic is modified.

Overview
Stops iOS TestFlight (beta) from running on every iOS-related push to main, which was queuing multiple runs under the workflow concurrency group and leaving cancelled checks on intermediate commits during merge bursts.

Beta uploads now rely on the existing schedule (with the decide job’s SHA gate so only new main HEAD ships) and workflow_dispatch for on-demand cuts; release and nightly.yml dogfood are unchanged. Inline comments in ios-testflight.yml document why push was removed.

Reviewed by Cursor Bugbot for commit 9ae2a18. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Remove the push trigger from the iOS TestFlight (beta) workflow to stop cancelled runs marking main as red during merge bursts. Beta uploads now run via the scheduled SHA-gated decide job or manual dispatch.

  • Bug Fixes
    • Schedule uses the existing decide job to upload only when main advances (SHA compare); skipped runs are green and missed uploads retry.
    • Keep workflow_dispatch for on-demand beta; release flow and nightly.yml unchanged.
    • No required checks change.

Written for commit 9ae2a18. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Chores
    • Updated iOS TestFlight deployment configuration to remove automatic push-based triggers. TestFlight builds will now be deployed only through scheduled releases and manual deployment requests.

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.
@vercel

vercel Bot commented Jun 16, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jun 16, 2026 3:28am
cmux-staging Building Building Preview, Comment Jun 16, 2026 3:28am

@coderabbitai

coderabbitai Bot commented Jun 16, 2026 •

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: e69d935f-91bd-42d8-b621-4b7dbe82713b

📥 Commits

Reviewing files that changed from the base of the PR and between 8444c46 and 9ae2a18.

📒 Files selected for processing (1)
  • .github/workflows/ios-testflight.yml

📝 Walkthrough

Walkthrough

The iOS TestFlight workflow's push trigger on main with iOS-related path filters is removed. Inline comments are added to explicitly document that TestFlight uploads are intentionally limited to scheduled runs (with SHA-based skip logic) and manual workflow_dispatch.

Changes

TestFlight Trigger Removal

Layer / File(s) Summary
Remove push trigger, add explanatory comments
.github/workflows/ios-testflight.yml
Deletes the push event block (branch: main, path filters for iOS paths) and replaces it with comments clarifying that no push-based upload trigger is configured; uploads remain gated to schedule and workflow_dispatch.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~2 minutes

Possibly related PRs

  • manaflow-ai/cmux#5476: Directly modifies the same .github/workflows/ios-testflight.yml to restrict when the iOS TestFlight upload runs, closely related in intent and file.
  • manaflow-ai/cmux#5453: Modifies the iOS TestFlight workflow trigger in .github/workflows/ios-testflight.yml, specifically the push behavior and upload conditions.
  • manaflow-ai/cmux#5448: Modifies the same GitHub Actions iOS TestFlight workflow's trigger/event behavior (push vs. schedule/manual gating).

Poem

🐇 Hop, hop — no more push surprise,
The TestFlight queue won't unexpectedly rise.
Only schedules and dispatch shall call the tune,
No accidental uploads beneath the moon.
A rabbit tidied the YAML with care,
So fewer surprises drift through the air! 🌙


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Cmux Source Artifacts ❌ Error The commit adds 5322+ files including artifacts in explicitly prohibited directories: 25 files in .claude/ (e.g., .claude/scheduled_tasks.lock, .claude/skills/*), 1 in .agents/, and 3 in .greptile/... Remove all files from .claude/, .agents/, .vercel/, .greptile/ directories and package-manager .lock files that were accidentally added; keep only the intentional ios-testflight.yml workflow change.
Description check ⚠️ Warning The PR description provides comprehensive detail on the problem, root cause, and fix, explaining the concurrency and cancellation logic. However, it lacks Testing, Demo Video, and Checklist sections required by the template. Add Testing section documenting how the fix was verified, and complete the Checklist section to confirm local testing and that bot reviews were requested.
✅ Passed checks (19 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: removing the push trigger from the iOS TestFlight workflow to resolve the red cancelled-run issue on main.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed PR only modifies GitHub Actions workflow YAML (.github/workflows/ios-testflight.yml); no Swift code changes, so Swift actor isolation check is not applicable.
Cmux Swift Blocking Runtime ✅ Passed PR modifies only GitHub workflow configuration (.github/workflows/ios-testflight.yml); no production Swift code is modified or contains blocking runtime synchronization patterns.
Cmux Expensive Synchronous Load ✅ Passed PR only modifies GitHub Actions workflow YAML file (.github/workflows/ios-testflight.yml) with no Swift code changes; check targets production Swift changes only.
Cmux Cache Substitution Correctness ✅ Passed Check only applies to production Swift/TypeScript/JavaScript changes; this PR only modifies GitHub Actions workflow configuration (.github/workflows/ios-testflight.yml).
Cmux No Hacky Sleeps ✅ Passed PR modifies only GitHub Actions workflow YAML (.github/workflows/ios-testflight.yml), which is explicitly out of scope per runtime-no-hacky-sleeps.md. No TypeScript, JavaScript, shell, or runtime s...
Cmux Algorithmic Complexity ✅ Passed PR only modifies .github/workflows/ios-testflight.yml (GitHub Actions workflow YAML). The algorithmic complexity check applies to production Swift/TypeScript/JavaScript/shell code only, not CI conf...
Cmux Swift Concurrency ✅ Passed PR modifies only .github/workflows/ios-testflight.yml (YAML), with zero Swift code changes. Check targets Swift concurrency patterns, making it not applicable here.
Cmux Swift @Concurrent ✅ Passed The PR only modifies .github/workflows/ios-testflight.yml (GitHub Actions YAML configuration). The custom check is specifically for Swift code changes violating @concurrent annotation rules. Since...
Cmux Swift File And Package Boundaries ✅ Passed This PR only modifies .github/workflows/ios-testflight.yml (workflow configuration), not Swift source code, so the Swift file/package boundaries check does not apply.
Cmux Swift Logging ✅ Passed PR only modifies .github/workflows/ios-testflight.yml (workflow config), not production Swift code. No Swift logging rules apply since no app/runtime Swift code was added or materially changed.
Cmux User-Facing Error Privacy ✅ Passed GitHub Actions workflows are operational infrastructure, not user-facing product code. Team IDs and bundle IDs in workflow logs are visible only to developers/operators, fitting the allowed "operat...
Cmux Full Internationalization ✅ Passed PR modifies only .github/workflows/ios-testflight.yml, which is infrastructure/operational configuration not shown to end users. No user-facing text, Swift UI strings, web UI copy, or internation...
Cmux Swiftui State Layout ✅ Passed PR only modifies .github/workflows/ios-testflight.yml (YAML workflow config), not SwiftUI code. Check for SwiftUI state layout violations does not apply.
Cmux Architecture Rethink ✅ Passed PR modifies only GitHub Actions workflow YAML (.github/workflows/ios-testflight.yml), not Swift code. The custom check applies only to Swift architecture changes, making it inapplicable here.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR contains only workflow configuration changes to ios-testflight.yml, no Swift auxiliary window code modifications, so check is not applicable.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix-ci-testflight-push-trigger

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@lawrencecchen
lawrencecchen merged commit 79d6f32 into main Jun 16, 2026
15 of 20 checks passed
@greptile-apps

greptile-apps Bot commented Jun 16, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

Removes the push: [main] trigger from the iOS TestFlight workflow to eliminate spurious cancelled-run red checks on intermediate main commits during merge bursts. The nightly schedule lane (with its decide SHA-gate) and workflow_dispatch remain as the two valid entry points for beta uploads.

  • Push trigger removed: Concurrent push-triggered uploads caused GitHub to cancel superseded pending runs in the concurrency group, surfacing as red checks on main commits even though no build was failing.
  • Schedule lane unchanged: The decide job already implements the correct "upload once per unique main HEAD" primitive via SHA comparison, so no beta coverage is lost.
  • Two stale comments inside the upload job still reference push (lines 103–105 and 239–245) — suggestions inline.

Confidence Score: 5/5

Safe to merge — removes a single workflow trigger with no impact on build logic, signing, or upload correctness.

The change is a one-line trigger removal in a CI workflow. The remaining schedule + dispatch paths are unaffected, the decide SHA-gate logic is unchanged, and the upload job guard remains intact. The only findings are two stale comments — cosmetic and carry no runtime consequence.

No files require special attention; both stale-comment sites are minor and have inline suggestions.

Important Files Changed

Filename Overview
.github/workflows/ios-testflight.yml Removes push: [main] trigger; retains workflow_dispatch and nightly schedule. Two inline comments still reference the removed push trigger.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[workflow_dispatch] --> D[decide job]
    B["schedule (nightly 09:10 UTC)"] --> D
    D -->|workflow_dispatch| E["should_build = true"]
    D -->|schedule: SHA unchanged| F["should_build = false (skip, green)"]
    D -->|schedule: SHA advanced| E
    E --> G{"github.ref == main?"}
    G -->|yes| H[upload job: build + sign + upload to TestFlight]
    G -->|no| I[upload skipped]
    F --> J[run ends green, no upload]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[workflow_dispatch] --> D[decide job]
    B["schedule (nightly 09:10 UTC)"] --> D
    D -->|workflow_dispatch| E["should_build = true"]
    D -->|schedule: SHA unchanged| F["should_build = false (skip, green)"]
    D -->|schedule: SHA advanced| E
    E --> G{"github.ref == main?"}
    G -->|yes| H[upload job: build + sign + upload to TestFlight]
    G -->|no| I[upload skipped]
    F --> J[run ends green, no upload]
Loading

Comments Outside Diff (2)

  1. .github/workflows/ios-testflight.yml, line 239-245 (link)

    P2 Stale comment still references the removed push trigger. After this PR, only workflow_dispatch supplies an explicit build number; schedule and push are no longer separate concepts here. This will confuse future readers trying to understand when the timestamp path is taken.

    Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

  2. .github/workflows/ios-testflight.yml, line 103-105 (link)

    P2 Comment on the upload guard still says "push/schedule always run on main" but push is no longer a trigger. Minor but worth keeping accurate alongside the comment block that was just updated in the on: section.

    Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Reviews (1): Last reviewed commit: "CI: drop ios-testflight push trigger (st..." | Re-trigger Greptile

This branch was successfully deployed

1 active deployment
Preview – cmux — 9ae2a18c Deployed Jun 16, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant