利用fastlane进行项目的自动化构建
在一个iOS项目进行到了测试和发布阶段,一般都会经历一次又一次的打包-截图-上传及metadata填写及修改的过程。这点做服务器开发的同学就要比我们幸福太多了,因为这一部分的工作他们可以交付给运维同学来完成。那我们就只能自己手动去做这些重复且耗时的操作了么?答案并不是,fastlane就给我们提供了一整套工具来帮助我们实现自动化。
一、Fastlane简介及配置安装
1.简介
fastlane
是一套基于ruby
开发的自动化构建工具,为项目的发布流程提供一整套解决方案。
2.安装
2.1 确保安装了最新版的Xcode command line tools
对使用Xcode
进行开发的iOS
开发者是标配,若发现提示没有安装的话尝试使用以下命令安装
1 | xcode-select --install |
2.2 选择安装方式
安装方式一共有三种:
homebrew | installer script | RubyGem |
---|---|---|
brew cask install fastlane | 下载安装包,运行安装脚本 | sudo gem install fastlane -NV |
笔者项目中都使用到了cocoapods
本地有Ruby
环境,因此选择了第三种安装方案
2.3 安装bundler
若你的ruby
环境中没有安装bundler
,执行以下命令安装bundler
1 | sudo gem install bundler |
3.配置
进入项目的根目录中
3.1 初始化
1 | fastlane init |
初始化的过程中会询问您的APPID
和密码,请放心它只会把密码信息存在本地的keychain
中,并不会传到云端服务器。
初始化的过程中会有四个选项,分别是为四种不同的任务创建配置:
- 自动化截图
- 自动创建
TestFlight
测试版发布项目 - 自动创建
Appstore
发布项目 - 手动设置自己需要任务的配置
第一次创建可以选择第三项,它会自动检测当前项目的App Name
和App bundleID
并输出在控制台,若信息有误可以在确认信息的时候选择n
然后去配置文件中手动编辑。接着会询问是否需要在ITU
和ADC
中创建项目,若选择了y
会生成类似下图的目录结构,其中Appfile
和Fastfile
这两个核心文件必然会被创建。
1 | fastlane |
若选择了n
可以在之后使用fastlane
提供的对应功能的命令来生成配置文件。
笔者已经习惯了自己手动去设置相关的配置文件,一般都直接使用第四种方式创建任务。
3.2 使用Gemfile管理fastlane的版本和依赖
同cocoapods
一样,fastlane
也可以使用Gemfile
来管理对应的版本和依赖。
在执行init
操作的时候会自动生成一个Gemfile
内容如下:
1 | source "https://rubygems.org" |
可以直接在此处指定fastlane
的版本信息。
致辞我们的初始化操作就完成了。
二、Fastlane的理念及组件
在上一步初始化的操作中,生成了两个核心文件Appfile
以及Fastfile
,其中Appfile
存放的是你app
的bundleID
以及appID
。
Fastfile
是我们实际的自动化流程操作实现文件,我们会将相关动作在其中实现。
1.理念
在Fastlane
有两个重要的概念:
- action: 每一个动作就是action,对应一条命令。
- lane: 某个操作流程,比如发布
appstore
的包的一系列action
集合是一个lane,发布adhoc
包又是一个lane
当运行fastlane
命令行工具的时候会读取fastlane
目录下的Fastfile
文件,执行相应lane
中的action
操作
一个简单的流程:
1 | lane :dependence_manager do |
2.组件
fastlane
提供了一套工具集,涵盖了发布流程大多数可能会使用到的操作,主要包括几个大类:
- 测试:
scan
-自动生成测试工具,并可以生成HTML
报告 - 构建:
gym
-项目打包工具、cocoapod
-执行pod install
操作 - 截图:
snapshot
-截图工具(需要编写UI测试)、framekit
-生成带边框的截图 - 项目:
increment_build_number
:增加项目构建次数 - 签名:
match
-同步签名信息和项目provision profile
、cert
-同步ADC
中的证书信息、register_device
-向ADC
中添加新的设备 - 文档:
appledoc
-根据源码生成Apple
风格的代码文档 - Beta:
testflight
-将项目发布至testflight
- 推送:
pem
-获取推送证书 - 发布:
deliver
-将项目发布至appstore
等 - 版本控制:
git pull
-这就不用解释了 - 通知:
Slack
-将打包信息告知你的开发组
fastlane
提供的工具非常之多,以上只列举了部分常用的组件,想了解更多请访问Fastlane Actions文档
3.第三方插件
fastlane
内部提供了足够多的工具,同时也支持第三方的插件接入。可以使用
1 | fastlane search_plugins |
命令来查看所有可用第三方插件。
这里介绍两个最常用的插件:
- firim: 将测试包发布到
firim
1 | fastlane add_plugin firim |
- pgyer: 将测试包发布到蒲公英
1 | fastlane add_plugin pgyer |
三、Fastlane实践之旅
由于fastlane
提供的组件相当之多,项目实践中并不一定都能用上。比如snapshot
截图工具,由于公司的宣传页面都是使用的UI
切图,笔者也一直没有具体实践的机会。这一部分只能介绍下笔者在项目中实际用过的组件,要是您想要了解的部分并没有被提及,fastlane
提供了十分详细的文档可以参考。
1.match-同步证书及provision profile利器
在多人开发的iOS
项目中,大部分新手应该都闹出过删证书的笑话,尤其是一些小公司用的个人开发者账号去开发公司项目,成员之间就需要依靠证书的P12
文件来进行证书的传递,这种方式效率又低管理又不方便。
fastlane
的match
命令就提供了一套基于git
的证书和provision profile
管理方案。通过match
生成的证书和provision profile
将会同步到一个你指定的git
地址,需要的成员通过match
去下拉项目需要的证书到本地,match
会自己负责和ADC
证书及provision profile
的同步操作。
1.1 match初始化
通过命令
1 | match init |
会让你输入一个git地址,这个地址就是证书的存放位置,同时会在项目中的fastlane
中创建一个matchfile
与Fastfile
同级,其中的内容就是此git
地址
1.2 生成证书和provision profile
1 | # 生成appstore发布证书及provision profile |
这一步match
会检测ADC
中是否有需要的证书和provision profile
要是有就直接下载到本地,要是没有就直接在ADC
中创建
match
自动创建的provision profile
如图:
完全不用自己手动在ADC
中创建了是不是非常方面
1.3 在Xcode中配置证书和provision profile
到了这一步其实就和手动创建配置证书一样了,就不再赘述。
1.4 在Fastlanefile中配置证书操作的lane
贴上在项目中的实际配置
1 | desc "Init develope environment" |
以上配置完成之后,团队新加入成员或者更换了设备后只要执行
1 | fastlane config |
命令即可同步整套开发发布环境,相当方便。
2.sigh-选择正确的provision profile
match
将provision profile
下载到本地,sigh
在打包之前确认对应使用的provision profile
用法如下:
1 | sync_code_signing(type: "appstore", |
3.gym-编译打包工具
此action
就是对应的Xcode
的Archive
操作
1 | # gym是build_app命令的一个别名 |
4.deliver-发布工具
在fastlane init
的时候若是没有允许fastlane
自动同步项目在ADC
中的metadata
。可以使用
1 | fastlane deliver init |
来创建ADC
中需要的metadata
文件,会在项目中的fastlane
目录下创建metadata
文件夹以及Deliverfile
文件。
若是ADC
中已经存在了metadata
信息,则可以使用
1 | fastlane deliver download_metadata |
来同步ADC
上的metadata信息。
注意:若是ADC
中存在已经编辑好的metadata
没有同步到本地,则deliver
上去的metadata
会覆盖原有的metadata
实际在Fastfile
中的用法很简单就一行代码:
1 | # deliver是upload_to_app_store的一个别名两个方法用法一致 |
5.完整发布appstore的lane
Fastfile
中如下:
1 | desc "upload release version" |
只要在命令行执行
1 | fastlane release |
即可完全自动化发布的流程,极大的节省了开发者的时间。
6.发布到firim或蒲公英
将upload_to_app_store
替换为firim
或pgyer
插件提供的上传方法即可。
firim(firim_api_token:"xxxxxxxxxxxxxxxxxx")
四、总结
fastlane
是一套及其强大的自动化构建工具,善用action
可以定制很多个性化操作,笔者只是抛砖引玉提供了一套满足最基本发布需求的方案。如果您有更好的方案,欢迎邮件交流。
由于笔者所在公司并没有专门的iOS
打包机,很遗憾没有实践fastlane
+jekins
的机会。但身为软件开发工程师寻找更”轻松”的工作方式应该是我们一直以来的追求,笔者在今后的工作中也会持续在这个方向发力。
五、参考文献
小团队的自动化发布: https://whlsxl.github.io/index.html
How to Set Up Fastlane: https://blog.metova.com/how-to-set-up-fastlane
fastlane官方文档: https://docs.fastlane.tools/
六、缩写释义
ADC: Apple Developer Center
ITC: iTunes Connect