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打包,两个流程都走了一遍,其实走完第一个再来第二次就很容易了。写这篇文章主要也是记录下踩坑的过程,方便后面自己回顾,也让其他的同学可以走的顺利一点,可能还是会有其他的问题,可以参考下面的链接。

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335