iOS持续集成从入门到放弃(1)

578 查看

最近公司要整持续集成打包,于是就入坑了,在搜索的过程中发现并没有一些完备的资料,于是我就决定开始开坑了。。。发车!

工具—fastlane(快发车-_-!)

fastlane 是一套自动化打包的工具集,用 Ruby 写的,用于 iOS 和 Android 的自动化打包和发布等工作,然而 Android 的似乎更喜欢用用 Grandle -_-! fastlane 的官网看这里, fastlane 的 github 看这里,它用起来大约是这样的:

上面这段代码的意思就是定义了一个 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。大约是这样的:

    11111867-baea12f0d273c559

    fastlane actions
  • fastlane action [action_name]: 显示某一个 action 的详细配置,比如想看到 match 的可配置选项可以执行,fastlane action match,显示结果大约是如下这样:

    212016-06-01-1. onetaway@Onetaways-MacBook-Pro. --BaoZouFace -zsh- iTerm, Today at 18.09.09

    fastlane action match
  • fastlane lanes: 列出所有的可用的 lane 及其描述。这里显示的就是你的 Fastfile 里面定义的所有 lane,比如笔者显示出来的结果大约是这样的:

    132016-06-01-1. onetaway@Onetaways-MacBook-Pro. --BaoZouFace -zsh- iTerm, Today at 09.29.47

    fastlane lanes
  • 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 里面写。

1444442016-06-01-fastlane-match at master · fastlane-fastlane Google Chrome, Today at 17.30.44

Matchfile_Demo

上面是官方仓库的demo,但是此处有坑 此处有坑 此处有坑git_url 字段的 git 地址要改成 ssh 协议。如果你在 jenkins 打包的 console 发现进度始终卡在 clone 这个仓库的话,就要看看你的 git_url 字段是不是没改成 ssh 协议了。但是一个公司也许有多个项目,总不能来一个项目就建一个私有仓库吧,没错,fastlane 的开发者们早就想到的最佳实践,那就是 分支。使用一个分支去管理一个项目的证书和配置文件,不同的 team 也可以使用不同的分支,这样只需要一个仓库,就完美的解决了问题。Matchfile 的可选配置可以用 fastlane action match 查看。

下面来说一下 match 的基本用法,它的使用流程大约是这样的:

  • match init: 初始化 match,并创建 Matchfile
  • match 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大约是这样的:

142016-06-01-fastlane-gym at master · fastlane-fastlane Google Chrome, Today at 10.44.18

Gymfile_Demo1

152016-06-01-fastlane-gym at master · fastlane-fastlane Google Chrome, Today at 10.44.43

Gymfile_Demo2

gym常用就是这么多啦,更多套路欢迎移步gym主站

合体

前面分别介绍了 fastlanematchgym命令,他们每一项的功能我们都大致了解了,是时候让他们合体了。。。现在我们脑补一下我们编译打包的流程,以 adhoc 方式为例。

  1. 执行一下 cocoapods
  2. 获取证书和配置文件
  3. 开始打包
  4. 将 ipa 发布到内测平台,比如:Fir.im 蒲公英等

于是乎我们似乎就能写出自己的第一个 lane 了,(骚年,你还不去学 Ruby 么?)

上面我们就完成了一个 lane。贯通了整套打包、上传 ipa 的流程。其实 match 和 gym 同样可以指定参数,但是如果你在各自对应的 XXXfile 里面写过了配置,这里就可以省略了。上面最后一行的 fir publish,是 fir 的命令,可以参见这个repo

写完了我们自定义的 lane 之后,就可以使用啦,用起来也是 so easy.
fastlane ios appname_adhoc_to_fir,中间的 ios 指定了平台,在 Fastfile 中就是最外层的 platform :ios。敲完上面的命令,你只需要泡一壶好茶静静地等着控制台显示 Success(报错)

血的教训

  1. match error: 如果你在 jenkins 打包的 console 发现进度始终卡在 clone 证书仓库的话,请将你的 Matchfile 的 git_url 改成 ssh 协议,别问我为什么。。。
  2. 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/