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 [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 => 为pilotboardingdeliver等工具提供跟iTC和ADC的交互API。spaceship本来是个独立的项目,后来被Fastlane收编进来。

实例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!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342