agentsclimarketplace

Appstore push testflight build

Skill jimmynotjames/simple-recurring-budgets/.claude/skills/appstore-push-testflight-build

Build and ship a TestFlight build end-to-end — creates a release branch, runs `fastlane ios beta` (auto-bumps build number from ASC, archives, uploads, auto-commits the pbxproj bump), then pushes, opens a chore PR, waits for CI, and squash-merges. Use when cutting a new TestFlight build. Invoked via /appstore:push-testflight-build.From its SKILL.md

Install
npx -y skills add jimmynotjames/simple-recurring-budgets --skill appstore-push-testflight-build

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

8.1 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it

Push a TestFlight build

Automates the full TestFlight release cut: branch → build → upload → commit → PR → CI → merge.

The fastlane ios beta lane handles the heavy lifting: it queries App Store Connect for the next build number, bumps CURRENT_PROJECT_VERSION in project.pbxproj, archives and exports the .ipa, uploads it to TestFlight (without waiting for Apple to process it), and auto-commits the pbxproj change. This skill wraps that with branch discipline, the PR + CI wait, and the squash-merge.

Progress checklist

Print this unchecked at the start; re-print with - [x] as each step completes.

  1. Pre-flight — clean working tree, on main, up-to-date with origin
  2. Branch — create u/jimmyho/claude-code/testflight-build-{N+1} (approximate)
  3. Build & upload — fastlane ios beta running in background (~10–15 min)
  4. Verify commit — lane auto-committed chore(release): set build number to N
  5. Push — branch pushed to origin
  6. PR — chore PR opened; record PR number
  7. CI — wait_ci.sh running in background; re-invoked on completion
  8. Merge — squash-merge; branch cleaned up

Recipe

1. Pre-flight

git status --porcelain
git branch --show-current
git fetch origin
git log HEAD..origin/main --oneline
  • Dirty working tree (uncommitted or staged changes other than pbxproj): stop. The lane commits only the pbxproj; other uncommitted changes will be left behind and could confuse the reviewer. Ask the user to commit or stash first.
  • Not on main: stop. Confirm the user wants to cut a build from a non-main branch before proceeding.
  • Behind origin/main: pull first:
    git pull --ff-only
    

2. Create a release branch

Read the current build number from project.pbxproj:

grep CURRENT_PROJECT_VERSION simple-recurring-budgets.xcodeproj/project.pbxproj | head -1

Extract the integer N. Create the branch before anything else — the lane's git_commit commits on whatever branch is checked out, so being on the feature branch is mandatory:

git checkout -b u/jimmyho/claude-code/testflight-build-{N+1}

The branch name uses N+1 as an approximation. The lane queries ASC for the actual next build number, which may be higher than N+1 if earlier uploads failed. The PR title is derived from the lane's auto-commit message and will carry the real number regardless.

3. Build & upload — fastlane ios beta

Run in the background (run_in_background: true):

fastlane ios beta 2>&1 | tee tmp/testflight-build.log

The lane (~10–15 min):

  • Queries ASC → sets the real next build number
  • Bumps CURRENT_PROJECT_VERSION in project.pbxproj
  • Archives and exports the .ipa with -allowProvisioningUpdates
  • Uploads to TestFlight (skip_waiting_for_build_processing: true)
  • Auto-commits: chore(release): set build number to <N>

Do not use the Monitor tool for ticks — it prompts on each re-arm. Track progress on 5-minute background sleep ticks instead (memory feedback_no_prompt_periodic_progress):

  1. Launch sleep 300 as a background Bash task (run_in_background: true).
  2. On its completion notification: read the last 10 lines of tmp/testflight-build.log, report one-line status, then re-arm with another sleep 300.
  3. Stop re-arming when the fastlane ios beta task exits.

4. Verify the auto-commit

After the background task exits:

git log --oneline -3
tail -60 tmp/testflight-build.log

Branch on the result:

Auto-commit present (chore(release): set build number to N): Record the actual build number N from the commit subject. Proceed to step 5.

