Jenkins 简介

Jenkins 是一款流行的持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。
Jenkins 是一个开源项目,用 Java 语言编写,它提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。

本文就来介绍一下 Jenkins 的安装过程,然后利用 Jenkins 实现自动化打包 iOS 项目。


Jenkins 安装

本文描述的是在 mac 上进安装情况,安装前要先安装 java sdk,安装方法自行搜索。
安装 Jenkins 通过 homebrew 安装比较方便,也可以下载安装包手动安装,Jenkins 官网下载 ,为了方便我们使用 homebrew 来进行安全,没有安装 homebrew 的自行搜索安装方法。

1、安装命令

Jenkins 安装命令:
安装最新的LTS版本: brew install jenkins-lts
安装特定的LTS版本: brew install jenkins-lts@YOUR_VERSION
启动 Jenkins 服务: brew services start jenkins-lts
重新启动 Jenkins 服务: brew services restart jenkins-lts
更新 Jenkins 版本: brew upgrade jenkins-lts

终端输入安装命令:

1
brew install jenkins-lts  

jenkins-lts 这是第三方支持的包,更新频率可能不如 Jenkins 项目直接支持的包更新频繁。

等待片刻,安装完成后,输入命令,启动服务:

1
brew services start jenkins-lts 

然后在浏览器中输入地址 http://localhost:8080 ,即可看到 Jenkins 页面。

2、解锁 Jenkins

看到解锁界面,按照提示在文件中找到密码,输入密码:

3、安装推荐插件

点击安装推荐的插件,若有些插件提示安装失败,点击继续,再次安装,最好把建议的插件都安装好。

4、创建用户

输入信息,创建用户:

然后就可以进入 Jenkins 主界面了,安装完成。

5、插件管理

在 Manage Jenkins 选项的 Manage Plugins 中可以管理你要安装的插件。
可更新的表示你所安装的插件中可以更新的插件,可选插件你可以在其中找到你要安装的插件。
高级选项中,你可以自行上传安装插件。

在可选插件选项中,搜索 Keychains and Provisioning Profiles Management 插件进行安装,这个插件后面打包会用到,用来管理钥匙串、描述文件等。
还有 Xcode 插件,用来打包的插件。
等待安装完成,重启即可。


Jenkins 创建任务

安装好 Jenkins ,安装好插件,然后我们就可以新建任务,来实现自动化打包了,按照下面的步骤一步步来。

1、新建任务

点击新建任务,输入任务名称,选择构建一个自由风格的软件项目:

点击确定后,进入任务的配置页面。

2、任务配置

进入任务配置页面,可看到菜单栏有几大项,General 、源码管理、构建触发器、构建环境、构建、构建后操作。

  • General
    可以设置保留构建次数、发布包天数等,这个按照需要设置:

  • 源代码管理
    在这里设置 git 源代码仓库链接、添加 git 账号,账号没有的话可添加一个,若 git 验证失败的话会报错:

  • 构建触发器
    在这里设置触发构建,如设置提交代码后触发构建,也可以定时构建,这里按照需要设置,本例子跳过,没有设置。

  • 构建环境
    在这里设置 Keychains and Code Signing Identities 时遇到个问题:
    在前面安装 Keychains and Provisioning Profiles Management 插件后,在系统管理里面找到 Keychains and Provisioning Profiles Management ,点进去要上传 Keychain 这里一直上传不上去,搜了一下说是,Jenkins 新版本上传不上去点击没反应,旧版本就可以上传上,可能是 Jenkins 问题,不上传 Keychain 的话,在这里 Keychains and Code Signing Identities 就选择不了 Keychain 这问题解决不了,除非安装旧版本的 Jenkins 。在这就不设置 Keychain 了,下面构建时候,使用 Xcode 插件构建,里面有设置 Code signing & OS X keychain options 设置好也能正常打包,这里就不设置了。

  • 构建
    在这里来设置你要构建的步骤,我们以 iOS 打包为例子来设置一下构建步骤。
    首先点击增加构建步骤, 如果你的项目使用了 pod,在 git 拉取到源代码后,先执行一下 pod install,这里就需要先添加一步,执行 shell,如下:

