一、Fastlane是什么
1、简介
Fastlane是用Ruby语言编写的一套自动化工具集和框架,每一个工具实际都对应一个Ruby脚本,用来执行某一个特定的任务,而Fastlane核心框架则允许使用者通过类似配置文件的形式,将不同的工具有机而灵活的结合在一起,从而形成一个个完整的自动化流程。
2、原理
- Fastlane命令执行的底层并不是自己实现的,而是调用其他的插件或者工具执行的。
- 核心一:打包命令,Fastlane中的
gym
工具只是xcodebuild工具的一个封装。因此安装Fastlane的步骤里有安装IDE的指令集。 - 核心二:iTC(即iTunesConnect 苹果的账号证书应用管理平台)命令。苹果除了提供图形化可操作的网页之外,还提供相对应的一整套底层 API 给开发者使用,Fastlane的底层操作是封装的这套API。
3、功能
-
基础功能
- 所有功能
二、Fastlane的安装
安装参考:https://www.jianshu.com/p/c38157e5d6c1
ruby版本必须高于2.0,macbook自带的ruby可能低于2.0
不要卸载、更改mac系统内置的ruby!mac系统需要它,更改以后,会导致mac系统故障!
使用rvm管理和安装指定版本的ruby
三、Fastlane使用及问题
1、fastlane init
的选择问题
fastlane init
新版本安装的时候出现了下面的分支选择,按要求选择就行
1. Automate screenshots(自动截屏)
2. Automate beta distribution to TestFlight (自动testfilght型配置)
3. Automate App Store distribution (自动发布型配置)
4. Manual setup - manually setup your project to automate your (需要手动配置内容)
这里我们选择4,然后一直按回车。会生成Gemfile文件,fastlane文件夹,Appfile,Fastfile文件。
2、配置文件解释
Appfile: 存储有关开发者账号相关信息
Fastfile: 核心文件,主要用于命令行调用和处理具体的流程,lane相对于一个方法或者函数
Deliverfile: deliver工具的配置文件
metadata: 元数据文件夹
screenshots: 截图文件夹
Matchfile: Match操作对应的配置文件
- 如果Deliverfile、screenshots和metadata没有自动生成,通过
deliver init
可以重新初始化 - Matchfile: match 这个action的配置文件,
fastlane match init
自动生成
不要手动创建这些文件
3、关于Gemfile
- 这里可以对比cocoapods,cocoapods和fastlane一样,也是基于Ruby的开发脚本集合。
- gemfile和podfile、gemfile.lock和podfile.lock其实很相似。
- gemfile管理gem,就像podfile管理pod,简单的说都是进行索引绑定的。当我们在podfile中添加一个第三库需要执行
pod install
,同样需要执行bundle install
用于更新gemfile,podfile.lock和gemfile.lock里面就会生成相应的所关联的资源的版本信息。 - RubyGems简称gem,RubyGems是一个包管理框架,提供了ruby社区的gem的托管服务,用于ruby软件包的下载、安装、使用;ruby的软件包被称为gem,包含了ruby应用或库。
1)那么可以理解为:fastlane、cocoapods就是ruby的软件包,就是gem。所以gemfile管理的就是fastlane的版本。
2)类似于pod更新,bundle update fastlane
用于更新fastlane版本。
3)在实际项目中为了使用固定的fastlane版本,都建议使用bundle exec fastlane [lane_name]
来执行fastlane命令,如jenkins中打包。
4)综上所述,Gemfile其实就是一个管理fastlane版本的工具。
4、Fastfile代码生命周期
执行顺序 | 方法名 | 说明 |
---|---|---|
1 | before_all | 脚本自动执行的第一个 lane,只执行一次 |
2 | before_each | 每次执行 lane 之前都会执行一次 |
3 | lane | 自定义的任务 |
4 | after_each | 每次执行 lane 之后都会执行一次 |
5 | after_all | 脚本自动执行的最后一个 lane,只执行一次 |
6 | error | 在执行上述情况任意环境报错都会中止并执行一次 |
5、Actions
- Actions:fastlane提供的已经写好的独立的方法库。Action是Fastlane自动化流程中的最小执行单元,直观上来讲就是Fastfile脚本中的一个个命令,而这些命令背后都对应一个用Ruby编写的脚本。
- 到目前为止,Fastlane的工具集大约包含180多个Action,基本上涵盖了git,打包,签名,测试,部署,发布,库管理等等移动开发中涉及到的内容。
-
fastlane actions
: 查看action列表 -
fastlane action [action_name]
:查看具体action 描述
常用Actions
- scan => 自动运行测试工具,并且可以生成漂亮的HTML报告,支持sonnar
-
match => 一个新的证书和描述文件管理工具。会把所有需要用到的证书传到git私有库上,任何需要配置的机器直接用match同步回来就不用管证书问题了
1.match只认识通过match方式创建的pp文件 证书,其他方式创建的不予理会。
2.使用match 需要先撤销现在的证书。 - cert => 自动创建管理iOS代码签名证书
-
sigh => 是用来创建、更新、下载、修复
Provisioning Profile
的工具 -
resign =>
sigh
的子方法,用于重签名 - pem => 自动生成、更新推送配置文件
- gym => Fastlane家族的自动化编译工具,和其他工具配合的非常默契
- deliver => 自动上传截图,APP的元数据,二进制(ipa)文件到iTunes Connect
- pilot => 管理TestFlight的测试用户,上传二进制文件
-
boarding => 建立一个添加测试用户界面,发给测试者,可自行添加邮件地址,并同步到
iTC
- produce => 如果你的产品还没在iTunes Connect(iTC)或者Apple Developer Center(ADC)建立,produce可以自动帮你完成这些工作
-
spaceship => 为
pilot
,boarding
和deliver
等工具提供和 iTC的交互API。spaceship
本来是个独立的项目,后来被Fastlane
收编进来 -
WatchBuild => 是一个独立的iTC监控工具,开启
WatchBuild
可以监控iTC上的文件状态,弹出MacOS自带的Notification
四、实例
1、马甲包多target方案打包实例
问题:多target如下图所示,每个target对应一个马甲包,每个马甲包有各自的Apple账号、TeamID、BundleID等资源,fastlane默认支持一个target,如何通过fastlane打出不同的包呢?
- gym命令可以指定target,使用
scheme
参数 - 默认情况这些Apple账号、TeamID、BundleID都是填在
Appfile
下,现在为不同的target配置不同的环境变量文件(称之为差分资源),具体如下图
- 差分资源内部填写各自的Apple账号、TeamID、BundleID等
- 注意
1)这些差分资源为隐藏文件
2)Appfile
Fastfile
内部访问这些环境变量要使用ENV['APPLE_ID']
3)打包时,必须通过添加参数--env
来指定待读取的.env
文件,如:
$ fastlane [lane_name] --env targetA
$ fastlane [lane_name] --env targetB
2、马甲包重签名方案打包实例
问题还是:每个马甲包有各自的Apple账号、TeamID、BundleID等资源
步骤:
-
配置差分资源
脚本切换项目 (即切换差分资源)
按正常的fastlane流程打出ipa包 (使用的是公共Apple账号、TeamID、BundleID)
-
使用fastlane的
produce
工具在iTC或ADC创建马甲包的发布环境 (比如在新Apple账号上创建一个新APP、勾选推送功能等)produce => 如果你的产品还没在iTunes Connect(iTC)或者Apple Developer Center(ADC)建立,produce可以自动帮你完成这些工作。
$ fastlane produce --username [AppleAccount@email.com] --skip_itc --app_name [AppName] -a [AppBundleID]
//创建一个新的bundleID
fastlane produce associate_group -a [AppBundleID] [GroupID] --username [AppleAccount@email.com] --skip_itc
//勾选associate group -
对ipa重签名
fastlane sigh resign [ipa_path] --signing_identity [p12] --provisioning_profile [bundleID1]=[PPfile1] --provisioning_profile [bundleID2]=[PPfile2]
五、spaceship
spaceship => 为pilot
,boarding
和deliver
等工具提供跟iTC和ADC的交互API。spaceship
本来是个独立的项目,后来被Fastlane
收编进来。
-
- 在spaceship之前,fastlane工具使用网络抓取来与苹果的网络服务交互。使用spaceship可以只使用简单的HTTP客户端直接访问底层api。
- 现在fastlane中与Apple Service交互的工具(如pilot、deliver)底层都使用的spaceship。
- 使用spaceship sigh的执行时间从1分钟多缩短到不到5秒:
https://github.com/fastlane/fastlane/blob/master/spaceship/assets/SpaceshipRecording.gif?raw=true
spaceship源码也是用Ruby语言编写
-
API
Apple Developer Portal API:用于处理证书描述文件等,与Apple Developer Center(ADC)交互
App Store Connect API:用于处理提交TestFlight发布提审等,与iTunes Connect(iTC)交互
实例1:spaceship最常用的功能是用于处理二步认证问题
- fastlane的配置会要求输入开发者账号密码,通过spaceship与Apple交互,并会产生一份有效期一个月的cookies文件,保存在: ~/.fastlane/spaceship/[email]/cookie
- 官方介绍,使用
fastlane spaceauth -u [AppleAccount@email.com]
生成cookie,再将cookie和Special Key保存到终端的环境配置,可以免短信验证(二步认证)。但实际情况还是有一个月有效期。
实例2:利用Multiple Spaceships
同步设备UDID
- 以下脚本实现功能:假设有AB两个开发者账号,可以将A账号的所有设备UDID添加到B账号
# Launch 2 spaceships
spaceship1 = Spaceship::Launcher.new("felix@krausefx.com", "password")
spaceship2 = Spaceship::Launcher.new("stefan@spaceship.airforce", "password")
# Fetch all registered devices from spaceship1
devices = spaceship1.device.all
# Iterate over the list of available devices
# and register each device from the first account also on the second one
devices.each do |device|
spaceship2.device.create!(name: device.name, udid: device.udid)
end
实例3:新增设备UDID并更新描述文件
Spaceship.device.create!(name: dev_name, udid: dev_udid)
#match管理
fastlane match --type="adhoc" --force_for_new_devices=true
#手动管理
profile = Spaceship::Portal.provisioning_profile.development.all.find { |p| p.name == "***" }
profile.devices = Spaceship::Portal.device.all
profile.update!