利用fastlane进行项目的自动化构建

fastlane

在一个iOS项目进行到了测试和发布阶段,一般都会经历一次又一次的打包-截图-上传及metadata填写及修改的过程。这点做服务器开发的同学就要比我们幸福太多了,因为这一部分的工作他们可以交付给运维同学来完成。那我们就只能自己手动去做这些重复且耗时的操作了么?答案并不是,fastlane就给我们提供了一整套工具来帮助我们实现自动化。

一、Fastlane简介及配置安装

1.简介

fastlane是一套基于ruby开发的自动化构建工具,为项目的发布流程提供一整套解决方案。

2.安装

2.1 确保安装了最新版的Xcode command line tools

对使用Xcode进行开发的iOS开发者是标配,若发现提示没有安装的话尝试使用以下命令安装

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

sudo gem install bundler

3.配置

进入项目的根目录中

3.1 初始化

fastlane init

初始化的过程中会询问您的APPID和密码,请放心它只会把密码信息存在本地的keychain中,并不会传到云端服务器。

初始化的过程中会有四个选项,分别是为四种不同的任务创建配置:

  1. 自动化截图
  2. 自动创建TestFlight测试版发布项目
  3. 自动创建Appstore发布项目
  4. 手动设置自己需要任务的配置

第一次创建可以选择第三项,它会自动检测当前项目的App NameApp bundleID并输出在控制台,若信息有误可以在确认信息的时候选择n然后去配置文件中手动编辑。接着会询问是否需要在ITUADC中创建项目,若选择了y会生成类似下图的目录结构,其中AppfileFastfile这两个核心文件必然会被创建。

fastlane
├── Appfile
├── Deliverfile
├── Fastfile
├── metadata
│   ├── copyright.txt
│   ├── en-US
│   │   ├── description.txt
│   │   ├── keywords.txt
│   │   ├── marketing_url.txt
│   │   ├── name.txt
│   │   ├── privacy_url.txt
│   │   ├── release_notes.txt
│   │   └── support_url.txt
│   ├── primary_category.txt
│   ├── primary_first_sub_category.txt
│   ├── primary_second_sub_category.txt
│   ├── secondary_category.txt
│   ├── secondary_first_sub_category.txt
│   ├── secondary_second_sub_category.txt
│   └── zh-Hans
│       ├── description.txt
│       ├── keywords.txt
│       ├── marketing_url.txt
│       ├── name.txt
│       ├── privacy_url.txt
│       ├── release_notes.txt
│       └── support_url.txt
└── screenshots
    ├── README.txt

若选择了n可以在之后使用fastlane提供的对应功能的命令来生成配置文件。

笔者已经习惯了自己手动去设置相关的配置文件,一般都直接使用第四种方式创建任务。

3.2 使用Gemfile管理fastlane的版本和依赖

cocoapods一样,fastlane也可以使用Gemfile来管理对应的版本和依赖。

在执行init操作的时候会自动生成一个Gemfile内容如下:

source "https://rubygems.org"

gem "fastlane"

可以直接在此处指定fastlane的版本信息。

致辞我们的初始化操作就完成了。

二、Fastlane的理念及组件

在上一步初始化的操作中,生成了两个核心文件Appfile以及Fastfile,其中Appfile存放的是你appbundleID以及appID

Fastfile是我们实际的自动化流程操作实现文件,我们会将相关动作在其中实现。

1.理念

Fastlane有两个重要的概念:

  • action: 每一个动作就是action,对应一条命令。
  • lane: 某个操作流程,比如发布appstore的包的一系列action集合是一个lane,发布adhoc包又是一个lane

当运行fastlane命令行工具的时候会读取fastlane目录下的Fastfile文件,执行相应lane中的action操作

一个简单的流程:

lane :dependence_manager do
# 执行cocoapods属于一个action
cocoapods
# 执行carthage属于一个action
carthage
end

2.组件

fastlane提供了一套工具集,涵盖了发布流程大多数可能会使用到的操作,主要包括几个大类:

  • 测试: scan-自动生成测试工具,并可以生成HTML报告
  • 构建: gym-项目打包工具、cocoapod-执行pod install操作
  • 截图: snapshot-截图工具(需要编写UI测试)、framekit-生成带边框的截图
  • 项目: increment_build_number:增加项目构建次数
  • 签名: match-同步签名信息和项目provision profilecert-同步ADC中的证书信息、register_device-向ADC中添加新的设备
  • 文档: appledoc-根据源码生成Apple风格的代码文档
  • Beta: testflight-将项目发布至testflight
  • 推送: pem-获取推送证书
  • 发布: deliver-将项目发布至appstore
  • 版本控制: git pull-这就不用解释了
  • 通知: Slack-将打包信息告知你的开发组

