最近公司要整持续集成打包,于是就入坑了,在搜索的过程中发现并没有一些完备的资料,于是我就决定开始开坑了。。。发车!
工具—fastlane(快发车-_-!)
fastlane
是一套自动化打包的工具集,用 Ruby 写的,用于 iOS 和 Android 的自动化打包和发布等工作,然而 Android 的似乎更喜欢用用 Grandle -_-! fastlane 的官网看这里, fastlane 的 github 看这里,它用起来大约是这样的:
1 2 3 4 5 6 7 8 |
lane :beta do increment_build_number cocoapods match testflight sh "./customScript.sh" slack end |
上面这段代码的意思就是定义了一个 lane
叫做 beta,然后描述了这个 lane
要做的事情,上面的例子就是:增加编译号,执行 cocoapods,执行 match ,执行 testflight,执行在当前目录下的 customScript.sh 的脚本,通知slack。这样,这个 lane 就执行完毕了。fastlane 的强大之处就在于其提供的工具比较全,基本可以覆盖打包发布的所有流程,下面我们慢慢来看。
fastlane
使现有的工程支持 fastlane 是非常简单的,只要执行一句 fastlane init
就可以了,执行完这步之后在你的工程目录下会创建一个名叫 fastlane 的文件夹,里面会有一个叫 Fastfile 的文件,这个是 fastlane 的主文件,也就是在 jenkins 中要调用的脚本。Fastfile 一创建里面就会有一些模板的 lane 可以自己点进去看一下,一看就懂。下面来说一下 fastlane 的一些常用命令。
fastlane actions
: 列出所有的 fastlane 的 actions,可以看到 fastlane 支持的所有 action。大约是这样的:fastlane action [action_name]
: 显示某一个 action 的详细配置,比如想看到match
的可配置选项可以执行,fastlane action match
,显示结果大约是如下这样:
fastlane lanes
: 列出所有的可用的 lane 及其描述。这里显示的就是你的 Fastfile 里面定义的所有 lane,比如笔者显示出来的结果大约是这样的:fastlane list
: 显示所有的 lane,但是不显示描述。fastlane new_action
: 创建一个 action。
OK,fastlane 命令介绍的基本差不多了,笔者认为,最常用的还是前两个,特别是第二个 fastlane action [action_name]
,当你不知道某个工具在 XXXfile 中有哪些可配置选项的时候,请抬起头,别让皇冠掉 般的敲入这个命令。下面我们来看一下一个更常用的工具 match
match
我知道你们都 revoke 过证书。。。虽然这只是一个梗,但是 iOS 开发最麻烦的莫过于证书啊,配置文件,开发人员随意在后台删除,或者新建配置文件,而其他的同事却无法被通知到,会导致大量无谓的工作量。[match] (https://github.com/fastlane/fastlane/tree/master/match) comes to rescue。match 提出了一套全新的管理证书和配置文件的方案,用来进行签名,思想是使用私有仓库来管理证书和配置文件,每一个机器通过拉取该仓库来安装证书和配置文件,再也不用进开发者后台自己弄了。。一颗赛艇。具体的步骤可以点击上面的网址,里面有很详细的介绍。
match 的使用同样很简单,一行 match init
就搞定了,和 fastlane 一样的套路,在 fastlane 文件夹下面会生成一个 Matchfile
。后面我们很多的配置都可以在这个 Matchfile
里面写。
上面是官方仓库的demo,但是此处有坑 此处有坑 此处有坑,git_url
字段的 git 地址要改成 ssh 协议。如果你在 jenkins 打包的 console 发现进度始终卡在 clone 这个仓库的话,就要看看你的 git_url
字段是不是没改成 ssh 协议了。但是一个公司也许有多个项目,总不能来一个项目就建一个私有仓库吧,没错,fastlane 的开发者们早就想到的最佳实践,那就是 分支。使用一个分支去管理一个项目的证书和配置文件,不同的 team 也可以使用不同的分支,这样只需要一个仓库,就完美的解决了问题。Matchfile
的可选配置可以用 fastlane action match
查看。
下面来说一下 match
的基本用法,它的使用流程大约是这样的:
match init
: 初始化match
,并创建 Matchfilematch development
: 创建开发证书和配置文件,并安装在本机上。match adhoc
: 创建 adhoc 发布证书和配置文件,并安装在本挤上。match appstore
: 创建 appstore 发布证书和配置文件,并安装在本机上。
配置文件安装的目录是~/Library/MobileDevice/Provisioning Profiles
,证书和私钥则是安装在 Keychain 上的。
Passphrase
当在一台新的机器上,第一次运行 match
的时候,会要求你为 Git 仓库填写一个 passphrase,这是出于安全的考虑,每一个文件都会使用 openssl
进行加密,请记住你输入的 passphrase,当在另一台机器上运行 match
的时候,你需要输入相同的 passphrase 才能继续下去。如果需要在环境变量中使用的话,passphrase 的环境变量叫做 MATCH_PASSWORD
。
关于 match
就先介绍这么多吧,更多详细的东东去match主站发掘吧。下面我们说一说更为重要的打包命令 gym
。
Gym
打包了打包了。。。QA苦苦相逼何时了,哪有那么多妹可撩啊,姐姐和包才治百病,这句话充分体现了包在移动开发领域的重要性。还记得曾经的你是如何打包的么?
拔掉真机,点开工程,切换证书和配置文件,怒点 archive,接下来就是一段风扇狂转,电脑卡死,CPU跑满的惊心动魄,终于风扇安静了,可以 export 了,然后 F**k,谁TM把证书给干了。。。。(此处应有烛光)。
不要慌。。。gym
comes to rescue。gym 就是 fastlane 提供的打包工具,包括签名步骤,It’s super easy,一行搞定上面所有操作,保证无痛…!-_- 让我们来看一下如何使用:
gym init
: 这是 fastlane 的老套路了,我知道你们都是老司机
gym
恩,用完了。。。卧槽,就没了? 恩,就没了
gym init
: 初始化 gym ,并创建 Gymfile。
gym
: 开始执行打包命令,当然你可以配置更多的 gym 选项,比如输出路径啊,指定scheme啊,是否 clean 啊等等,不知道还有哪些选项可配置? fastlane action gym
给你惊喜。
笔者的建议是能够在 Gymfile 里配置好的选项就在 Gymfile 里配置,其余的再使用代码。
Gymfile大约是这样的:
gym
常用就是这么多啦,更多套路欢迎移步gym主站
合体
前面分别介绍了 fastlane
,match
,gym
命令,他们每一项的功能我们都大致了解了,是时候让他们合体了。。。现在我们脑补一下我们编译打包的流程,以 adhoc 方式为例。
- 执行一下
cocoapods
- 获取证书和配置文件
- 开始打包
- 将 ipa 发布到内测平台,比如:Fir.im 蒲公英等
于是乎我们似乎就能写出自己的第一个 lane
了,(骚年,你还不去学 Ruby 么?)
1 2 3 4 5 6 7 |
desc "描述这个 lane 是干啥用的,比如 upload ipa to fir for test" lane: appname_adhoc_to_fir do cocoapods match gym system "fir publish appname.ipa" end |
上面我们就完成了一个 lane。贯通了整套打包、上传 ipa 的流程。其实 match 和 gym 同样可以指定参数,但是如果你在各自对应的 XXXfile 里面写过了配置,这里就可以省略了。上面最后一行的 fir publish
,是 fir 的命令,可以参见这个repo。
写完了我们自定义的 lane 之后,就可以使用啦,用起来也是 so easy.
fastlane ios appname_adhoc_to_fir
,中间的 ios 指定了平台,在 Fastfile 中就是最外层的 platform :ios
。敲完上面的命令,你只需要泡一壶好茶静静地等着控制台显示 Success(报错)
血的教训
match error
: 如果你在 jenkins 打包的 console 发现进度始终卡在 clone 证书仓库的话,请将你的 Matchfile 的git_url
改成 ssh 协议,别问我为什么。。。gym error
: 在 jenkins 打包的最后一步如果报错code sign error
,请试试下面两个办法:(1) 将 login.keychain 中的证书拖到 System.keychain 下面
(2) 在gym
之前执行一下system "security unlock-keychain -p yourMacPassword
别问我为什么。。。
总结
在下一篇中会介绍如何使用 fastlane 打企业证书签名的包。
参考
https://everettjf.github.io/2015/09/08/ios-ci-with-fastlane
http://www.cocoachina.com/ios/20150728/12733.html
https://github.com/fastlane/fastlane
http://www.devlizy.com/ios-da-bao-quan-cheng-pei-zhi/