Skip to content
Getting Started

Migrating from fastlane

Lane-by-lane mapping from fastlane to shipit equivalents.

Why migrate?

ShipItSwifty replaces a Ruby toolchain with a single Swift binary. No Gemfile, no Bundler, no plugin compatibility matrix — just one CLI you can install via Homebrew or build from source.

Lane-by-lane mapping

fastlaneshipit
matchshipit sign sync
gymshipit archive + shipit export
pilotshipit testflight
delivershipit metadata + shipit upload
scanshipit test
snapshotshipit screenshot (coming soon)
frameitshipit screenshot --frame (coming soon)
pemcovered by ASC API integration
producecovered by ASC API integration
increment_build_number / increment_version_numbershipit version (or a version workflow step)
supplyshipit play-store
add_git_tag / push_to_git_remotegit workflow steps (operation: tag / commit / push), tagging with the {{version}} token

Release lane: tagging the released version

A typical fastlane release lane bumps the version, ships, then tags and pushes:

lane :release do
  capture_screenshots
  build_app
  upload_to_app_store(submit_for_review: true)
  increment_version_number(bump_type: "patch")
  commit_version_bump
  add_git_tag(tag: "v#{lane_context[SharedValues::VERSION_NUMBER]}")
  push_to_git_remote
end

The same flow in Shipfile.yml — note that lane_context[SharedValues::VERSION_NUMBER] becomes the {{version}} token, and the tag step is gated by when: "{{version_changed}}" so build-only bumps don't re-tag:

workflows:
  release:
    - action: screenshot
    - action: archive
      options: { configuration: Release, export_method: app-store }
    - action: export
    - action: upload
      options:
        submit_for_review: true
        phased_release: true
    - action: version
      options: { bump: patch }
    # add_git_tag with the bumped version becomes the {{version}} token —
    # no lane_context plumbing. The tag is skipped on build-only bumps.
    - action: git
      options: { operation: commit, commit_message: "chore: release v{{version}}" }
    - action: git
      when: "{{version_changed}}"
      options: { operation: tag, tag_name: "v{{version}}" }
    - action: git
      options: { operation: push, push_tags: true }

shipit generate --goal release scaffolds this commit/tag/push tail automatically for both iOS and Android. See Workflow tokens & step conditions for the full list of reserved tokens.

What you gain

  • Single binary — no Ruby, no Bundler, no plugin compatibility matrix
  • Native Swift — same language as your app, debuggable with Xcode
  • Guided setupshipit generate walks you through config creation interactively
  • Validation built-in — YAML, metadata, and archive checks before upload

Tool comparison

Common ToolShipItSwifty EquivalentNotes
Archive / buildshipit build + shipit archiveSplit into distinct steps
Test runnershipit testJSON structured output
Screenshot captureshipit snapshotSimulator management built-in
App Store uploadshipit upload + shipit metadataSplit metadata from binary upload
TestFlight uploadshipit testflightFull TestFlight management
Code signing syncshipit sign syncGit/S3 encrypted cert vault
Metadata validationshipit validate metadataPrecheck alias also supported
Build number bumpshipit version --bump buildMultiple strategies
Version bumpshipit version --bump minorSemVer support
Workflow fileShipfile.yml workflowsYAML-based, Swift-native

Next steps