Appstore push release build
Skill jimmynotjames/simple-recurring-budgets/.claude/skills/appstore-push-release-build
Build and upload the App Store release-candidate build — confirms the release checklist has been worked through, prompts for the new App Store version number, bumps MARKETING_VERSION on a release branch, then runs `fastlane ios beta` so the candidate lands in TestFlight (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. The same binary is then manually tested via TestFlight and attached to the App Store version in ASC — one build serves both. Does NOT submit for review — that stays a manual App Store Connect step. Use when the release checklist reaches the release-candidate build step, or when asked to push a release build. Invoked via /appstore:push-release-build.From its SKILL.md
npx -y skills add jimmynotjames/simple-recurring-budgets --skill appstore-push-release-buildAssembled 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.5 KB, ~2.0k tokens by cl100k_base, as published. Nobody here has run it
Push the App Store release-candidate build
Produces the one binary that serves both the final TestFlight test and the App Store submission: version bump → branch → build → upload to TestFlight → commit → PR → CI → merge. TestFlight builds and App Store submissions draw from the same build pool in ASC, so the exact build the user tests is what gets attached to the version and submitted — no separate App Store archive. Submitting for review remains a manual ASC click.
Relationship to siblings: this wraps the same fastlane ios beta lane as
appstore-push-testflight-build, adding the release-checklist confirmation
and the MARKETING_VERSION bump. (The dormant fastlane ios release lane —
a separate full-binary upload via deliver — is NOT used in this flow.)
The beta lane does the heavy lifting: verifies ship secrets
(scripts/verify_release_secrets.sh), queries ASC for the next build number,
bumps CURRENT_PROJECT_VERSION in project.pbxproj, archives and exports the
.ipa, uploads to TestFlight, and auto-commits the pbxproj change.
Preconditions
Normally invoked from /appstore:prepare-for-release with the checklist's
Phases 0–3 complete. Either way, step 1 always asks the user to confirm the
checklist has been worked through — this skill bakes a binary; it must not
run against unfinished release prep:
- Metadata already pushed and current (
python3 scripts/translate_metadata/check_metadata.pyexits 0). - Screenshots already pushed and current (or deliberately unchanged).
- Gate green on
main.
Progress checklist
Print this unchecked at the start; re-print with - [x] as each step completes.
- Prep + version — user confirmed checklist prep and the new version number
- Pre-flight — clean working tree, on
main, up-to-date withorigin - Branch — create
u/jimmyho/claude-code/release-vX.Y.Z - Version bump —
MARKETING_VERSIONset + committed - Build & upload —
fastlane ios betarunning in background (~10–15 min) - Verify commit — lane auto-committed
chore(release): set build number to N - Push — branch pushed to
origin - PR — chore PR opened; record PR number
- CI —
wait_ci.shrunning in background; re-invoked on completion - Merge — squash-merge; branch cleaned up
Recipe
1. Confirm prep + version number — always prompt, never assume
Read the current value:
grep MARKETING_VERSION simple-recurring-budgets.xcodeproj/project.pbxproj | head -2
Then ask the user (one AskUserQuestion call, three questions):
- "Have you worked through the release checklist —
/appstore:prepare-for-release, or manually throughdocs/app-store-release-checklist.mdPhases 0–3?" If an in-flight snapshot exists inreleases/, cite its state alongside the question. A no (or "not sure") means stop and route to/appstore:prepare-for-releaseinstead of building. - The new App Store version number, showing the current
MARKETING_VERSIONand, if known, the version ASC is expecting. The version is a product decision — even if the checklist snapshot already names one, confirm it here before it gets baked into a binary. - "Are screenshots and metadata for this release already pushed (or deliberately unchanged)?" A no means stop and finish the checklist's Phase 2 first — the binary can upload regardless, but a candidate built before the listing is final invites a mismatched submission.
2. Pre-flight
git status --porcelain
git branch --show-current
git fetch origin
git log HEAD..origin/main --oneline
- Dirty working tree: stop and ask the user to commit or stash first.
(Exception: an in-flight release-checklist snapshot in
releases/is fine.) - Not on
main: stop and confirm before building a release candidate from a non-main branch. - Behind
origin/main:git pull --ff-only.
3. Create the release branch
git checkout -b u/jimmyho/claude-code/release-vX.Y.Z
4. Bump MARKETING_VERSION and commit
Update every MARKETING_VERSION = …; occurrence in
simple-recurring-budgets.xcodeproj/project.pbxproj with the Edit tool
(replace_all), then verify:
grep MARKETING_VERSION simple-recurring-budgets.xcodeproj/project.pbxproj
Commit it separately from the lane's build-number auto-commit so history
stays legible. Write the message to tmp/commit-msg.txt with the Write tool
(never heredoc):
chore(release): bump version to X.Y.Z
Co-Authored-By: <standard Claude co-author footer>
git add simple-recurring-budgets.xcodeproj/project.pbxproj
git commit -F tmp/commit-msg.txt
5. Build & upload — fastlane ios beta
Run in the background (run_in_background: true):
fastlane ios beta 2>&1 | tee tmp/release-build.log
The lane (~10–15 min): verifies ship secrets → sets the real next build
number from ASC → archives and exports 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): launch sleep 300 in the background;
on its completion, read the last 10 lines of tmp/release-build.log, report a
one-line status, re-arm; stop when the fastlane task exits.
6. Verify the auto-commit
git log --oneline -3
tail -60 tmp/release-build.log
Auto-commit present: record the build number N. Proceed to step 7.
Failure branches (no auto-commit + error in the log): surface the last 80 lines and stop — the version-bump commit stays on the branch, so the lane can be re-run after the fix.
- Ship-secrets guard tripped — configure
config/Secrets.local.xcconfigperCONTRIBUTING.md § B, then re-run. - Signing failure —
fastlane ios verify_auth; check the distribution cert and profile in Xcode / ASC. - Archive failure — compiler error in the log; fix and re-run from step 5.
- Upload failure (ASC HTTP 500) — transient; wait a few minutes and re-run.
Upload succeeded but no commit (rare): stage
simple-recurring-budgets.xcodeproj/project.pbxproj, read N from the file,
and commit chore(release): set build number to <N> manually via
tmp/commit-msg.txt.
7–10. Push, PR, CI, merge
Same flow as appstore-push-testflight-build steps 5–8:
git push -u origin u/jimmyho/claude-code/release-vX.Y.Z
gh pr create --title "chore(release): vX.Y.Z — bump version and upload build <N>" --body-file tmp/pr-body.md
sleep 15
gh run list --branch u/jimmyho/claude-code/release-vX.Y.Z --limit 1 --json databaseId --jq '.[0].databaseId'
bash scripts/wait_ci.sh <run-id> <pr-number> # run_in_background: true
gh pr merge <pr-number> --squash --delete-branch
git checkout main && git pull --ff-only
git branch -D u/jimmyho/claude-code/release-vX.Y.Z
git fetch --prune
PR body (via tmp/pr-body.md, Write tool): What = version bump to X.Y.Z +
release-candidate build <N> uploaded to TestFlight for App Store submission;
cross-cutting concerns section all N/A (build infrastructure only).
Done — hand back to the checklist
Report: "Release candidate build <N> (vX.Y.Z) is uploaded and the PR is
merged. Apple takes ~30 min to process it; then install build <N> via
TestFlight for the final manual test (Settings must show vX.Y.Z (<N>) with no
'Debug' badge). That exact build is what you attach to the version in ASC and
submit for review — nothing has been submitted yet." If running under
/appstore:prepare-for-release, mark the corresponding snapshot items and
continue the checklist.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.