前言
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
目录
- Jenkins安装
- Jenkins环境配置
- 节点创建
- 创建配置任务
- 上传到蒲公英
- 总结
一、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。
ID可以自行输入一个惟一的名称,如果不输入Jenkins也会生成一个。如果生成SSH Key时设置了密码需要把密码填上,没有则空着,最后点击确定。
3. 添加描述文件及证书
进入系统管理页面
首先上传登录钥匙串,路径
/Users/xxx/Library/Keychains/login.keychain-db
文件夹,由于Jenkins只能上传.keychain
后缀的文件,所以要将其文件名改为login.keychain
后再上传。
上传后出现如下界面
密码一般是管理员密码,然后需要填入证书名称,可以从钥匙串复制过来。如果还需要添加更多的证书可以点击按钮"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账号的账号密码,没有就添加一个
保存后启动节点,看到类似下图的信息就成功了。
四、任务创建
任务创建成功后进入配置
设置项目在节点运行,输入之前创建的节点的标签
项目是托管在gitlab的,所以这里选择Git
输入仓库的ssh地址,Credentials选择之前上传的SSH Private Key
每隔2分钟轮询一次git,如果有更新就开始构建,也可以添加定时构建。
接下来就是最重要的打包脚本了
首先是拉取Cocoapods 和 Carthage的依赖,如果你只用了其中的一种删掉另外一行代码就行了。如果都没有的话请忽略这一步
- 通过PlistBuddy 从info.plist中获取版本号和build number,用于ipa的名称。
- 将ipa的路径存入文件,等会上传到蒲公英的时候需要用到。
- 打包前先clean一下。
- 通过xcodebuild 执行archive,图中的脚本是集成了cocoapods的脚本。下面是没有继承cocoapods的clean和archive脚本:
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
- 最后导出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打包,两个流程都走了一遍,其实走完第一个再来第二次就很容易了。写这篇文章主要也是记录下踩坑的过程,方便后面自己回顾,也让其他的同学可以走的顺利一点,可能还是会有其他的问题,可以参考下面的链接。