Jenkins iOS持续集成实现

前言

Jenkins是一个开源的持续集成工具,支持各种软件的持续集成。但是iOS项目的编译打包依赖于Xcode,不幸的是Linux服务器无法安装Xcode。所以只能通过Jenkins节点,将一台Mac作为slave来实现Linux上的iOS项目构建。

环境

master: Mac OS 10.14.4
slave: Mac OS 10.14.2
Jenkins: 2.17.4

目录

  1. Jenkins安装
  2. Jenkins环境配置
  3. 节点创建
  4. 创建配置任务
  5. 上传到蒲公英
  6. 总结

一、Jenkins安装

打开Jenkins官网下载页,选择Mac os X下载pkg安装包。安装完成之后会自动在浏览器打开配置页面。

首先需要输入管理员初始密码,打开提示的文件 /Users/Shared/Jenkins/Home/secrets/initialAdminPassword
将密码复制到输入框。打开文件可能会报错没有权限,可以右键“显示简介”修改权限。

管理员初始密码

接下来选择安装推荐的插件


选择插件
插件安装中

新建管理员账户

输入管理员账号信息然后点击“save and finish",Jenkins就安装好了。


二、Jenkins环境配置

1. 安装插件

进入首页后进入 系统管理 > 插件管理

  • Xcode Integration用来编译Xcode项目及打包
  • Keychains and Provisioning Profiles Management用于添加管理描述文件和证书及签名。

因为前面安装Jenkins时选择安装了推荐的插件,所以像Git , Gitlab, SSH Credentials这些通用的插件都已经安装好了。

2. 添加SSH私钥

因为要从Gitlab拉取源码,所以需要将对应的SSH key的私钥添加到Jenkins。SSH的密钥一般存放在~/.ssh, 私钥文件名为id_rsa。如果没有SSH key要先用命令行ssh-keygen -t rsa -C "you_email"生成一对key 并将公钥上传到Gitlab。

进入凭据管理页面

添加SSH Private key

ID可以自行输入一个惟一的名称,如果不输入Jenkins也会生成一个。如果生成SSH Key时设置了密码需要把密码填上,没有则空着,最后点击确定。

3. 添加描述文件及证书

进入系统管理页面



首先上传登录钥匙串,路径/Users/xxx/Library/Keychains/login.keychain-db文件夹,由于Jenkins只能上传.keychain后缀的文件,所以要将其文件名改为login.keychain后再上传。

上传后出现如下界面


image.png

密码一般是管理员密码,然后需要填入证书名称,可以从钥匙串复制过来。如果还需要添加更多的证书可以点击按钮"Add Code Signing Identity"


证书名称

如果构建时出现下面的错误,需要去设置下证书私钥的访问权限钥匙串 -> 使用的证书的私钥 -> 右键“显示简介” -> 访问控制 -> 允许所有应用程序访问此项目

证书私钥没有访问权限

修改证书私钥的访问权限

接着添加描述文件,描述文件的地址一般是 /Users/xxx/Library/MobileDevice/Provisioning Profiles。Filename为文件名切不可修改,所以如果想要有可读性的话可以先修改成自己想要的名字再上传,例如“project name_distribution”。只要路径文件夹里有以对应UUID命名的文件就行。

上传描述文件

上传完描述文件需要把MobileDevice文件夹复制到Jenkins的Library目录下,对应路径/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles
否则会提示下图所示的错误

报错找不到对应的描述文件

如果出现下图所示的java.nio.file.AccessDenieException报错,一般是因为对应的路径Jenkins没有读取权限所造成的
权限错误

三、节点创建

1.配置 MacOS Slave
  • 在slave机器上新建一个普通成员权限的用户jenkins,然后登录jenkins用户。
  • 登录后在系统偏好设置 > 共享中开启远程登录,添加远程登录Jenkins用户
    开启远程登录
  • 还有很重要的一点,在slave机器上安装对应的证书和描述文件,因为最终打包是在slave机器上执行的,所以也要安装对应的证书和描述文件。
2.创建节点

选择固定节点

远程工作目录:在slave电脑上登录jenkins后新建一个文件夹,位置任意,只要有权限就可以。
标签: 填写一个惟一的字符串
主机: slave机器的ip地址
Credentials: jenkins账号的账号密码,没有就添加一个
节点配置

保存后启动节点,看到类似下图的信息就成功了。

安装节点

四、任务创建

image.png

任务创建成功后进入配置
进入配置

设置项目在节点运行,输入之前创建的节点的标签
设置项目的运行节点

项目是托管在gitlab的,所以这里选择Git
输入仓库的ssh地址,Credentials选择之前上传的SSH Private Key

image.png

每隔2分钟轮询一次git,如果有更新就开始构建,也可以添加定时构建。

构建触发
配置证书和描述文件

接下来就是最重要的打包脚本

添加shell脚本

首先是拉取Cocoapods 和 Carthage的依赖,如果你只用了其中的一种删掉另外一行代码就行了。如果都没有的话请忽略这一步


拉取依赖
打包脚本
  1. 通过PlistBuddy 从info.plist中获取版本号build number,用于ipa的名称。
  2. 将ipa的路径存入文件,等会上传到蒲公英的时候需要用到。
  3. 打包前先clean一下。
  4. 通过xcodebuild 执行archive,图中的脚本是集成了cocoapods的脚本。下面是没有继承cocoapods的cleanarchive脚本:
echo "+++++++++++++++++ clean +++++++++++++++++"
xcodebuild -target "${TARGET_NAME}"  -configuration 'Release' clean

echo "+++++++++++++++++ Archive +++++++++++++++++"
xcodebuild -target "${TARGET_NAME}"\
 -sdk iphoneos -configuration 'Release'\
 CODE_SIGN_IDENTITY="${CODE_SIGNING_IDENTITY}"\
 SYMROOT='$(PWD)'\
 archive -archivePath ${WORKSPACE}/builds/${IPANAME}/${APP_NAME}.xcarchive
  1. 最后导出xcarchive文件成ipa包,并输出到指定的文件夹

到此一个iOS工程的Jenkins打包就配置好了。

五、添加上传脚本

现在已经有打包后的ipa包了,最后再上传到蒲公英就可以交付给测试了

1. 先安装fir-clifir命令行工具

gem install fir-cli

2. 添加上传脚本
# 蒲公英的User Key
uKey="******"
# 蒲公英的API Key
apiKey="******"

# 要上传的ipa文件路径
IPA_PATH=$(cat path.txt)

rm -rf path.txt

# 上传至蒲公英的命令
echo "++++++++++++++ 上传至蒲公英... +++++++++++++"
curl -F "file=@${IPA_PATH}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" http://www.pgyer.com/apiv1/app/upload

至此整个iOS项目的自动化打包集成就完成了。

六、总结

整个流程走通还是不容易,笔者也是踩了不少坑,花了好几天的时间才完成整个流程。第一次是直接在自己的MacBook上打包,第二次是将一台iMac作为slave打包,两个流程都走了一遍,其实走完第一个再来第二次就很容易了。写这篇文章主要也是记录下踩坑的过程,方便后面自己回顾,也让其他的同学可以走的顺利一点,可能还是会有其他的问题,可以参考下面的链接。

参考链接

  • 手把手教你利用Jenkins持续集成iOS项目
  • jenkins iOS自动化打包分发
  • iOS开发-自动化打包Jenkins集成
  • Jenkins部署MacOS Slave实现持续集成(iOS)

你可能感兴趣的:(Jenkins iOS持续集成实现)