fastlane提供的工具非常之多,以上只列举了部分常用的组件,想了解更多请访问Fastlane Actions文档

3.第三方插件

fastlane内部提供了足够多的工具,同时也支持第三方的插件接入。可以使用

fastlane search_plugins

命令来查看所有可用第三方插件。

这里介绍两个最常用的插件:

  • firim: 将测试包发布到firim
fastlane add_plugin firim
  • pgyer: 将测试包发布到蒲公英
fastlane add_plugin pgyer

三、Fastlane实践之旅

由于fastlane提供的组件相当之多,项目实践中并不一定都能用上。比如snapshot截图工具,由于公司的宣传页面都是使用的UI切图,笔者也一直没有具体实践的机会。这一部分只能介绍下笔者在项目中实际用过的组件,要是您想要了解的部分并没有被提及,fastlane提供了十分详细的文档可以参考。

1.match-同步证书及provision profile利器

在多人开发的iOS项目中,大部分新手应该都闹出过删证书的笑话,尤其是一些小公司用的个人开发者账号去开发公司项目,成员之间就需要依靠证书的P12文件来进行证书的传递,这种方式效率又低管理又不方便。

fastlanematch命令就提供了一套基于git的证书和provision profile管理方案。通过match生成的证书和provision profile将会同步到一个你指定的git地址,需要的成员通过match去下拉项目需要的证书到本地,match会自己负责和ADC证书及provision profile的同步操作。

1.1 match初始化

通过命令

match init

会让你输入一个git地址,这个地址就是证书的存放位置,同时会在项目中的fastlane中创建一个matchfileFastfile同级,其中的内容就是此git地址

1.2 生成证书和provision profile

# 生成appstore发布证书及provision profile
fastlane match appstore

# 生成adhoc发布证书及provision profile
fastlane match adhoc

# 生成调试证书
fastlane match development

这一步match会检测ADC中是否有需要的证书和provision profile要是有就直接下载到本地,要是没有就直接在ADC中创建

match自动创建的provision profile如图:

image

完全不用自己手动在ADC中创建了是不是非常方面

1.3 在Xcode中配置证书和provision profile

到了这一步其实就和手动创建配置证书一样了,就不再赘述。

1.4 在Fastlanefile中配置证书操作的lane

贴上在项目中的实际配置

desc "Init develope environment"
  lane :config do
    match(type: "appstore", app_identifier: AppID, readonly: true)
    match(type: "adhoc", app_identifier: AppID, readonly: true)
    cocoapods
  end

以上配置完成之后,团队新加入成员或者更换了设备后只要执行

fastlane config 

命令即可同步整套开发发布环境,相当方便。

2.sigh-选择正确的provision profile

matchprovision profile下载到本地,sigh在打包之前确认对应使用的provision profile

用法如下:

sync_code_signing(type: "appstore", 
                  readonly: true, 
            app_identifier: AppID)

3.gym-编译打包工具

action就是对应的XcodeArchive操作

# gym是build_app命令的一个别名
build_app(workspace: "xxxxxx.xcworkspace", 
              scheme: "xxxxxxxx",
              configuration: "release",
              # 输出.ipa文件的路径
              output_directory: "./Package/AppStore",
              export_method: "app-store")

4.deliver-发布工具

fastlane init的时候若是没有允许fastlane自动同步项目在ADC中的metadata。可以使用

fastlane deliver init 

来创建ADC中需要的metadata文件,会在项目中的fastlane目录下创建metadata文件夹以及Deliverfile文件。

若是ADC中已经存在了metadata信息,则可以使用

fastlane deliver download_metadata

来同步ADC上的metadata信息。

注意:若是ADC中存在已经编辑好的metadata没有同步到本地,则deliver上去的metadata会覆盖原有的metadata

实际在Fastfile中的用法很简单就一行代码:

# deliver是upload_to_app_store的一个别名两个方法用法一致
upload_to_app_store

5.完整发布appstore的lane

Fastfile中如下:

desc "upload release version"
  lane :release do
    sync_code_signing(type: "appstore", 
                  readonly: true, 
            app_identifier: AppID)
    build_app(workspace: "xxxxx.xcworkspace", 
              scheme: "xxxxxxx",
              configuration: "release",
              output_directory: "./Package/AppStore",
              export_method: "app-store")
    upload_to_app_store
  end

只要在命令行执行

fastlane release

即可完全自动化发布的流程,极大的节省了开发者的时间。

6.发布到firim或蒲公英

upload_to_app_store替换为firimpgyer插件提供的上传方法即可。

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

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

推荐阅读更多精彩内容