然后在添加构建步骤,选择 Xcode ,在前安装了 Xcode 插件,这里就会显示 Xcode 选项。添加 Xcode:


前面的一些可不填,按照你的需要填写,必填的是在 settings 展开,需要填写项目的 Schema

Xcode scheme 定义了编译集合中的若干target,编译时的一些设置以及要执行的测试集合。
你可以自定义若干个scheme,但是同一时刻只能运行一个.
target包含了所有的源文件,它来决定编译哪些文件。一个project可以包含一个或多个target。scheme定义了一个target集合,它来决定运行和构建哪个target。


这不知怎填的话,就用 Xcode 打开项目,上面的那个就是 Xcode Schema File ,填进去。也可以通过终端命令 xcodebuild -list 查看。
然后勾选 Generate Archive, Pack application, build and sign .ipa 。设置导出的包名称,导出包的文件路径等。



然后就是设置打包证书,展开 Code signing settings.. ,勾选手动设置 Manual signing,填入项目的 Bundle ID 和 描述文件的 UUID,这个在描述文件中能看到复制过来填入就行了。


然后勾选 Unlock Keychain,这里要设置你的钥匙串文件路径,保证在构建的时候能找到描述文件对应的正确的证书。这里是在你的 mac 上去找你的钥匙串文件,密码就是你的电脑密码。


然后设置 Advanced Xcode build options ,在这里设置你的 Xcode Workspace File,项目中没有 workspace 文件的话就不用填,以及构建完成后输出的文件路径。

需要填写的就这些,其他选项,如有需要自行填写,如不明白选项的作用点击问号有解释。

  • 构建后的操作
    来到这一步,就说明,我们已经构建完成了,已经打包完成了,导出的 ipa 包已经在你设置的文件夹下面了。在这里我们可以设置下面的步骤,拿到包后可以上传网站提供下载了,例如上传到 fir.im、蒲公英等,对应的服务网站都有上传的教程,自己去查看,这里就不说明了。

3、开始构建

通过上面,填写完成构建任务配置之后,我们就可以开始,构建打包任务了。

进入任务页面,菜单栏中点击立即构建,然后任务就开始运行了,下面会显示当前构建的进度条,每次构建都有记录,点击进去可以查看构建的详情,控制台输出构建的过程,方便我们进行调试。

Jenkins 中构建成功或失败的状态用颜色来表示:

还有一个状态是构建晴雨表,表示项目构建的质量,图标如下:


iOS 打包命令

上面的构建,我们是使用 Jenkins 的 Xcode 插件来进行打包,除了这种方法,我们还可以编写打包命名,使用打包脚本来进行打包,下面就来介绍两种打包方法,xcodebuild、fastlane。

xcodebuild

xcodebuild 是苹果提供的打包的命令。详细的使用文档,可在终端输入命令 man xcodebuild 查看。
使用方法可在终端输入命令 xcodebuild -help 查看。[ ]表示这个参数是可选的,< > 表示参数是必须的。

1
2
3
4
5
Usage: xcodebuild [-project <projectname>] [[-target <targetname>]...|-alltargets] [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings [-json]] [<buildsetting>=<value>]... [<buildaction>]...

xcodebuild [-project <projectname>] -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings [-json]] [-showdestinations] [<buildsetting>=<value>]... [<buildaction>]...

xcodebuild -workspace <workspacename> -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [-showdestinations] [<buildsetting>=<value>]... [<buildaction>]...

主要的操作就是先将项目打包成 xcarchive 文件,然后将 xcarchive 文件打包成 ipa,命令如下:

1
2
3
4
5
#打包成 xcarchive 文件
xcodebuild archive -project Hello.xcodeproj -scheme Hello -configuration Release -archivePath "/Users/用户名/Desktop/Hello/Hello"

#将xcarchive文件打包成ipa
xcodebuild -exportArchive -archivePath "/Users/用户名/Desktop/Hello/Hello.xcarchive" -exportPath "/Users/用户名/Desktop/Hello/Export" -exportOptionsPlist "/Users/用户名/Desktop/Hello/hello.plist"

