用 fastlane 简化单元测试、打包和TestFlight流程

| iOS , 测试 , 实用工具

 

内容概览

  • 前言
  • 安装 fastlane
  • fastlane actions
  • 配置环境变量
  • 为单元测试配置 test lane
  • 为TestFlight配置 upload lane
  • 配置组合的 test_flight lane
  • 总结

 

前言

 

fastlane 可以有效地帮助我们简化测试、打包、部署、发布等流程。

只需要完成一些简单的配置,之后我们只需要一行命令即可完成这些常规的重复流程,what a relief !

话不多说,马上和 Ficow 一起嗨起来吧~

 

安装 fastlane

 

还没装上 fastlane?现在装吧!

1.在命令行安装 Xcode 命令行工具:

xcode-select --install

2.安装 fastlane:

brew install fastlane

3.在 项目根目录 初始化 fastlane:

fastlane init

遇到问题了?看下 官方教程,或者自行百度、Google,或者也可以留言和 Ficow 交流哈~

 

fastlane actions 和 lanes

 

actions

这些是开源大神们开发的 常用动作,基本上涵盖了常见的持续集成和持续发布需求,如:测试、截图、打包、签名、上传、发布等等。

您可以在该页面搜索相关的关键字,然后找到可用的动作。

我们需要基于这些基本的动作去构建一些适合我们项目的 lane,这些 lane 通常会包含多个动作,甚至会包含多个其他的 lane。

当然,您也可以在命令行中运行 fastlane action 查看这些动作。

lanes

  desc "lane description"
  lane :my_lane do
    scan(
    scheme: "my_scheme"
    )
  end

每个 lane 内可以包含 action 和 lane,可以将其理解为函数。其组成部分如下:

  • desc 之后是 lane 的描述;
  • lane 之后是 lane 的名称;
  • do 与 end 之间是 lane 要执行的具体操作;

进入项目根目录,在命令行中运行 fastlane, 您就可以看到项目中可用的 lane,比如:

 

配置环境变量

 

为了便于在 多个项目 中配置 lane,我们可以将用到的一些项目参数放到环境变量中。这样,多个项目可以共享一套 lane,然后根据项目的需求配置不同的环境变量即可。

1.首先,打开项目根目录的 Gemfile。在 gem "fastlane" 之后,添加新的一行: gem "dotenv",然后保存退出。有了 dotenv,我们就可以在 fastlane 中使用文件来定义环境变量。

2.进入项目根目录中的 fastlane 目录,创建并打开文件 .env.default,添加以下内容:

# Project
XCODEPROJ="myproject.xcodeproj" # Xcode 项目名称
WORKSPACE="myproject.xcworkspace" # Xcode workspace 名称,用于 Cocoapods

# Unit Testing
TEST_SCHEME="myproject-Debug" # 运行单元测试的 scheme
TEST_DEVICES="iPhone 13" # 运行单元测试的模拟器,多个设备:"iPhone 11, iPhone 12"

# GYM
GYM_SCHEME="myproject-AppStore" # 发布上架的 scheme
GYM_OUTPUT_DIR="ipa" # 别改
GYM_OUTPUT_IPA_NAME="my_ios_app.ipa" # 改成您想要的名字,不改也行

FASTLANE_APP_ID="my_id"  # 登录 TestFlight 之后,URL 中的值,如:https://appstoreconnect.apple.com/apps/1234567/testflight/ios 中的 1234567
FASTLANE_TEAM_ID="my_id"
FASTLANE_ITC_TEAM_ID="my_id"
FASTLANE_APP_IDENTIFIER=com.ficow.myproject # 待发布 app 的 bundle id
DEFAULT_RELEASE_NOTES="Bug fixes and performance improvements" # 新版本包含哪些改动

# TestFlight
APP_STORE_API_KEY_ID=my_id # 需要配置 App Store Connect API Key
APP_STORE_API_KEY_ISSUER_ID=my_id # 需要配置 App Store Connect API Key

请根据您项目的需要,将这些环境变量的值替换为实际值。

温馨提示:

请您注意,后文中提到的环境变量,均为 .env.default 文件中定义的环境变量。

 

为单元测试配置 test lane

 

首先,我们配置一个较为简单的单元测试 lane。

打开项目根目录,进入 fastlane 目录,然后打开 Fastfile 文件,如果没有就请新建一个。然后放入以下代码:

default_platform(:ios)

platform :ios do

  desc "Run all the unit tests"
  lane :test do
    scan(
      scheme: "#{ENV['TEST_SCHEME']}",
      workspace: "#{ENV['WORKSPACE']}",
      devices: "#{ENV['TEST_DEVICES']}"
    )
  end

end

以上代码会自动读取 .env.default 中的环境变量,然后运行 scan 这个动作(单元测试)。

保存之后,在项目根目录运行命令:fastlane test,fastlane 会运行上面这个 lane。

如果代码运行正常,就会给出测试的结果。比如:

测试失败:

测试成功:

如果您需要查看测试报告,可以去 项目根目录 - fastlane - test_output 目录中查看 report.html 文件。

如果运行过程中出了其他错,请自行百度、Google,或者也可以留言和 Ficow 交流哈~

有了这个 lane,您就可以很方便地在一些 CI/CD 平台配置自动化测试操作了。比如:每次 git push 之后,在 Jenkins, Bitrise 等工具中触发 fastlane test,这样您自己心爱的笔记本就不用再那么劳累 😄

这个 lane 是比较简单的。接下来,我们来配置一个较为复杂的 lane,其实也不复杂的啦~

 

为TestFlight配置 upload lane

 

