| name | configuring-codemagic |
| description | Configures Codemagic CI/CD pipelines for Flutter using `codemagic.yaml`. Use when setting up automated Flutter builds on Codemagic, configuring iOS code signing without Fastlane Match, deploying to App Store Connect or Google Play from Codemagic, caching pub dependencies in Codemagic, setting up encrypted environment variable groups, running tests with Codemagic's test dashboard, or choosing between Codemagic and GitHub Actions + Fastlane for a Flutter CI/CD pipeline. |
| metadata | {"last_modified":"2026-04-01 14:35:00 (GMT+8)"} |
Flutter combined with Codemagic Best Practices (YAML approach)
Goal
Implements Codemagic YAML configurations for Flutter deployment. Codemagic natively understands Flutter, requires no extra tooling for code signing, and provides Apple M-series machines for fast iOS compilation.
Instructions
The recommended approach is using codemagic.yaml for "Infrastructure as Code," maintaining it within the project repository alongside the source code.
1. Infrastructure and Cache Strategy
Place codemagic.yaml in the project root. A single file can contain multiple Workflows (e.g., executing iOS deployments and Android deployments separately).
Best Caching Practice: Caching is fundamental to saving CI costs. Be sure to cache Dart dependencies and native build tools.
workflows:
android-release:
name: Android Release Workflow
instance_type: mac_mini_m1
environment:
flutter: stable
cache:
cache_paths:
- $HOME/.pub-cache
- $HOME/.gradle/caches
2. Environment Variables & Encrypted Keys
NEVER hardcode Keystore passwords or API Keys in the YAML file. Codemagic provides highly secure UI dashboards to create variable groups, encrypt them, and consume them via scripts.
environment:
flutter: stable
groups:
- keystore_credentials
- google_play_credentials
3. Analyze, Generate & Test
Before building, utilize the scripts block to execute commands sequentially.
scripts:
- name: โฌ๏ธ Fetch Dependencies
script: flutter packages pub get
- name: โ๏ธ Code Generation (build_runner)
script: dart run build_runner build --delete-conflicting-outputs
- name: ๐จ Static Analysis
script: flutter analyze
- name: ๐งช Unit & Widget Tests
script: flutter test
test_report: build/test-results/flutter.json
4. Build Bundle / IPA
Codemagic's greatest strength lies in condensing complex Code Signing flows into extremely minimalist declarative syntax.
4.1 Android Building (with Keystore)
- name: ๐จ Build Android App Bundle
script: |
# Generate a key.properties for android/app/build.gradle to read
echo "storePassword=$KEYSTORE_PASSWORD" >> android/key.properties
echo "keyPassword=$KEY_PASSWORD" >> android/key.properties
echo "keyAlias=$KEY_ALIAS" >> android/key.properties
echo "storeFile=$KEYSTORE_PATH" >> android/key.properties
flutter build appbundle --release
4.2 iOS Code Signing
You typically do not need to manually configure Fastlane Match. Upload your App Store Connect API Key via Codemagic's Web Dashboard, and it automatically handles certificate fetching:
environment:
ios_signing:
distribution_type: app_store
bundle_identifier: com.yourcompany.app
scripts:
- name: ๐ Build iOS IPA
script: flutter build ipa --release
5. Push to Store (Publishing)
Once the build concludes, declare the target artifacts, and automatically push directly to the stores utilizing built-in modulesโno upload scripting required!
artifacts:
- build/app/outputs/bundle/release/**/*.aab
- build/ios/ipa/*.ipa
publishing:
email:
recipients:
- devteam@company.com
google_play:
credentials: $GCP_SERVICE_ACCOUNT_CREDENTIALS
track: internal
app_store_connect:
auth: integration
submit_to_testflight: true
Constraints
- Prefer
codemagic.yaml over the Codemagic UI workflow editor โ keeping pipeline configuration in the repository alongside source code is the recommended "Infrastructure as Code" approach.
- For teams already using Fastlane, Codemagic can still call
bundle exec fastlane <lane> from its scripts block; the two tools are not mutually exclusive.