fastlane 可以有效地帮助我们简化测试、打包、部署、发布等流程。
只需要完成一些简单的配置,之后我们只需要一行命令即可完成这些常规的重复流程,what a relief !
话不多说,马上和 Ficow 一起嗨起来吧~
还没装上 fastlane?现在装吧!
1.在命令行安装 Xcode 命令行工具:
xcode-select --install
2.安装 fastlane:
brew install fastlane
3.在 项目根目录
初始化 fastlane:
fastlane init
遇到问题了?看下 官方教程,或者自行百度、Google,或者也可以留言和 Ficow 交流哈~
这些是开源大神们开发的 常用动作,基本上涵盖了常见的持续集成和持续发布需求,如:测试、截图、打包、签名、上传、发布等等。
您可以在该页面搜索相关的关键字,然后找到可用的动作。
我们需要基于这些基本的动作去构建一些适合我们项目的 lane,这些 lane 通常会包含多个动作,甚至会包含多个其他的 lane。
当然,您也可以在命令行中运行 fastlane action
查看这些动作。
desc "lane description"
lane :my_lane do
scan(
scheme: "my_scheme"
)
end
每个 lane 内可以包含 action 和 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
请根据您项目的需要,将这些环境变量的值替换为实际值。
FASTLANE_APP_ID
,如:https://appstoreconnect.apple.com/apps/1234567/testflight/ios 中的 1234567;FASTLANE_TEAM_ID
;FASTLANE_ITC_TEAM_ID
;APP_STORE_API_KEY_ID
和 APP_STORE_API_KEY_ISSUER_ID
,由于步骤较多,Ficow 会在配置 upload lane 部分详细解释相关的内容;请您注意,后文中提到的环境变量,均为 .env.default
文件中定义的环境变量。
首先,我们配置一个较为简单的单元测试 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,其实也不复杂的啦~
再一次打开 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:
app_store_connect_api_key
,获取访问 App Store Connect API 的 key;latest_testflight_build_number
,获取 app 在 TestFlight 上的最新 build 值;increment_build_number
, 把 app 的 build 值设为 current_build_number;gym
,根据环境变量 GYM_SCHEME
指定的 scheme 来打包 app 并以指定的目录和文件名输出 ipa 文件;pilot
,上传 ipa 包到 TestFlight;这些步骤的详细文档,您在 fastlane actions 中都可以找到。
对于 action 的参数,我们可以通过 ENV 来获取环境变量并赋值,您可以将 ENV 理解为 key-value 字典;
要使用 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_ID
和 APP_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 添加【外部】测试人员,让用户尝鲜
在前文中,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
命令,即可完成以下一系列的动作:
如果有一个步骤失败了,后续步骤就不会继续。也就是,如果单元测试报错了,您可以先修复错误,然后再重新运行该命令。
怎么样?省时省心又省力呢~ ✌🏻 赶快动起手来,把更多的日常工作自动化了吧!
软件开发领域流行一个词,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