Fastlane的使用及进阶

image
一、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文件。


执行init后生成

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 => 为pilotboardingdeliver等工具提供和 iTC的交互API。spaceship本来是个独立的项目,后来被Fastlane收编进来
  • WatchBuild => 是一个独立的iTC监控工具,开启WatchBuild可以监控iTC上的文件状态,弹出MacOS自带的Notification
四、实例

1、马甲包多target方案打包实例
问题:多target如下图所示,每个target对应一个马甲包,每个马甲包有各自的Apple账号、TeamID、BundleID等资源,fastlane默认支持一个target,如何通过fastlane打出不同的包呢?

image.png
  • gym命令可以指定target,使用scheme参数
  • 默认情况这些Apple账号、TeamID、BundleID都是填在Appfile下,现在为不同的target配置不同的环境变量文件(称之为差分资源),具体如下图
  • 差分资源内部填写各自的Apple账号、TeamID、BundleID等
image.png
  • 注意

    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 [[email protected]] --skip_itc --app_name [AppName] -a [AppBundleID] //创建一个新的bundleID
    fastlane produce associate_group -a [AppBundleID] [GroupID] --username [[email protected]] --skip_itc //勾选associate group

  • 对ipa重签名

    fastlane sigh resign [ipa_path] --signing_identity [p12] --provisioning_profile [bundleID1]=[PPfile1] --provisioning_profile [bundleID2]=[PPfile2]

五、spaceship

spaceship => 为pilotboardingdeliver等工具提供跟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 [[email protected]]生成cookie,再将cookie和Special Key保存到终端的环境配置,可以免短信验证(二步认证)。但实际情况还是有一个月有效期。
实例2:利用Multiple Spaceships同步设备UDID
  • 以下脚本实现功能:假设有AB两个开发者账号,可以将A账号的所有设备UDID添加到B账号
# Launch 2 spaceships
spaceship1 = Spaceship::Launcher.new("[email protected]", "password")
spaceship2 = Spaceship::Launcher.new("[email protected]", "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!

你可能感兴趣的:(Fastlane的使用及进阶)