iOS TestFlight Deployment
iOS TestFlight Deployment
Section titled “iOS TestFlight Deployment”Bartendie ships to TestFlight and the App Store through the R26D release toolchain: autopen (code signing from the team vault) and pigeon (build numbers, release records, store uploads). There is no Fastlane and no Ruby in the release path — Ruby remains only as a build dependency for CocoaPods.
Prerequisites
Section titled “Prerequisites”- Mac with Xcode (including the iOS platform:
xcodebuild -downloadPlatform iOSafter Xcode updates) - autopen and pigeon CLIs on your PATH
- GPG key authorized for the signing vault (
r26d_signing_secrets) — autopen clones and decrypts it per session - Node (asdf) and CocoaPods via bundler (
bundle install— handled automatically bytask ios:pods)
No Apple ID password or 2FA is needed: store uploads authenticate with the App Store Connect API key served from the vault by autopen ios release-env.
Releasing
Section titled “Releasing”All tasks run from shaker/:
# 1. Update release notes (becomes TestFlight "What to Test")$EDITOR release_notes/ios.txt
# 2. Bump the version in app.json (expo.version) if this is a new version
# 3. Build a signed IPA (pulls the next build number from pigeon)task ios:build
# 4. Optional: smoke test the Release build in the simulatortask ios:sim
# 5. Optional: validate the IPA with Apple without uploadingtask ios:validate
# 6. Publish that exact IPA to TestFlighttask ios:publishtask ios:beta runs build + publish in one shot. When the TestFlight build is verified and you want to submit it for App Store review:
task ios:releaseTask reference
Section titled “Task reference”| Task | What it does |
|---|---|
ios:pods | Ensures node_modules, Ruby gems, and CocoaPods are installed and in sync (runs automatically before builds) |
ios:preflight | Verifies the Xcode environment (first-launch state, iOS platform installed) |
ios:version-sync | Syncs app.json version → MARKETING_VERSION / CFBundleShortVersionString |
ios:build | autopen signing setup → pigeon build number → xcodebuild archive + export → build/ios/Bartendie.ipa |
ios:sim | Builds Release for the iOS simulator and launches it (smoke test) |
ios:validate | Validates the IPA against App Store Connect without uploading |
ios:publish | pigeon release create + artifact publish (R2) + channel promote beta (TestFlight upload) |
ios:beta | ios:build + ios:publish |
ios:release | pigeon channel promote stable — submits the processed beta build for App Store review |
How the pieces fit
Section titled “How the pieces fit”- Signing —
autopen ios prepareclones the vault, decrypts the team distribution certificate and the app’s provisioning profile with your GPG key, and installs them into a temporary keychain.autopen ios cleanupremoves everything afterwards (the build task does this automatically, even on failure). - Build numbers — pigeon is the authority:
pigeon build-number next bartendie --platform ios. If it ever drifts from App Store Connect (upload rejected as duplicate), re-seed withpigeon build-number set bartendie --platform ios --number <latest-in-TestFlight>. - Store credentials —
autopen ios release-envexportsASC_API_KEY_ID/ASC_API_KEY_ISSUER_ID/ASC_API_PRIVATE_KEY_PATHfrom the vault. Pre-setASC_*env vars win (useful for CI). - Artifacts — every published IPA is recorded as a pigeon release and stored in R2, so release history is queryable after the fact.
Troubleshooting
Section titled “Troubleshooting”xcodebuildplugin/framework errors after an Xcode update →sudo xcodebuild -runFirstLaunch- “iOS x.y is not installed” →
xcodebuild -downloadPlatform iOS(both are caught up front byios:preflight) - “The bundle version must be higher than the previously uploaded version” → re-seed the pigeon build number (see above), then rebuild — never re-publish the rejected IPA
- Vault decryption failures → your GPG key must be listed in the vault’s
.sops.yaml; checkautopen vault status