再一次打开 Fastfile 文件,然后在 platform :ios do 所在行和 end 所在行之间添加以下代码:

  desc "Archive and upload to TestFlight"
  lane :upload do
    # add actions here: https://docs.fastlane.tools/actions
    api_key = app_store_connect_api_key(
      key_id: "#{ENV['APP_STORE_API_KEY_ID']}",
      issuer_id: "#{ENV['APP_STORE_API_KEY_ISSUER_ID']}",
      key_filepath: "./fastlane/AuthKey_#{ENV['APP_STORE_API_KEY_ID']}.p8",
      duration: 500, # App Store Connect 会话时长的上限
      in_house: false # 企业级开发者
    )
    previous_build_number = latest_testflight_build_number(
      app_identifier: "#{ENV['FASTLANE_APP_IDENTIFIER']}",
      api_key: api_key
    )
    current_build_number = previous_build_number + 1
    increment_build_number(
      xcodeproj: "./#{ENV['XCODEPROJ']}",
      build_number: current_build_number
    )
    gym(
    scheme: "#{ENV['GYM_SCHEME']}",
    output_directory: "#{ENV['GYM_OUTPUT_DIR']}",
    output_name: "#{ENV['GYM_OUTPUT_IPA_NAME']}",
    clean: true
    )
    pilot(
      ipa: "./#{ENV['GYM_OUTPUT_DIR']}/#{ENV['GYM_OUTPUT_IPA_NAME']}",
      skip_submission: true,
      skip_waiting_for_build_processing: true
    )
  end

这个 lane,看起来有点长 😄 没事,Ficow 给您讲清楚!

这里主要分为几个步骤,每个步骤对应一个 action:

  1. app_store_connect_api_key,获取访问 App Store Connect API 的 key;
  2. latest_testflight_build_number,获取 app 在 TestFlight 上的最新 build 值;
  3. increment_build_number, 把 app 的 build 值设为 current_build_number;
  4. gym,根据环境变量 GYM_SCHEME 指定的 scheme 来打包 app 并以指定的目录和文件名输出 ipa 文件;
  5. pilot,上传 ipa 包到 TestFlight;

这些步骤的详细文档,您在 fastlane actions 中都可以找到。
对于 action 的参数,我们可以通过 ENV 来获取环境变量并赋值,您可以将 ENV 理解为 key-value 字典;

App Store Connect API Key:

要使用 fastlane 访问 TestFlight,关键是要获取到 App Store Connect API Key。

获取 API Key 的主要步骤如下:

1.打开 App Store Connect - Users and Access - Keys 页面,https://appstoreconnect.apple.com/access/api ,然后创建新 Key;

2.为了安全起见,请不要给这个 key 太高的权限,Developer足矣;

3.创建完之后,您可以获取到 Issuer ID 和 KEY ID,请将 .env.default 文件中的 APP_STORE_API_KEY_ISSUER_IDAPP_STORE_API_KEY_ID 改为对应的值;

4.下载 API Key,这其实是一个 .p8 文件,可以用文本编辑器查看其中的内容;

5.将该 .p8 文件重命名为 AuthKey_KEY_ID.p8,如:AuthKey_123U5VG6AS.p8 ,然后放到项目中的 fastlane 目录中。

 

检验成果

完成这一系列的配置操作之后,您可以在命令行执行 fastlane upload 命令,然后您需要等待一段时间,这取决于您项目的规模。

请参考下图,如果项目很小,gym 和 pilot(打包与上传)部分的耗时就会比较少。

如果运行过程中出了其他错,请自行百度、Google,或者也可以留言和 Ficow 交流哈~

另外,如果您想邀请测试人员到 TestFlight,可以参考 Ficow 的文章:

用 TestFlight 添加【内部】测试人员,把好最后一关
用 TestFlight 添加【外部】测试人员,让用户尝鲜

 

配置组合的 test_flight lane

 

在前文中,Ficow 有提到过,fastlane 的 lane 中除了有 action 之外,还可以有其他的 lane。

这里,我们以前文中构建的 单元测试TestFlight 为例,构建以下 test_flight lane:

  desc "Test and upload to Test Flight"
  lane :test_flight do
    test
    upload
  end

以后,您只需要运行一行 fastlane test_flight 命令,即可完成以下一系列的动作:

  1. 单元测试;
  2. 自增 build number;
  3. 打包 ipa;
  4. 上传安装包到 TestFlight;

如果有一个步骤失败了,后续步骤就不会继续。也就是,如果单元测试报错了,您可以先修复错误,然后再重新运行该命令。

怎么样?省时省心又省力呢~ ✌🏻 赶快动起手来,把更多的日常工作自动化了吧!

 

总结

 

软件开发领域流行一个词,DRY (Don’t Repeat Yourself)。

咱们作为软件工程师,一定要懂得利用自动化工具来替代人工操作的任务,绝对绝对要避免一次又一次地手动完成流程化的任务。

人生苦短,我用 fastlane,您呢?

感谢您阅读 Ficow 的作品,欢迎您关注、点赞、评论、转发,谢谢啦~

 

最后,附上前文中涉及到的所有代码:FicowShen/FastlaneCodeSnippets

 

参考内容:
actions - fastlane
How to Deliver iOS App with Fastlane and Apple API key | by Tzimikas Dimitris | Coded Lines Digital Stories | Medium
How to Increment Version and Build Numbers with fastlane
How to deploy an iOS app to Tesflight in 5 minutes with Fastlane

 

觉得不错?点个赞呗~

本文链接:用 fastlane 简化单元测试、打包和TestFlight流程

转载声明:本站文章如无特别说明,皆为原创。转载请注明:Ficow Shen's Blog

评论区(期待你的留言)