iOS 打包发布自动化实践:fastlane

1,713 阅读4分钟

结合近期团队打包发布过程较耗时,影响开发效率问题,最近体验实践了一遍自动打包工具 fastlane,记录一下基本过程及碰到的问题。(纯记录贴,没有实践过的可以看看碰到的问题部分,有经验的前辈可以瞅一眼疑问部分指点一下:)

安装及初始化

按文档,在终端中依次运行以下命令:

  1. 安装最新版本的 Xcode 命令行工具

    xcode-select --install

  2. 安装 fastlane

    # 使用 RubyGems sudo gem install fastlane -NV # 或者使用 Homebrew brew cask install fastlane

  3. 导航至项目目录并运行

    fastlane init

成功后输出:

fastlane init 执行成功

查看项目目录可以看到如终端数据的提示,生成了 fastlane 目录,包含两个文件:FastfileAppfile。以及 GemfileGemfile.lock

配置

主要为配置 AppfileFastfile

Appfile 主要为配置一些通用信息,例如 app_identifier(Bundle Identifier)apple_id(Apple ID)。如果不配置,在执行命令时需要相关信息终端会提示并等待用户输入。如果开发者账号归属于多个 team,需要指定 team_name 及 team_id,如果需要上传到 App Store Connect,需要配置 itc_team_name 及 itc_team_id。还可以为不同的 lane(一个 lane 即为一个打包动作命令集合)复写为不同的值,例如针对测试版本与生产版本做不同配置。

更多关于 Appfile 的配置可参考 Appfile 说明文档

Fastfile 即为具体配置不同 lane 行为的地方。Ruby 不太熟,直观理解起来,感觉像是 fastlane 内置了一些脚本函数(称为 Action),各自完成不同的特定事务,例如最常用的 build_app - 见名知意为编译打包应用,也有如 get_certificates(获取证书)/get_provisioning_profile(获取配置文件)/get_push_certificate(获取推送证书)等等。然后我们在每一个 lane 中按需要组合这些 Actions,也可以在 lane 中调用其他 lane。各 Action 有不同参数配置自定义行为,例如 build_app 可以配置 scheme/workspace/output_directory/output_name 等。

更多关于 Fastfile 的配置可参考 Fastfile 说明文档

至于 lane 具体怎么写,如上面提到的像堆积木一样组合各 Action。作为一个 Ruby 塑料选手,大体上依葫芦画瓢。

Fastfile 大致如:

Fastfile 文件

Tip: 最终在 fastlane 文件夹下会生成一个 README.md 文件,相当于是 doc 文档,记录着各 lanes 名称及描述,还有对应的 fastlane 命令,可以直接 copy 对应的到终端中执行即可。

最后在终端中导航至项目所在目录后执行相应 fastlane 命令即可。

目前基本能达到自动打包发布到蒲公英及提交到 App Store Connect 的预期效果,还有更多进阶使用方式,例如配置环境变量(只试过配置 FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD,因为不想明文写在配置文件里),以及使用插件(只在上传到蒲公英时使用了 fastlane add_plugin pgyer ), 还有自定义 Action 尚未实践过,最后还有持续集成工具的配合,有缘时 有业务需要时实践后再整理记录。

碰到的问题

1. 安装 fastlane 时提示错误 Failed to build gem native extension

错误提示:

ERROR:  Error installing fastlane:
	ERROR: Failed to build gem native extension.

    Building has failed. See above output for more information on the failure.
extconf failed, exit code 1

Gem files will remain installed in /Library/Ruby/Gems/2.3.0/gems/unf_ext-0.0.7.6 for inspection.
Results logged to /Library/Ruby/Gems/2.3.0/extensions/universal-darwin-18/2.3.0/unf_ext-0.0.7.6/gem_make.out

查找到相似的 issue 338。这个 issue 是安装 nokogiri 有问题,推断我的是与 universal-darwin-18 有关?在 issue 里检索一下,发现一个被自动关闭的 issue 13647,然而并没有提出解决方法,似乎与 macOS Mojave 系统有关,最后一个评论是建议完善文档说明这个问题并说他已经放弃使用 fastlane 了,可以说是给 newbie 当头一棒。笑着活下去.jpg

再看看剩与几个相关 issue,终于在这个 issue 12905 找到可行方法,原来是需要手动指定 Xcode 使用的 Command Line Tools 版本。

2. 使用 Action: get_build_number 时报错

fastlane_get_build_number报错

参考 QA1827 提示配置 Xcode Build Settings 中的 Current Project Version & Versioning System,及 info.plist 中的 CFBundleVersion & CFBundleShortVersionString,以使 agvtool 正常工作。

3. 使用 Action get_info_plist_value path 参数无效

在配置 output_name 时想自定义名字后加上 version 及 build 号方便区分。get_build_number 不像 get_version_number 可以指定 target,转而使用通过Action get_info_plist_value(path: value, key: value) 获取对应 Info.plist 中的 CFBundleVersion。 结果提示参数无效,原来是需传入文件相对路径(不能像文档中只写 plist 文件名,如果 plist 不是放在项目根目录下需要写相对路径),客户端开发思维:为什么 fastlane 不是提示文件找不到,直接提示参数无效。

4. Running script 'Run Script' 步骤发生错误

这个问题反复尝试后发现手动 clean 一下,再执行就 OK 了。有点诡异:)

疑问

1. fastlane 中有 slack 的 Action 可以在执行完成后自动发送通知消息,没有找到 QQ/Wechat 的 Action,自定 QQ/Wechat Action 是否具有可行性?

NeXT

参考

  1. Getting started with fastlane for iOS
  2. 使用 Fastlane 上传 App 到蒲公英