使用 Jenkins 实现持续集成 (iOS)

本文将教会你:

  1. 利用 Jenkins 和 fastlane 实现 iOS 项目的自动构建
  2. 自动打包 iOS 的 ipa 文件并自动上传到蒲公英

注:本文的操作环境在 Mac OS 10.12 中进行。Jenkins 的版本是 2.19.1,fastlane 的版本是 2.28.2

安装 fastlane

fastlane 是一个快速将 iOS 项目打包成 ipa 文件的工具。要安装 fastlane,请参考 fastlane 在 Github 上的的官方文档,这里我们不再赘述。

安装 Jenkins

在 Mac 环境下,我们需要先安装 JDK,然后在 Jenkins 的官网 下载最新的 war 包。下载完成后,打开终端,进入到 war 包所在目录,执行以下命令:

java -jar jenkins.war --httpPort=8080

待Jenkins启动后,在浏览器页面输入以下地址:

http://localhost:8080

这样就打开Jenkins管理页面了。

自动化构建设置

在 Jenkins 中,所有的任务都是以“item”为单位的。接下来我们就新建一个 iOS 的项目来开始自动化构建。点击“新建”,输入 item 的名称,选择“构建一个自由风格的软件项目”,然后点击“OK”。

此处输入图片的描述

然后按下图设置构建信息:

此处输入图片的描述

源码管理:

这里主要是设置源码的仓库,以便让 Jenkins 知道我们的 iOS 项目的代码在哪里。因为我的代码放在自己搭建的 GitLab 仓库中(如果你用 Github 等其他仓库也是类似),所以要先告诉 Jenkins 如何获取代码。首先,我们需要配置 SSH,我们可以在 Jenkins 的证书管理中添加 SSH。在 Jenkins 管理页面,选择“Credentials”,然后选择“Global credentials (unrestricted)”,点击“Add Credentials”,如下图所示,我们填写自己的 SSH 信息,然后点击“Save”,这样就把 SSH 添加到 Jenkins 的全局域中去了。

此处输入图片的描述

接下来,我们再回到刚刚新建的任务中,在源码管理中,选择 Git,按下图填好相关信息。注意:Credentials 不需要选择。

此处输入图片的描述

构建触发器设置

因为此教程不涉及自动测试这块的流程,所以不需要设置触发器。

构建环境设置

这里我们是直接用 fastlane 这个工具,所以这里不需要特别设置。fastlane 会自动读取本地 iOS 项目中设置的签名等信息,所以需要保证本地 iOS 工程已经设置好了正确的签名信息和 Provisioning Profiles 等文件,并在 keychain 中已经加入了正确的证书。否则后续的操作中可能会出现错误。如果这里没有设置好,请用 Xcode 打包工程进行相关设置即可。

脚本设置

这一步主要用来打包 ipa 并上传到蒲公英。我们点击“增加构建步骤”,选择 "Execute Shell"。输入下列脚本:

IPANAME="jinkens-myapp"
fastlane gym --export_method ad-hoc --output_name ${IPANAME}
curl -F "file=@${IPANAME}.ipa" -F "uKey=USER_KEY" -F "_api_key=API_KEY" https://qiniu-storage.pgyer.com/apiv1/app/upload

注意:

  1. 其中,USER_KEY 和 API_KEY 可以在蒲公英的「账户设置」中找到,之后进行相应替换。
  2. export_method 可以根据打包类型进行相应设置。可选的值有:app-storead-hocdevelopmententerprise。对于 Xcode 8.3 以下的版本,则不需要设置 export_method

设置好之后,类似界面如下所示:

此处输入图片的描述

最后点击最下面的 Save 按钮来保存所有设置。这样我们就简单的实现了自动打包,并上传到蒲公英的所有配置了。

接下来,我们可以测试一下。点击项目页面左侧的 Build Now,我们可以看到项目已经开始构建。在 Console Output 中,我们可以看到项目已经成功构建,并自动上传到了蒲公英。

Started by user root
Building in workspace /Users/rexshi/.jenkins/workspace/monitor
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url http://git.xxx.com/root/monitor.git # timeout=10
.......

[15:03:28]: $ xcodebuild -list -project ./monitor.xcodeproj
[15:03:30]: $ xcodebuild clean -showBuildSettings -scheme monitor -project ./monitor.xcodeproj
[15:03:32]: Building monitor/monitor [Release]
[15:03:32]: Check Dependencies
[15:03:32]: Compiling AppDelegate.m
[15:03:33]: Compiling main.m
[15:03:38]: Touching monitor.app
......

[15:03:41]: Successfully exported and compressed dSYM file
[15:03:41]: Successfully exported and signed the ipa file:
[15:03:41]: /Users/rexshi/.jenkins/workspace/monitor/jinkens-myapp.ipa
+ curl -F file=@jinkens-myapp.ipa -F uKey=4a5bc52e6763795e18b69bd82dd23xxx -F _api_key=7f158b3d9063c73cd68f0ee40215xxxx https://qiniu-storage.pgyer.com/apiv1/app/upload
{"code":0,"message":"","data":{"appKey":"602979def164c47b9570f17656a4fxxxx","userKey":"4a5bc52e6763795e18b69bd82dd23xxx","appType":"1","appIsLastest":"1"
......

Finished: SUCCESS

进阶用法

如果你只是想满足基本都持续集成,那么看到这里就可以了。但是,如果你想有一些更丰富的定制化功能,可以继续往下看。

上传到蒲公英时设置更新说明、访问密码

这里,假如我们想让 ipa 文件上传到蒲公英后,将 git 上最后一次提交的注释设置为蒲公英的更新说明,并且设置访问密码为 123456,那么可以将上面最后一步时的 shell 程序改成这样:

IPANAME="jinkens-myapp"
fastlane gym --export_method ad-hoc --output_name ${IPANAME}

MSG=`git log -1 --pretty=%B`
PASSWORD=123456
curl -F "file=@${IPANAME}" -F "uKey=USER_KEY" -F "_api_key=API_KEY" -F "updateDescription=${MSG}" -F "password=${PASSWORD}" https://qiniu-storage.pgyer.com/apiv1/app/upload

ipa 文件上传到蒲公英后通知其他人

如果开发者想让 jenkins 打包并上传 ipa 文件到蒲公英后,自动通知其他人(常用于通知 App 相关的测试者),那么可以利用蒲公英的通知功能。蒲公英本身已经支持了邮件通知、短信通知、微信通知。具体设置方法可以点击这里查看:接收应用更新通知

常见问题

出现 fastlane: command not found 怎么办?

这个情况一般是由于 jenkins 没有设置正确的 $PATH 环境变量导致的。正确设置的方法为:

  1. 在命令行下执行 echo $PATH,记录下输出的结果
  2. 在 jenkins 中系统管理-系统设置中,找到 环境变量(Environment variables)
  3. 在 key 中填写 PATH,在 value 中填写第一步中输出的结果
  4. 保存即可。