Skip to content

Shipping mobile apps

Relay detects the apps in your repos (Flutter, native iOS, native Android, and more), including several apps in one monorepo. Framework projects own their native folders, so a Flutter app’s ios/Runner.xcodeproj isn’t counted as a second app.

The Actions tab suggests ready-made build and ship actions for each app it finds.

actions:
ship-testflight:
name: Ship to TestFlight
ask_first: true
options:
FLAVOR: [dev, production]
RELEASE_NOTES: text
steps:
- run: flutter build ipa --release --flavor $FLAVOR -t $FLUTTER_TARGET --build-number $BUILD_NUMBER
timeout: 45
- app_store: build/ios/ipa/*.ipa
credentials: Acme
ship-play-internal:
name: Ship to Play internal
options:
FLAVOR: [dev, production]
steps:
- run: flutter build appbundle --release --flavor $FLAVOR -t $FLUTTER_TARGET --build-number $BUILD_NUMBER
- play_store: build/app/outputs/bundle/${FLAVOR}Release/*.aab
track: internal
release: draft
  • $BUILD_NUMBER is the next number after the latest build in the store.
  • $FLUTTER_TARGET points at lib/main_<flavor>.dart when it exists.
  • The Play package name is read from the app’s Gradle file unless you set package:.
  • RELEASE_NOTES becomes the release notes for a Play upload.

Then from Slack:

@relay ship production to TestFlight