This repository now has a two-stage pipeline:
testflight-auto.ymlautomatically uploads signed iOS builds to TestFlight after each published GitHub release.appstore-submit.ymlruns preflight checks and submits production versions to App Review after a manual environment approval gate.
Workflow: .github/workflows/testflight-auto.yml
Triggers:
release.publishedworkflow_dispatch
Behavior:
- Checks out release tag.
- Builds signed archive for
generic/platform=iOS. - Exports
.ipausing auto-generatedExportOptions.plist(method=app-store-connect). - Uploads with
xcrun iTMSTransporterusing API key auth. - Polls App Store Connect build processing state until
VALID. - Upserts TestFlight
What to Testfrom release body or dispatch input. - Dispatches
appstore-submit-readyevent for non-prerelease releases.
Dry-run mode:
workflow_dispatchsupportsdry_run=trueto validate signing, export, and JWT generation without upload/API mutations.
Stage 1 requirements (internal testing):
- Does not require
ASC_SUPPORT_URLorASC_PRIVACY_POLICY_URL. - Does not require App Review checklist fields.
Workflow: .github/workflows/appstore-submit.yml
Triggers:
repository_dispatchtypeappstore-submit-ready(from stage 1)workflow_dispatch
Behavior:
- Validates
appstore-assets/review/submission-checklist.jsonandreview-notes.md. - Ensures target
appStoreVersionexists. - Resolves a
VALIDbuild for the selected version/build number. - Optional asset sync (
sync_assets=true) for screenshots/previews. - Requires environment approval on
appstore-productionbefore final submission. - Attaches build to app store version, sets release type to
MANUAL, and submits for review.
Stage 2 requirements (submission):
- Requires valid
appstore-assets/review/submission-checklist.json. - Requires non-empty
supportUrlandprivacyPolicyUrlin that checklist. ASC_SUPPORT_URLandASC_PRIVACY_POLICY_URLvars are optional, but if set they must match checklist values.
appstore-assets/review/submission-checklist.json must include:
privacyPolicyUrlsupportUrldescriptionsubtitlekeywordsageRatingConfirmed: trueexportComplianceConfirmed: truereviewNotesPath
| Asset type | Can automate | Should automate now | Status |
|---|---|---|---|
| App Store screenshots | Yes | Yes (deterministic folder naming) | Implemented (opt-in) |
| App previews | Yes | Partial | Implemented (opt-in) |
| In-App Event media | Yes | Not now | Deferred |
| In-App Purchase media | Yes | Not now | Deferred |
| Review attachments | Yes | Partial/manual | Manual template only |
- Screenshots and previews are not auto-generated by this pipeline.
- You create screenshots/previews manually (or with your own capture tooling).
- The pipeline only uploads files that already exist under
appstore-assets/whensync_assets=trueinappstore-submit.yml.
appstore-assets/screenshots/<locale>/<display-family>/...appstore-assets/previews/<locale>/<display-family>/...appstore-assets/review/review-notes.mdappstore-assets/review/submission-checklist.json