/opt/canhelp/.github/workflows
Edit: /opt/canhelp/.github/workflows/mobile-ios.yml (4294B)
name: iOS — Build & Upload TestFlight
on:
push:
tags:
- 'v*' # trigger on version tags: v1.0.0, v1.2.3+4
workflow_dispatch: # manual trigger from GitHub UI
jobs:
build-ios:
name: Build & Upload to TestFlight
runs-on: macos-15
steps:
# ── Checkout ──────────────────────────────────────────────
- name: Checkout code
uses: actions/checkout@v4
# ── Flutter ───────────────────────────────────────────────
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.38.3'
channel: 'stable'
cache: true
- name: Flutter dependencies
working-directory: apps/mobile
run: flutter pub get
# ── Ruby / Fastlane ───────────────────────────────────────
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.2'
bundler-cache: true
working-directory: apps/mobile/ios
# ── Signing certificate ───────────────────────────────────
- name: Import signing certificate
env:
CERTIFICATE_BASE64: ${{ secrets.IOS_CERTIFICATE_BASE64 }}
CERTIFICATE_PASSWORD: ${{ secrets.IOS_CERTIFICATE_PASSWORD }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
run: |
KEYCHAIN_PATH=$RUNNER_TEMP/build.keychain
echo -n "$CERTIFICATE_BASE64" | base64 --decode -o $RUNNER_TEMP/cert.p12
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security import $RUNNER_TEMP/cert.p12 -P "$CERTIFICATE_PASSWORD" \
-A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
# ── Provisioning profile ──────────────────────────────────
- name: Install provisioning profile
env:
PROVISIONING_PROFILE_BASE64: ${{ secrets.IOS_PROVISIONING_PROFILE_BASE64 }}
run: |
PP_PATH=$RUNNER_TEMP/profile.mobileprovision
echo -n "$PROVISIONING_PROFILE_BASE64" | base64 --decode -o $PP_PATH
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles/
# ── dart_defines for CI ───────────────────────────────────
- name: Create dart_defines.ci.json
working-directory: apps/mobile
env:
API_URL: ${{ secrets.PRODUCTION_API_URL }}
GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
GOOGLE_IOS_CLIENT_ID: ${{ secrets.GOOGLE_IOS_CLIENT_ID }}
run: |
cat > config/dart_defines.ci.json <