From a8f935d61a7ae11ddde7cdf5dad0944b6357ed52 Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 18 Nov 2025 11:17:06 -0500 Subject: [PATCH] feat: Configure Codemagic workflows for multi-environment mobile app distribution --- codemagic.yaml | 136 ++++++++++++++++++++++ docs/prompts/create-codemagic-monorepo.md | 34 ++++++ 2 files changed, 170 insertions(+) create mode 100644 codemagic.yaml create mode 100644 docs/prompts/create-codemagic-monorepo.md diff --git a/codemagic.yaml b/codemagic.yaml new file mode 100644 index 00000000..aee4a5ca --- /dev/null +++ b/codemagic.yaml @@ -0,0 +1,136 @@ +# codemagic.yaml +workflows: + # ================================================================================= + # Base workflow for client_app + # ================================================================================= + client-app-base: &client-app-base + name: Client App Base + working_directory: mobile-apps/client-app + instance_type: mac_mini_m2 + max_build_duration: 60 + environment: + flutter: stable + xcode: latest + cocoapods: default + cache: + cache_paths: + - $HOME/.pub-cache + - $FCI_BUILD_DIR/mobile-apps/client-app/build + - $FCI_BUILD_DIR/mobile-apps/client-app/.dart_tool + + # ================================================================================= + # Base workflow for staff_app + # ================================================================================= + staff-app-base: &staff-app-base + name: Staff App Base + working_directory: mobile-apps/staff-app + instance_type: mac_mini_m2 + max_build_duration: 60 + environment: + flutter: stable + xcode: latest + cocoapods: default + cache: + cache_paths: + - $HOME/.pub-cache + - $FCI_BUILD_DIR/mobile-apps/staff-app/build + - $FCI_BUILD_DIR/mobile-apps/staff-app/.dart_tool + + # ================================================================================= + # Client App Workflows + # ================================================================================= + client-app-dev: + <<: *client-app-base + name: Client App Dev + environment: + groups: + - client_app_dev_credentials # Codemagic Environment Variable Group + scripts: + - *build-script + - *distribute-script + + client-app-staging: + <<: *client-app-base + name: Client App Staging + environment: + groups: + - client_app_staging_credentials # Codemagic Environment Variable Group + scripts: + - *build-script + - *distribute-script + + client-app-prod: + <<: *client-app-base + name: Client App Prod + environment: + groups: + - client_app_prod_credentials # Codemagic Environment Variable Group + scripts: + - *build-script + - *distribute-script + + # ================================================================================= + # Staff App Workflows + # ================================================================================= + staff-app-dev: + <<: *staff-app-base + name: Staff App Dev + environment: + groups: + - staff_app_dev_credentials # Codemagic Environment Variable Group + scripts: + - *build-script + - *distribute-script + + staff-app-staging: + <<: *staff-app-base + name: Staff App Staging + environment: + groups: + - staff_app_staging_credentials # Codemagic Environment Variable Group + scripts: + - *build-script + - *distribute-script + + staff-app-prod: + <<: *staff-app-base + name: Staff App Prod + environment: + groups: + - staff_app_prod_credentials # Codemagic Environment Variable Group + scripts: + - *build-script + - *distribute-script + + # ================================================================================= + # Reusable Scripts + # ================================================================================= + build-script: &build-script + name: Build Flutter App + script: | + flutter pub get + # Uncomment the line below if you use build_runner + # flutter pub run build_runner build --delete-conflicting-outputs + + # Build Android + flutter build appbundle --flavor $FLAVOR + + # Build iOS + flutter build ipa --flavor $FLAVOR --export-options-plist=$FCI_BUILD_DIR/mobile-apps/client-app/ios/exportOptions.plist + +distribute-script: &distribute-script + name: Distribute to Firebase App Distribution + script: | + # Distribute Android + firebase appdistribution:distribute "build/app/outputs/bundle/${FLAVOR}-release/app-${FLAVOR}-release.aab" \ + --app $FIREBASE_APP_ID_ANDROID \ + --release-notes "Build $FCI_BUILD_NUMBER" \ + --groups "$FIREBASE_TESTER_GROUPS" \ + --token $FIREBASE_TOKEN + + # Distribute iOS + firebase appdistribution:distribute "build/ios/ipa/app.ipa" \ + --app $FIREBASE_APP_ID_IOS \ + --release-notes "Build $FCI_BUILD_NUMBER" \ + --groups "$FIREBASE_TESTER_GROUPS" \ + --token $FIREBASE_TOKEN diff --git a/docs/prompts/create-codemagic-monorepo.md b/docs/prompts/create-codemagic-monorepo.md new file mode 100644 index 00000000..6613983c --- /dev/null +++ b/docs/prompts/create-codemagic-monorepo.md @@ -0,0 +1,34 @@ +Looking at the monorepo containing two separate Flutter applications in +- mobile-apps/client-app +- mobile-apps/staff-app +, and I want to configure Codemagic so both apps can be built and distributed to Firebase App Distribution. + +Please do the following: +1. propose the best layout for Codemagic workflows. +2. Create three separate pipelines for each application: + * Development (dev) + * Staging (stage) + * Production (prod) +3. Each pipeline must: + * Build the correct Flutter app inside the monorepo. + * Use the correct Firebase App Distribution credentials for each environment. + * Push the built artifacts (Android + iOS if applicable) to the appropriate Firebase App Distribution app. + * Include environment-specific values (e.g., env variables, bundle IDs, keystore/certs, build flavors). + * Allow triggering pipelines manually. +4. Generate a complete codemagic.yaml example with: + * Separate workflows for: + * `client_app_dev`, `client_app_staging`, `client_app_prod` + * `client_app_dev`, `client_app_staging`, `client_app_prod` + * All required steps (install Flutter/Java/Xcode, pub get, build runner if needed, building APK/AAB/IPA, uploading to Firebase App Distribution, etc.). + * Example Firebase App IDs, release notes, tester groups, service accounts. + * Proper use of Codemagic encrypted variables. + * Best practices for monorepo path handling. +5. Add a short explanation of: + * How each pipeline works + * How to trigger builds + * How to update environment variables for Firebase +6. Output the final result as: + * A complete `codemagic.yaml` + * A brief guide on integrating it with a monorepo + * Notes on debugging, caching, and CI/CD optimization + \ No newline at end of file