← Flutter Reference

Fastlane vs Codemagic

CI/CD

By Abdelrahman Saed — Senior Mobile Engineer. Last updated: 2026-08-10.

Quick answer

Use Fastlane when you want release automation that runs anywhere (your Mac, GitHub Actions, any CI) and stays under your version control as Ruby files. Use Codemagic when you want a managed CI that handles iOS signing, Flutter builds, and store publishing without you managing machines or signing identities.

At iStoria we standardized on GitHub Actions + Fastlane because we already live in GitHub, need fine-grained control over the pipeline, and want the release logic in the repo as code. Codemagic is excellent for teams that want to avoid iOS-signing hell and Mac infrastructure entirely — but you pay in vendor lock-in and per-build cost.

Feature comparison

FeatureFastlaneCodemagic
TypeAutomation toolchain (Ruby)Managed CI/CD service
Runs whereAny Mac / CI runnerCodemagic cloud (managed Mac)
iOS signingmatch (you manage certs)Fully managed
ConfigFastfile (Ruby, in repo)codemagic.yaml / UI
PortabilityHigh — any CILocked to Codemagic
CostFree + your infraPer-build-minute pricing
Flutter integrationVia Flutter CLI in lanesFirst-class
Store publishingdeliver / supply lanesBuilt-in steps
CustomizationFull (arbitrary Ruby)Platform-constrained

Detailed comparison

What each is

Fastlane is a Ruby-based automation toolchain (lanes) for mobile release tasks: building, signing, screenshot generation, metadata management, and App Store / Play Store upload. You define Fastfile lanes in your repo and run them anywhere Ruby runs — local Mac, GitHub Actions macos-latest, any CI.

Codemagic is a managed CI/CD service purpose-built for mobile (and Flutter in particular). You configure builds in a codemagic.yaml or via UI, and Codemagic provides the Mac hardware, manages iOS code signing, runs Flutter builds, and publishes to stores.

Portability vs managed convenience

Fastlane is portable: the same Fastfile runs on your laptop and in GitHub Actions. The release logic lives in your repo and is reviewable in PRs. You bring the infrastructure (a Mac, CI runners).

Codemagic is managed: they provide Mac hardware, handle provisioning profiles and signing certificates, and integrate store publishing. You do not manage machines or signing identities — but you are locked to their platform and pricing model.

iOS signing — the real pain

iOS code signing is the single biggest reason teams pick Codemagic. Managing signing identities, provisioning profiles, and App Store Connect API keys across CI is genuinely painful. Codemagic abstracts this. Fastlane's match (with a private git repo or cloud storage for certificates) solves it too, but you set it up and maintain it.

If you have already solved signing with Fastlane match, there is little reason to move to Codemagic. If you have not and want to avoid the rabbit hole, Codemagic is attractive.

Cost model

Fastlane is free; you pay for the infrastructure it runs on (your Mac, or GitHub Actions macOS minutes — which are expensive, ~10x Linux minutes). Codemagic charges per build minute (Mac plans are pricier). For a team already on GitHub Actions, Fastlane reuses existing CI budget; Codemagic is a separate line item.

Control and customization

Fastlane lanes are arbitrary Ruby — full programmatic control, integrate any tool, run any shell command. Codemagic yaml is powerful but constrained to what the platform exposes. For elaborate release governance (the kind we enforce — branch protection, flavor-aware builds, staged rollouts), Fastlane-as-code in the repo wins.

Code comparison

Fastlane lane — Flutter build + upload (runs in GitHub Actions)

# Fastfile
default_platform(:ios)

lane :beta do
  sh("flutter build ipa --flavor production --release")
  upload_to_testflight(
    ipa: "build/ios/ipa/production.ipa",
    skip_waiting_for_build_processing: true,
  )
end

# GitHub Actions step
# - run: bundle exec fastlane beta

Codemagic — codemagic.yaml (managed)

workflows:
  flutter-ios:
    name: Flutter iOS Beta
    environment:
      flutter: stable
      ios_signing:
        distribution_type: app_store
        bundle_identifier: com.istoria.app
    scripts:
      - flutter build ipa --flavor production --release
    artifacts:
      - build/ios/ipa/*.ipa
    publishing:
      app_store_connect:
        api_key: $APP_STORE_KEY
        submit_to_testflight: true

Fastlane's lane is portable Ruby that runs anywhere; Codemagic's yaml is platform-specific but handles signing and hardware for you.

Which should you choose?

Choose Fastlane when: you want release logic as reviewable code in your repo, you already have CI infrastructure (GitHub Actions, Mac runners), you need elaborate custom release governance, or you want to avoid vendor lock-in. Pair it with match for signing.

Choose Codemagic when: you want to offload iOS signing and Mac infrastructure entirely, you value a managed Flutter-first experience, your team is small and does not want to maintain CI machinery, or you are willing to pay per-build for convenience.

Related definitions

Related reading

FAQ

Can I use Fastlane inside Codemagic?

Yes — Codemagic can run Fastlane lanes in its build scripts, so you can combine Codemagic's managed signing/hardware with your existing Fastfile. Common when teams migrate incrementally.

Is GitHub Actions replacing both?

GitHub Actions with macos runners + Fastlane is what we run, and it can fully replace Codemagic for Flutter. You still manage iOS signing (via match). The trade-off is macOS minute cost and signing setup vs Codemagic's managed convenience.

Which is cheaper for a small team?

If you already pay for GitHub Actions, Fastlane reuses that budget (watch macOS minute costs). Codemagic has a free tier but scales to paid Mac plans. For sporadic releases, Codemagic's free tier may win; for high build volume, owned CI + Fastlane is usually cheaper.

How do I handle Flutter flavors with each tool?

Both handle flavors, but the setup differs. Fastlane lanes receive parameters — lane :beta do |options| — so you parameterize the flavor, scheme, and output path per lane invocation and call the right one from CI. Codemagic declares flavors in its environment config and yaml scripts, which is more declarative but less flexible if your release matrix is complex. In our multi-flavor production setup (dev, staging, production), Fastlane's parameterized lanes give us one Fastfile that handles every variant, which is cleaner than maintaining parallel Codemagic workflow definitions.


Available for hire. Abdelrahman Saed is a Senior Mobile Engineer (Flutter) — open to full-time, fractional, contract, or advisory work. Hire me →

Book a 20-minute call · Download the CV (PDF) · See how I work