archivePath 就是打包完成后 xcarchive 文件导出的文件路径。
exportPath 就是 ipa 包导出的文件路径。
exportOptionsPlist 这个 plist 文件需要自己创建,在里面设置一些打包的操作,设置证书名称、描述文件等,plist 字段在终端输入命令 xcodebuild -help 查看 Available keys for -exportOptionsPlist 。

了解了打包命令,然后就可以在 Jenkins 的配置中,构建里面,就不用 Xcode 插件来进行打包了,选择执行 shell,将上面的打包命令放里面就可以了,注意文件路径别错了。

这里可能会遇到错误,意思是找不到 provisioning profile,描述文件找不到。

1
2
3
Error Domain=IDEProvisioningErrorDomain Code=9 ""Hello.app" requires a provisioning profile." UserInfo={IDEDistributionIssueSeverity=3, NSLocalizedDescription="Hello.app" requires a provisioning profile., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}

** EXPORT FAILED **

解决方法是,添加描述文件路径,还记得上面我们安装了一个插件 Keychains and Provisioning Profiles Management,点击进去把描述文件路径填入,报存,重新构建就成功了。

fastlane

fastlane 是用来给 iOS 或 Android 项目进行自动化测试部署、发布的工具。
下面来看一下 fastlane 的打包命令,详细的介绍请查看 fastlane 官网

fastlane 是基于 ruby 的,所以需要安装下 ruby 环境,这个自行安装。
然后检查 Xcode 命令行工具是否安装。在终端窗口中输入命令:

1
xcode-select --install

如果未安装,终端会开始安装。

然后开始安装 fastlane :

1
sudo gem install fastlane

安装完成后,进入你的项目目录下,执行:fastlane init
为项目配置 fastlane,执行完成后会生成 fastlane 文件夹,里面有两个文件 Appfile 永安里设置 APP 的一些信息,还有 Fastfile 文件就是在这写入我们的打包的 ruby 脚本,打开 Fastfile 写入我们打包脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
default_platform(:ios)

platform :ios do
desc "打包测试"
lane :ad_Hoc do
gym (
clean: true,
export_method: "ad-hoc",
scheme: "Hello",
configuration: "Release",
output_directory: "./app"
)
end
end

然后在项目目录下,输入执行命令 fastlane ad_hoc ,等待打包完成 ipa 包就会在你指定的文件夹下。

然后在 Jenkins 中使用 fastlane 打包,在项目的配置中,构建里面选择执行 shell,输入fastlane 命令 fastlane ad_hoc 就可以了。


Jenkins 配置节点

有时 Jenkins 可能是安装部署在 Linux 系统上,iOS 打包无法在 Linux 上进行,因为打包需要调用Xcode,Xcode 只能在 macOS 下安装。
这种情况我们需要在 Jenkins 上添加 macOS 节点,远程使用 mac 来给 iOS 项目打包。

首先需要一台 mac ,在 mac 上先安装好 Jenkins 。
然后打开系统偏好设置 -> 共享 -> 勾选 -> 远程登录。

在系统管理里面,进入节点管理,新建节点,在配置节点中,填写连接 mac 的设置,将远程登录 mac 的地址填入,认证的用户名密码,就是你的 mac 的用户名密码,保存就可以了。设置成功后,在节点列表可以看到你添加的节点。

添加完成后,进入你的任务配置中,General 下面勾选你运行的节点,然后就可以了。构建的时候就是使用你的 mac 节点构建你的任务。


总结

总的来说使用 Jenkins 进行 iOS 自动化打包,就是从代码仓库拉取到项目到本地,然后使用本地环境来进行构建打包,Jenkins 给你提供了一个平台,你在上面配置好你想要的工作流程,剩下的执行工作交给 Jenkins 就可以了。要是利用好了 Jenkins 会给我们的工作效率带来极大的提升。
本文只是简单介绍了使用 Jenkins 进行 iOS 自动化打包,Jenkins 还有很多的功能,今后我们再进一步的研究一下。


References

https://www.jianshu.com/p/41ecb06ae95f
https://juejin.cn/post/6920469161021816846
http://liumh.com/2015/11/25/ios-auto-archive-ipa/index.html
https://docs.fastlane.tools/getting-started/ios/setup/