# Note: key.properties files are now committed to the repository # CodeMagic keystores are uploaded via Team Settings > Code signing identities > Android keystores # The keystores are referenced in each workflow's environment section with custom variable names # Reusable script for building the Flutter app client-app-android-apk-build-script: &client-app-android-apk-build-script name: 👷 🤖 Build Client App APK (Android) script: | dart pub global activate melos export PATH="$PATH":"$HOME/.pub-cache/bin" make mobile-install make mobile-client-build PLATFORM=apk MODE=release ENV=$ENV client-app-ios-build-script: &client-app-ios-build-script name: 👷 🍎 Build Client App (iOS) script: | dart pub global activate melos export PATH="$PATH":"$HOME/.pub-cache/bin" make mobile-install make mobile-client-build PLATFORM=ios MODE=release ENV=$ENV staff-app-android-apk-build-script: &staff-app-android-apk-build-script name: 👷 🤖 Build Staff App APK (Android) script: | dart pub global activate melos export PATH="$PATH":"$HOME/.pub-cache/bin" make mobile-install make mobile-staff-build PLATFORM=apk MODE=release ENV=$ENV staff-app-ios-build-script: &staff-app-ios-build-script name: 👷 🍎 Build Staff App (iOS) script: | dart pub global activate melos export PATH="$PATH":"$HOME/.pub-cache/bin" make mobile-install make mobile-staff-build PLATFORM=ios MODE=release ENV=$ENV # Reusable script for distributing Android to Firebase distribute-android-script: &distribute-android-script name: 🚀 🤖 Distribute Android to Firebase App Distribution script: | # Distribute Android APK # With flavors the APK is at: build/app/outputs/apk//release/app--release.apk APP_PATH=$(find apps/mobile/apps -name "app-${ENV}-release.apk" | head -n 1) if [ -z "$APP_PATH" ]; then echo "❌ No APK found matching app-${ENV}-release.apk — was --flavor ${ENV} applied during build?" echo "Listing all APKs found:" find apps/mobile/apps -name "*.apk" -type f exit 1 fi echo "Found APK at: $APP_PATH" firebase appdistribution:distribute "$APP_PATH" \ --app $FIREBASE_APP_ID_ANDROID \ --release-notes "Build $FCI_BUILD_NUMBER - Environment: $ENV" \ --groups "$FIREBASE_TESTER_GROUPS" \ --token $FIREBASE_TOKEN # Reusable script for distributing iOS to Firebase distribute-ios-script: &distribute-ios-script name: 🚀 🍎 Distribute iOS to Firebase App Distribution script: | # Distribute iOS IPA_PATH=$(find apps/mobile/apps -name "*.ipa" | head -n 1) if [ -z "$IPA_PATH" ]; then echo "No IPA found!" exit 1 fi echo "Found IPA at: $IPA_PATH" firebase appdistribution:distribute "$IPA_PATH" \ --app $FIREBASE_APP_ID_IOS \ --release-notes "Build $FCI_BUILD_NUMBER - Environment: $ENV" \ --groups "$FIREBASE_TESTER_GROUPS" \ --token $FIREBASE_TOKEN # Reusable script for web quality checks web-quality-script: &web-quality-script name: 🌐 ✅ Web Quality Checks script: | npm install -g pnpm cd apps/web pnpm install --frozen-lockfile pnpm lint pnpm test pnpm build # Reusable script for mobile quality checks mobile-quality-script: &mobile-quality-script name: 📱 ✅ Mobile Quality Checks script: | dart pub global activate melos export PATH="$PATH":"$HOME/.pub-cache/bin" make mobile-install make mobile-analyze make mobile-test workflows: # ================================================================================= # Quality workflow (Web + Mobile) # ================================================================================= quality-gates-dev: name: 🛡️ Quality Gates (Dev) working_directory: . instance_type: mac_mini_m2 max_build_duration: 60 environment: flutter: stable xcode: latest cocoapods: default groups: - client_app_dev_credentials vars: ENV: dev scripts: - *web-quality-script - *mobile-quality-script # ================================================================================= # Base workflow for client_app # ================================================================================= client-app-base: &client-app-base name: Client App Base working_directory: . instance_type: mac_mini_m2 max_build_duration: 60 environment: flutter: stable xcode: latest cocoapods: default artifacts: - apps/mobile/apps/client/build/app/outputs/flutter-apk/*.apk - apps/mobile/apps/client/build/ios/ipa/*.ipa - apps/mobile/apps/client/build/app/outputs/bundle/**/*.aab - /tmp/xcodebuild_logs/*.log - flutter_drive.log cache: cache_paths: - $HOME/.pub-cache - $FCI_BUILD_DIR/apps/mobile/apps/client/build - $FCI_BUILD_DIR/apps/mobile/apps/client/.dart_tool # ================================================================================= # Base workflow for staff_app # ================================================================================= staff-app-base: &staff-app-base name: Staff App Base working_directory: . instance_type: mac_mini_m2 max_build_duration: 60 environment: flutter: stable xcode: latest cocoapods: default artifacts: - apps/mobile/apps/staff/build/app/outputs/flutter-apk/*.apk - apps/mobile/apps/staff/build/ios/ipa/*.ipa - apps/mobile/apps/staff/build/app/outputs/bundle/**/*.aab - /tmp/xcodebuild_logs/*.log - flutter_drive.log cache: cache_paths: - $HOME/.pub-cache - $FCI_BUILD_DIR/apps/mobile/apps/staff/build - $FCI_BUILD_DIR/apps/mobile/apps/staff/.dart_tool # ================================================================================= # 💼 Client App Workflows - Android # ================================================================================= client-app-dev-android: <<: *client-app-base name: 🚚 🤖 Client App Dev (Android → Firebase App Distribution) environment: flutter: stable xcode: latest cocoapods: default groups: - client_app_dev_credentials android_signing: - keystore: KROW_CLIENT_DEV vars: ENV: dev scripts: - *client-app-android-apk-build-script - *distribute-android-script client-app-staging-android: <<: *client-app-base name: 🚚 🤖 Client App Staging (Android → Firebase App Distribution) environment: flutter: stable xcode: latest cocoapods: default groups: - client_app_staging_credentials android_signing: - keystore: KROW_CLIENT_STAGING vars: ENV: stage scripts: - *client-app-android-apk-build-script - *distribute-android-script client-app-prod-android: <<: *client-app-base name: 🚚 🤖 Client App Prod (Android → Firebase App Distribution) environment: groups: - client_app_prod_credentials android_signing: - keystore: KROW_CLIENT_PROD vars: ENV: prod scripts: - *client-app-android-apk-build-script - *distribute-android-script # ================================================================================= # 💼 Client App Workflows - iOS # ================================================================================= client-app-dev-ios: <<: *client-app-base name: 🚚 🍎 Client App Dev (iOS → Firebase App Distribution) environment: groups: - client_app_dev_credentials vars: ENV: dev scripts: - *client-app-ios-build-script - *distribute-ios-script client-app-staging-ios: <<: *client-app-base name: 🚚 🍎 Client App Staging (iOS → Firebase App Distribution) environment: groups: - client_app_staging_credentials vars: ENV: stage scripts: - *client-app-ios-build-script - *distribute-ios-script client-app-prod-ios: <<: *client-app-base name: 🚚 🍎 Client App Prod (iOS → Firebase App Distribution) environment: groups: - client_app_prod_credentials vars: ENV: prod scripts: - *client-app-ios-build-script - *distribute-ios-script # ================================================================================= # 👨‍🍳 Staff App Workflows - Android # ================================================================================= staff-app-dev-android: <<: *staff-app-base name: 🚚 🤖 👨‍🍳 Staff App Dev (Android → Firebase App Distribution) environment: flutter: stable xcode: latest cocoapods: default groups: - staff_app_dev_credentials android_signing: - keystore: KROW_STAFF_DEV vars: ENV: dev scripts: - *staff-app-android-apk-build-script - *distribute-android-script staff-app-staging-android: <<: *staff-app-base name: 🚚 🤖 👨‍🍳 Staff App Staging (Android → Firebase App Distribution) environment: flutter: stable xcode: latest cocoapods: default groups: - staff_app_staging_credentials android_signing: - keystore: KROW_STAFF_STAGING vars: ENV: stage scripts: - *staff-app-android-apk-build-script - *distribute-android-script staff-app-prod-android: <<: *staff-app-base name: 🚚 🤖 👨‍🍳 Staff App Prod (Android → Firebase App Distribution) environment: flutter: stable xcode: latest cocoapods: default groups: - staff_app_prod_credentials android_signing: - keystore: KROW_STAFF_PROD vars: ENV: prod scripts: - *staff-app-android-apk-build-script - *distribute-android-script # ================================================================================= # 👨‍🍳 Staff App Workflows - iOS # ================================================================================= staff-app-dev-ios: <<: *staff-app-base name: 🚚 🍎 👨‍🍳 Staff App Dev (iOS → Firebase App Distribution) environment: groups: - staff_app_dev_credentials vars: ENV: dev scripts: - *staff-app-ios-build-script - *distribute-ios-script staff-app-staging-ios: <<: *staff-app-base name: 🚚 🍎 👨‍🍳 Staff App Staging (iOS → Firebase App Distribution) environment: groups: - staff_app_staging_credentials vars: ENV: stage scripts: - *staff-app-ios-build-script - *distribute-ios-script staff-app-prod-ios: <<: *staff-app-base name: 🚚 🍎 👨‍🍳 Staff App Prod (iOS → Firebase App Distribution) environment: groups: - staff_app_prod_credentials vars: ENV: prod scripts: - *staff-app-ios-build-script - *distribute-ios-script