No auto-commit + log shows a build or upload error: Surface the last 80 lines of tmp/testflight-build.log and stop. The branch is clean (nothing committed), so the user can re-run after fixing the issue. Common causes and fixes:

  • Signing failure — run fastlane ios verify_auth to check ASC API key auth; verify the distribution cert and provisioning profile are valid in Xcode / ASC.
  • Archive failure — the log will show a compiler error; fix the code and re-run from step 3.
  • Upload failure (ASC HTTP 500) — transient; wait a few minutes and re-run fastlane ios beta on the same branch. ASC will increment the build number again.

No auto-commit + log shows upload success but no commit (rare — fastlane's git_commit failed after a successful upload): the pbxproj is changed but not committed. Stage and commit it manually:

git add simple-recurring-budgets.xcodeproj/project.pbxproj

Read the actual build number from the file:

grep CURRENT_PROJECT_VERSION simple-recurring-budgets.xcodeproj/project.pbxproj | head -1

Write the commit message to tmp/commit-msg.txt with the Write tool:

chore(release): set build number to <N>

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

Then commit:

git commit -F tmp/commit-msg.txt

5. Push the branch

git push -u origin u/jimmyho/claude-code/testflight-build-{N+1}

6. Open the PR

Write the PR body to tmp/pr-body.md with the Write tool:

## What
* Bumped build number to <N> and uploaded build <N> to TestFlight.

## Why
New TestFlight build for internal testing.

## Test plan
- [ ] Build <N> appears in TestFlight within ~30 min of Apple processing the upload.

## Tools
- fastlane ios beta

---

## Cross-cutting concerns (PRD §6.8)

N/A — build infrastructure change only; no user-facing code.

- [x] Accessibility — N/A
- [x] Dark Mode — N/A
- [x] Localization — N/A
- [x] Mixpanel — N/A
- [x] UI test screen objects — N/A

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

Create the PR:

gh pr create --title "chore(release): set build number to <N>" --body-file tmp/pr-body.md

Record the PR number from the output.

7. Wait for CI

Give CI a moment to register the push, then get the run ID:

sleep 15
gh run list --branch u/jimmyho/claude-code/testflight-build-{N+1} --limit 1 --json databaseId --jq '.[0].databaseId'

Wait in the background (run_in_background: true):

bash scripts/wait_ci.sh <run-id> <pr-number>

The active CI gates are lint, secrets scan, and the i18n translation gate (the macOS build/test jobs are paused for the June 2026 Actions budget; see AGENTS.md). wait_ci.sh polls until the run completes, then prints the step breakdown and PR mergeability. The script times out after ~80 min.

8. Squash-merge and clean up

After wait_ci.sh exits and all checks passed:

gh pr merge <pr-number> --squash --delete-branch
git checkout main
git pull --ff-only
git branch -D u/jimmyho/claude-code/testflight-build-{N+1}
git fetch --prune

Report success: "Build <N> is in TestFlight (may take ~30 min for Apple to process) and the PR is merged to main."

Commands reference

git status --porcelain
git branch --show-current
git fetch origin && git log HEAD..origin/main --oneline   # check up to date
grep CURRENT_PROJECT_VERSION simple-recurring-budgets.xcodeproj/project.pbxproj | head -1
git checkout -b u/jimmyho/claude-code/testflight-build-{N+1}
fastlane ios beta 2>&1 | tee tmp/testflight-build.log     # build + upload + auto-commit
git log --oneline -3                                       # verify auto-commit
git push -u origin u/jimmyho/claude-code/testflight-build-{N+1}
gh pr create --title "chore(release): set build number to <N>" --body-file tmp/pr-body.md
sleep 15
gh run list --branch ... --limit 1 --json databaseId --jq '.[0].databaseId'
bash scripts/wait_ci.sh <run-id> <pr-number>
gh pr merge <pr-number> --squash --delete-branch
git checkout main && git pull --ff-only
git branch -D u/jimmyho/claude-code/testflight-build-{N+1}
git fetch --prune

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 625,150. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.