iOS 使用 fastlane 打包
在一款 App 从开发到上架都会经历 编译 -> 打包 -> 签名 -> 推送 App Store Connect -> 提审 -> 上架 的过程。其中编译打包这种重复且繁琐的工作公司内都会有一个 CI 平台去负责,我们今天就来了解一下 CI 的编译打包流程是怎样的。
fastlane 简介
fastlane 是自动为 iOS 和 Android 应用程序进行测试版部署和发布的最简单方式。它会为你处理所有繁琐的任务,如生成屏幕截图、处理代码签名和发布应用程序。
下面是一个简单的编译发布的例子:
1  | lane :beta do  | 
上面的代码定义了两个不同的打包流程,如果你想在 App Store 发布你的应用,你只需要执行如下操作:
1  | $ fastlane release  | 
使用 fastlane 执行打包流程
Ruby 安装环境
首先我们需要安装一套开发用的 Ruby 环境,macOS 中不推荐直接使用系统的 Ruby。我们可以用多种方式来管理我们的 Ruby 环境,例如 rvm,rebnv,homebrew。由于本人是通过 homebrew 安装的 Ruby 环境,所以本篇只介绍 homebrew 的管理方式,其他方式请自行查阅资料。
对于使用 homebrew 安装 Ruby 可以看我之前的这片文章,这里有详细的说明:使用 Homebrew 管理 Ruby
fastlane 的安装
Ruby 环境设置完毕后我们就可以开始安装 fastlane,同样使用 homebrew 的方式:
1  | $ brew install fastlane  | 
fastlane 的配置
fastlane 安装完成后我们 cd 到我们的工程目录,执行如下命令进行初始化:
1  | $ fastlane init  | 
在此期间,fastlane 将自动检测项目,并询问任何丢失的信息。例如:开发者账号,密码等。
安装完成之后,在我们的工程中会生成一个 fastlane 文件夹,里面有两个重要的文件:Appfile 和 Fastfile。
Appfile 记录了一些开发账号信息,例如:Apple ID、Bundle Identifier等。
Fastfile 则是你打包流程的具体实现,一个简单的例子如下所示:
1  | lane :my_lane do  | 
这时我们在终端中,cd 到我们的工程,然后执行 fastlane my_lane 即会执行我们定义的打包流程。你可以定义很多个 lane 用于执行不同的流程。
fastlane 相关功能简介
非常有用的 block
fastlane 还提供了两个非常有用的 block:before_all 和 after_all。
before_all 此块将在运行 lane 流程之前执行。它支持与 lane 相同的操作。在这个 block 中我们就可以执行一些打包之前需要进行的操作,比如执行 cocoapods。
1  | before_all do |lane|  | 
after_all 故名思义,就是在执行完打包流程之后进行的操作,例如我们可以在这里发送通知,执行打包完成后的脚本等,如下所示:
1  | after_all do |lane|  | 
fastlane 中的错误处理由 error block 处理,当任何块(before_all、lane 本身或 after_all)中发生错误时将执行该 block。我们可以使用 error_info 属性获取有关错误的更多信息。:
1  | error do |lane, exception|  | 
导入其他 Fastfile 文件
如果我们的 Fastfile 比较复杂我们可以拆分成多个文件然后进行 import  操作,就像我们开发时候的头文件导入一般。 对于 import 功能 fastlane 提供了两种方式。
import
导入本地文件路径
1  | import "../GeneralFastfile"  | 
import_from_git
从另一个 git 资源库导入,我们可以使用该资源库为所有项目创建一个带有默认 Fastfile 的 git 资源库:
1  | import_from_git(url: 'https://github.com/fastlane/fastlane')  | 
这还将自动的从 repo 中导入所有的 action。
如果你需要覆盖现有的
lane声明,可以使用override_lane关键字
想更多的了解 Fastfile 请参阅文档: Fastfile
使用环境变量
如果我们的打包环境比较复杂,比如需要适应多个账户打包需求,此时我们可以定义环境变量来管理相关信息。我们可以在与 Fastfile 相同的目录中创建 .env 或 .env.default 文件,然后定义环境变量。使用 dotenv 加载环境变量。下面是一个例子:
1  | WORKSPACE=YourApp.xcworkspace  | 
在 Fastfile 中我们就可以使用如下方式获取相关环境变量:
1  | bundle_identifier = ENV['APP_IDENTIFIER']  | 
更多详细的讲解请看官方文档:Environment Variables
众多的 actions
fastlane 最终要的功能就是提供了众多的 actions 供我们使用,最常用的有:gym (build_app),cocoapods,match,upload_to_testflight,upload_to_testflight等。这里不再做过多的讲解,官方文档已经说的非常清楚,详情请查阅 fastlane actions。
最后附上一个完整的流程示例:
1  | require './xcode_build_settings'  |