Fastlane — 用于iOS和Android移动应用的构建和发布自动化工具。Fastlane管理代码签名、构建、运行测试、创建截图以及上传到App Store Connect和Google Play Console。它是移动开发中CI/CD的事实标准。
主要结论
Fastlane — 是一个开源工具,可自动化移动开发的日常任务:构建应用程序、运行测试、创建截图、管理证书、将构建上传到TestFlight、App Store和Google Play。Fastlane用Ruby编写,通过RubyGems使用命令gem install fastlane分发。
Fastlane于2015年作为iOS工具出现,但很快扩展到Android。如今它是一个由数十个操作组成的生态系统——可以组合成称为lanes的场景的内置命令。每个lane执行特定任务:例如build_release构建发布版本,deploy_beta将构建上传到TestFlight。
Fastlane被Uber、Airbnb、Snapchat、Twitter和Shopify等公司使用。根据2024年的调查,超过60%的iOS开发者在其项目中使用Fastlane。该工具既支持本地运行,也支持与云CI系统集成,使其成为移动CI/CD的事实标准。
# 安装Fastlane
sudo gem install fastlane -NV
# 在项目中初始化
fastlane init
初始化后,Fastlane创建fastlane/目录,包含三个文件:Fastfile(场景)、Appfile(应用设置)和Matchfile(证书设置)。此结构对两个平台——iOS和Android——保持一致。
Fastlane的主要配置文件——Fastfile。它位于项目根目录的fastlane/文件夹中。Fastfile用Ruby编写:每个lane是一个带有操作序列的命名块。Lane可以接受参数、调用其他lanes并返回值。
# fastlane/Fastfile — iOS示例
default_platform(:ios)
platform :ios do
desc "Build and upload to TestFlight"
lane :beta do
match(type: "appstore")
gym(scheme: "MyApp", configuration: "Release")
pilot(skip_waiting_for_build: true)
end
desc "Deploy to App Store"
lane :release do
ensure_git_status_clean
match(type: "appstore")
gym(scheme: "MyApp")
deliver(
skip_metadata: true,
skip_screenshots: true
)
push_to_git_remote(tags: true)
end
end
每个lane通过命令fastlane ios beta或fastlane ios release启动。Fastfile支持变量、条件、循环和调用外部脚本——它是一个完整的Ruby文件。开发者可以通过private_lane(本地方法)和从其他Fastfile import来重用代码。
Fastlane为大多数任务提供了超过200个内置操作。如果所需操作不存在,可以用Ruby编写自己的操作,或通过sh("...")调用shell命令。操作可以接受参数——构建设置、路径、访问令牌——并返回结果供下一步使用。
Fastlane for iOS解决三个关键问题:管理证书和配置文件、通过Xcode构建IPA以及发布到App Store Connect和TestFlight。每个任务都由单独的操作覆盖。
match — 用于管理证书的操作。它将所有证书和配置文件存储在加密的Git仓库中。每个开发者和CI服务器使用相同的文件集,消除了冲突和证书过期问题。Match在添加新设备时自动更新配置文件。
sigh — 通过Apple Developer Portal创建和下载配置文件。当需要快速获取特定类型的配置文件时使用:development、ad-hoc或appstore。
gym — 构建IPA。Gym用最优参数封装xcodebuild,自动选择方案、配置、导出选项,并创建签名的IPA。示例:gym(scheme: "MyApp", export_method: "app-store")。
pilot — 管理TestFlight。上传构建、添加测试人员、跟踪审核状态。deliver — 在App Store中完整发布,包括元数据、截图、价格和版本。
# 构建和发布iOS应用
lane :deploy_ios do
cocoapods
match(type: "appstore", readonly: true)
gym(scheme: "MyApp", export_method: "app-store")
pilot(changelog: "Bug fixes and performance improvements")
end
使用App Store Connect需要访问令牌。Fastlane支持两种认证方式:App Store Connect API密钥(推荐)和带有两步验证的Apple ID。API密钥更方便CI/CD使用,因为它们不需要交互式密码输入。
| 操作 | 用途 | 手动对应 |
|---|---|---|
match | 管理证书和配置文件 | Apple Developer Portal |
sigh | 创建配置文件 | Xcode + Developer Portal |
gym | 构建IPA | xcodebuild + xcrun |
pilot | 上传到TestFlight | Xcode Organizer |
deliver | 在App Store发布 | App Store Connect Web |
scan | 运行UI测试 | xcodebuild test |
在Android上,Fastlane自动化通过Gradle构建、APK和AAB签名、上传到Google Play Console和Firebase App Distribution。
gradle — Android构建的主要操作。调用带有所需任务的Gradle wrapper:gradle(task: "assembleRelease")或对于AAB使用gradle(task: "bundleRelease")。可以传递标志、环境变量和gradle.properties的路径。
supply — 上传APK或AAB到Google Play Console。Supply管理版本、轨道(internal、alpha、beta、production)、发布说明、价格和分发国家。示例:supply(track: "beta", release_status: "completed")。
screengrab — 为Google Play创建截图。运行仪器化测试,在不同设备和语言上截取应用屏幕截图。获得的截图通过supply上传。
# 构建和发布Android应用
lane :deploy_android do
gradle(task: "clean bundleRelease")
supply(
track: "beta",
release_status: "completed",
version_code: 42
)
end
| 操作 | 用途 | 手动对应 |
|---|---|---|
gradle | 通过Gradle构建 | ./gradlew assembleRelease |
supply | 上传到Google Play | Google Play Console Web |
screengrab | 创建截图 | 手动截图 + ImageMagick |
firebase_app_distribution | 通过Firebase分发 | Firebase Console Upload |
Fastlane设计用于CI/CD流水线。它正确处理非交互模式、环境变量和构建产物。以下是与流行CI系统集成的示例。
在GitHub Actions中,Fastlane作为Ruby脚本运行。典型工作流程:安装Ruby和Fastlane,配置密钥(证书、API令牌通过secrets),运行lane。iOS需要macOS运行器;Android在ubuntu-latest上运行。
在GitLab CI中,Fastlane在.gitlab-ci.yml中使用,方案类似:安装依赖、运行fastlane、传递产物。GitLab CI支持macOS和Linux运行器。
Bitrise — 专为移动应用设计的CI/CD — 内置对Fastlane的支持。Bitrise Workflow可以调用Fastlane Step或使用fastlane运行任意脚本。Bitrise通过其自己的代码签名管理器管理证书。
# 带条件测试执行的CI/CD Fastfile
lane :ci_test do
scan(scheme: "MyApp", code_coverage: true)
end
lane :ci_beta do
ensure_git_status_clean
version_bump_podspec(path: "MyApp.podspec")
match(type: "appstore", readonly: true)
gym(scheme: "MyApp", export_method: "app-store")
pilot(distribute_external: true)
end
CI/CD集成的一个重要方面——秘密存储。Fastlane通过dotenv使用.env文件和环境变量。对于iOS,关键变量是:MATCH_PASSWORD、FASTLANE_APPLE_API_KEY、FASTLANE_APPLE_API_KEY_ID。对于Android:SUPPLY_JSON_KEY_DATA — Google Play服务账号的内容。
Fastlane包含超过200个内置操作。以下是按平台和用途分类的最流行操作的概览。
| 操作 | 平台 | 描述 |
|---|---|---|
gym | iOS | 使用优化的xcodebuild参数构建IPA |
match | iOS | 通过Git同步证书和配置文件 |
pilot | iOS | 上传构建到TestFlight并管理测试人员 |
deliver | iOS | 在App Store发布应用并附带元数据 |
scan | iOS | 运行单元和UI测试并生成报告 |
gradle | Android | 运行Gradle任务:assemble、bundle、test |
supply | Android | 上传APK和AAB到Google Play Console |
screengrab | Android | 为Google Play自动截图 |
firebase_app_distribution | Android | 通过Firebase分发构建 |
snapshot | iOS | 在模拟器上为App Store自动截图 |
increment_build_number | iOS | 在Xcode项目中自动增加构建号 |
appcenter_upload | 两者 | 上传构建到App Center |
要搜索所需操作,使用命令fastlane action [名称],它会显示文档、参数和示例。完整列表可在本地查看:fastlane actions。
Fastlane还支持插件——添加新操作的社区扩展。插件通过fastlane add_plugin [名称]安装,并在RubyGems注册表中可用。流行插件的示例:fastlane-plugin-versioning(版本管理)、fastlane-plugin-sentry(将调试符号上传到Sentry)、fastlane-plugin-teams(Microsoft Teams中的通知)。
Frequently Asked Questions
Fastlane — 是用于移动应用构建和发布自动化的工具。它用于用一条命令替代手动操作——构建、签名、上传到商店。Fastlane将发布时间从几小时缩短到几分钟,并消除发布中的人为错误。
可以。Fastlane独立支持两个平台。iOS需要macOS,Android只需要Linux。在一个Fastfile中,可以按平台划分lanes:platform :ios do ... end和platform :android do ... end。
通过match操作。它将加密的证书和配置文件存储在Git仓库中。每个开发者克隆仓库,match使用来自MATCH_PASSWORD变量的密码解密文件并将其安装到钥匙串中。这解决了"在我机器上能构建"的问题。
是的。Fastlane有内置的firebase_app_distribution操作用于将APK和IPA上传到Firebase App Distribution。还有firebase_app_distribution_add_testers用于添加测试人员。替代方案是用于App Center的appcenter_upload操作。
Fastlane通过RubyGems安装:gem install fastlane -NV。iOS需要带有Xcode的macOS;Android需要带有JDK和Android SDK的Linux或macOS。在GitHub Actions中,有现成的ruby/setup-ruby操作用于安装Ruby和Fastlane。环境变量通过CI系统的secrets传递。
Fastlane — 是用于构建和发布任务自动化的库和CLI。Bitrise和Jenkins — 是完整的CI/CD平台。Fastlane在它们内部工作:Jenkins将Fastlane作为流水线步骤运行,Bitrise通过特殊的Step调用Fastlane。Fastlane不替换CI系统,而是用移动特性补充它。
Summary
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。