Jenkins部署MacOS Slave实现持续集成(iOS)

解决Linux服务器上的Jenkins无法构建Xcode工程

前言

由于Linux服务器无法安装Xcode,所以Jenkins无法通过shell来调用xcodebuild、xcrun等命令来构建Xcode工程,因此无法持续集成,敏捷开发。下面介绍一种配置Jenkins节点的方式,来实现Linux上的Jenkins构建Xcode工程,并上传ipa到蒲公英pgyer来进行测试。

一、配置MacOS Slave

Jenkins有个强大的功能,配置Slave(奴隶)服务器,来实现分布式部署构建。具体步骤如下:

1. 配置Mac电脑。

系统偏好设置 > 共享 中开启 远程登录,如下图:

Jenkins部署MacOS Slave实现持续集成(iOS)_第1张图片

2. 创建节点。

Jenkins > 系统管理 > 管理节点 > 新建节点,输入节点名称,记得勾选 Permanent Agent,点击OK。

3. 配置节点。

Jenkins部署MacOS Slave实现持续集成(iOS)_第2张图片
其中要保证 /User/Shared/Jenkins/目录的权限为ssh链接的用户可读写。

Host是Mac的ip地址,Credentials是ssh登录Mac时需要的账户和密码。可以添加一个

Jenkins部署MacOS Slave实现持续集成(iOS)_第3张图片

下面的部分很重要

Jenkins部署MacOS Slave实现持续集成(iOS)_第4张图片

PATH环境变量,需要在Mac上通过

echo $PATH
/opt/iOSOpenDev/bin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin:/opt/local/sbin/

获取,然后copy过去。

Keychains and Provisioning Profiles路径要填写正确。没有这个选项的安装Keychains and Provisioning Profiles Management插件。

4. 最后保存。

如果看到

Jenkins部署MacOS Slave实现持续集成(iOS)_第5张图片

即添加Mac Slave成功,且Mac Slave在线。若连不上,请反复确认远程工作目录的权限。

二、配置Jenkins系统设置。

1. 上传证书和描述文件。

Jenkins > 系统管理 > Keychains and Provisioning Profiles Management中上传打包用的证书和描述文件。如下图:

Jenkins部署MacOS Slave实现持续集成(iOS)_第6张图片
Jenkins部署MacOS Slave实现持续集成(iOS)_第7张图片

保存。

2. 在 Jenkins > 系统管理 > 系统设置(全局设置)中设置:

Jenkins部署MacOS Slave实现持续集成(iOS)_第8张图片

很关键。Keychain的路径和密码需要填写Mac中登录用户的密码。

3. 在 Jenkins > 系统管理 > Configure Global Security 中配置:

Jenkins部署MacOS Slave实现持续集成(iOS)_第9张图片

开启Safe HTML。

三、配置iOS项目。

1. 安装插件。

安装 build-name-setterdescription setter plugin插件。

2. Jenkins > 新建

Jenkins部署MacOS Slave实现持续集成(iOS)_第10张图片

3. General.

Jenkins部署MacOS Slave实现持续集成(iOS)_第11张图片

这里添加了参数化构建过程,为了在每次Build时,可以填写更新说明,所以这里天添加了名为News的参数,当用户构建时填写了内容,可以在之后的脚本中通过${News}来获取News的值。

Jenkins部署MacOS Slave实现持续集成(iOS)_第12张图片

这里指定Mac Slave服务器作为构建Xcode工程的Slave服务器,Xcode打包构建全部交给这个节点(Slave服务器)来完成。

Jenkins部署MacOS Slave实现持续集成(iOS)_第13张图片

4. 源码管理。

Jenkins部署MacOS Slave实现持续集成(iOS)_第14张图片

这里填写本地或者远程的代码仓库(如gitlab或者git)。下面的Branch填写指定分支。

5. 构建触发器。

这里暂时不设置,设置了可以自动化测试,和其他脚本配合使用。

6. 构建环境。

Jenkins部署MacOS Slave实现持续集成(iOS)_第15张图片
Jenkins部署MacOS Slave实现持续集成(iOS)_第16张图片

把之前上传的证书和描述文件添加上。

设置Build名称,这里添加了自定义名称。注意,高级里面只勾选第一个,不要勾选 Set build name after build ends,否则会报错。

7. 构建

Jenkins部署MacOS Slave实现持续集成(iOS)_第17张图片

这里使用的脚本。

export LANG="en_US.UTF-8"

security -v unlock-keychain -p "yourpassword"

ipa_name="URWork_iOS_beta"
build_path="${WORKSPACE}/build/"
fastlane gym --workspace URWorkClient.xcworkspace --scheme URWorkClient --clean --configuration Beta --export_method ad-hoc --output_name ${ipa_name} --output_directory ${build_path}

curl -F "file=@${build_path}${ipa_name}.ipa" \
-F "uKey=yourUKey" \
-F "_api_key=yourApiKey" \
-F "updateDescription=${News}" \
https://www.pgyer.com/apiv1/app/upload

最重要、最重要、最重要:

Linux服务器上的Jenkins调用Mac Slave时,是通过之前设置的SSH登录的方式,而Apple为了安全,在ssh登录时,是不允许读取Keychains(钥匙串)的,所以 security -v unlock-keychain -p "yourpassword"这行命令就很重要了。在构建打包前,先解锁Keychains。

当然这里 fastlane 已经提前通过Homebrew安装好了,这里不再赘述。

整体脚本的流程是,先解锁Keychain,然后用fastlane快速打包,最后上传到蒲公英平台,等待测试。

8. 构建后操作。

Jenkins部署MacOS Slave实现持续集成(iOS)_第18张图片

附代码:

更新说明:

${News}

点击跳转到下载页
![](http://upload-images.jianshu.io/upload_images/5912049-8dc3cdb1c798b7e3?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

构建完成后,把之前用户输入的更新说明以及蒲公英下载地址二维码通通显示在Build Description中。

四、整体测试

1. 打开Jenkins。

Jenkins部署MacOS Slave实现持续集成(iOS)_第19张图片

2. 点击develop_iOS。

Jenkins部署MacOS Slave实现持续集成(iOS)_第20张图片

3. 点击Build with Parameters.

Jenkins部署MacOS Slave实现持续集成(iOS)_第21张图片

4. 开始构建。

Jenkins部署MacOS Slave实现持续集成(iOS)_第22张图片

5. 等待构建完成即可。

这里也可以查看构建进度:点击最新的一次构建

Jenkins部署MacOS Slave实现持续集成(iOS)_第23张图片

点击Console Output


Jenkins部署MacOS Slave实现持续集成(iOS)_第24张图片

在这里可以查看一些日志,如果出错了,也可以在这里查询。

五、总结。

使用Jenkins打包Xcode工程整体过程很曲折,坑很多,按照这些来,可能还会遇到一些问题,附上一些链接,以供参考。

  • Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发
  • 手把手教你利用Jenkins持续集成iOS项目
  • Jenkins签名问题
  • 使用 Jenkins 实现持续集成 (iOS)
  • 使用 Jenkins 实现持续集成 (Android)

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