Mac中使用Jenkins搭建iOS持续集成环境

每次测试阶段都需要多次打包项目提供给测试同事,最近项目不算紧,抽出了部分时间来研究了下关于iOS的持续集成问题。

网上有很多介绍关于如何在Mac下使用Jenkins持续集成iOS的文章,我也是一步一步参考这类文章进行安装搭建的,所以这篇文章对于基础部分不再赘述,只针对配置过程做个简述,重点是对于过程中遇到的各种难点找出的解决方法进行记录,参考的文章有不少,推荐大家看这篇

Tips: 对于所有构建中会涉及到权限不够,无法访问某个文件夹的问题,最好在
/Users/shared/Jenkins//Users/[你的用户名]/Library/ 的目录以及子目录加入本机账户和Jenkins账户的控制权限。

加入权限控制步骤:右键点击目标文件夹,选择 显示简介,出现下图所示设置,接着点击右下角的解锁按钮,输入本机密码后,点击左下角的+号按钮,在出现的选择框中选择对应需要新增控制权限的用户,回到下图设置中,更改红框中对应的用户的控制权限为 读与写 ,设置完毕后,点击下方的齿轮按钮,选择 应用到包含的项目...

加入控制权限

1.基础配置部分

本文的背景是在jenkins已经成功安装到系统之后,并准备开始第一次新建项目的情况下进行配置。

1.安装所需插件

在构建iOS项目前,还有一个小步骤需要操作下:安装打包所需的keychains管理插件,以及一个可选的xcode构建脚本集成工具,这样会在后面配置上方便很多。

a. 网页登录Jenkins系统后,在主页的左侧选择 系统管理 选项,接着在中间内容区域选择 管理插件 进入插件管理区域。

管理插件

b. 在 可选插件 选项卡中,分别搜索 Keychains and Provisioning Profiles Management
Xcode integration,出来的结果里面选中对应插件并点击 直接安装,之后记得勾选 安装完成后重启Jenkins(空闲时),这样在成功安装后,就不需要手动再去重启Jenkins了,不过还是顺便奉上手动重启方式:

地址栏中输入:localhost:8080/restart 即可,8080换成你登录jenkins的端口即可,一般默认就是8080

插件安装

ok,构建项目前前所需的工具都已经安装完毕了,下面开始进行插件配置

2.配置插件 Keychains and Provisioning Profiles Management

回到Jenkins主界面,依次点击 系统管理 -> Keychains and Provisioning Profiles Management,进入到iOS打包所需的证书配置设置中。

Keychains and Provisioning Profiles Management

在配置证书之前,有个小步骤需要大家注意下,因为系统权限问题,会导致Jenkins没有/Users/[你的用户名]/Library/Keychains/
/Users/[你的用户名]/Library/MobileDevice/Provisioning Profiles
文件夹的访问权限,最终会导致在构建iOS项目时无法获取证书问题。

对于上述问题的解决方法很简单,复制粘贴 /Users/[你的用户名]/Library/Keychains//Users/[你的用户名]/Library/MobileDevice/Provisioning Profiles文件夹下所有文件到 /Users/Shared/Jenkins/Library/Keychains/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles文件夹下面。

Tips: 如果觉得文件太多,其实只用复制/Keychains文件夹中的login.keychain和login.keychain-db两个文件,以及/Provisioning Profiles文件夹中对应需要用到的.mobileprovision文件即可

ok,现在已经进入到Keychains and Provisioning Profiles Management配置界面了,具体配置如下:

  1. 上传 keychain 文件。

a. 点击 选取文件 选择 /Users/shared/Jenkins/Library/Keychains/login.keychain文件,并点击 upload 上传。

b. 在 Password 一栏中输入login.keychain的密码,一般为当前用户登录密码。

c. 点击 Add Code Signing Identity 新增 Code Signing Identity 项目,并在 Code Signing Identity 一栏中输入对应证书名称。

Tips: 此处证书名称可以在系统中的 Keychain Access.app 里面找到,只用复制对应的证书名称填入此处即可,如下图红框部分复制即可。

keychains_name.png
  1. 上传 Provisioning Profiles 文件

a. 继续点击 选取文件 选择 /Users/shared/Jenkins/Library/MobileDevice/Provisioning Profiles 中对应需要的打包配置文件,并点击 upload 上传。

b. 上传之后,我们就可以在最下方的 Provisioning Profiles 部分看到刚刚添加的文件了。

c. 按照以上步骤逐一添加配置文件后,需要在 Provisioning Profiles Directory Path 一栏中填入刚才添加的 Provisioning Profiles 所在地址,最后点击 save 进行保存。

Keychains and Provisioning Profiles Management

到此,构建前所需的工作都已完成,接下来就可以开始进行构建操作。

3. 新建项目

回到Jenkins主页,点击左侧 新建 按钮,接下来选择 构建一个自由风格的软件项目 并且输入一个项目/任务名称,之后我们会看到一个配置页面,我们需要在这里进行构建的设置,我们一项一项来看:

  1. General,关于项目的简介和基础设置
  2. 源码管理,配置代码所在的远程仓库地址
  3. 构建触发器,设定构建周期/时间,自动化测试可能会用到
  4. 构建环境,设置打包所需的配置/密钥之类的文件
  5. 构建,构建项目所需的脚本
  6. 构建后操作,设置项目构建之后其他操作事件,如上传发布等等

ok,我们来进行具体设置。

  1. 首先设置项目名称和构建保留数量,后者是可选的,目的为了节省空间,释放不必要留存的旧的构建文件。

  2. 接着设置项目代码的位置,如果源码在本地,则直接默认选择 None 并在后续的构建步骤中进行设置文件位置即可;如果源码在远程仓库中,则需要填入Git地址,如果为ssh方式连接,还需要去Credentials 里面设置对应的私钥文件,过程比较简单,网上大部分文章都会介绍如何配置,此处不再赘述,这里我们选择 None

源码管理
  1. 由于不需要轮询操作,此处略过 构建触发器 步骤,直接到 构建环境 部分进行证书文件配置。由于前面我们已经在 Keychains and Provisioning Profiles Management 中配置好了证书和相关配置文件,所以此处直接勾选 Keychains and Code Signing IdentitiesMobile Provisioning Profiles 两项,然后选择对应的打包所需的签名文件和配置文件即可,需要注意的是,此处证书和配置文件类型需要跟后面 构建 中打包脚本所对应的发布方式一致,如 DebugReleaseAdhoc
构建环境
  1. 进入构建脚本步骤,先点击 增加构建步骤 选择 Execute Shell 新增shell脚本模块,在代码块中输入下方代码:
#工程名
APP_NAME="替换成你的工程名"  
Method_Archive="Release" #打包方式:Release Debug
#源码文件地址
Proj_Path="代码所在文件夹地址"
#ExportOptions.plist地址
Export_PLIST_PATH="${Proj_Path}/ExportOptions.plist" #xcode 9.0以上打包需要此文件,可以放在其他位置
#workspace文件位置
WorkSpaceFile_Path="${Proj_Path}/${APP_NAME}.xcworkspace" #如果没有.xcworkspace文件,则此处应为.xcodeproj文件
#打包文件输出文件夹位置
OutPutFile_Path=".ipa文件输出文件夹地址" #文件夹位置任意,但是需要访问权限,一般设在/Users/shared/Jenkins 目录下
#archive path构建文件目标地址
Archive_Path="${WORKSPACE}/${APP_NAME}/build/${APP_NAME}.xcarchive"

#打包/签名命名
xcodebuild -archivePath "${Archive_Path}" \
-workspace ${WorkSpaceFile_Path} \ #此处如果为.xcodeproj文件,则 -workspace 改为 -project
-sdk iphoneos \
-scheme "${APP_NAME}" \ #此处可以通过命令行模式下切换到代码根目录并输入 'xcodebuild -list' 来获得
-configuration "${Method_Archive}" archive

xcodebuild -exportArchive -archivePath "${Archive_Path}" \
-exportPath "${OutPutFile_Path}" \
-exportOptionsPlist "${Export_PLIST_PATH}" \
-allowProvisioningUpdates

以上命令核心只有最后两行,分别执行了2个操作:1. 构建 Archive 文件;2. 对 Archive 文件进行签名打包。

另外需要注意的一个地方是,上述脚本是在使用了cocoapods情况下设置的,如果项目中没有用到cocoapods并且未使用workspace时,那么 WorkSpaceFile_Path 这里的文件应该为 .xcodeproj 类型文件,且命令中 -workspace ${WorkSpaceFile_Path} 应该改为 -project ${WorkSpaceFile_Path} 即可。

到此为止,自动构建iOS项目的Jenkins任务设置已经完成,回到任务的面板页,在左侧栏点击 立即构建 开始对我们设定的源码文件进行打包输出。

立即构建

4. 遇到的问题

在配置构建项目过程中,遇到了不少问题,通过网上搜索和自身经验奋战一晚终于解决了所有问题,下面列出一些比较有特点的问题,记录在此以作日后参考。

  1. 前面在配置Jenkins插件时,提到的 Xcode integration 插件并未在文章中使用,其原因是,在最后的签名脚本部分,此插件并未针对xcode 9.0所需的 exportOptions.plist 文件进行更新,导致其所需的部分设置信息未能提供出来,正确的配置信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>compileBitcode</key>
    <false/>
    <key>method</key>
    <string>ad-hoc</string>
    <key>provisioningProfiles</key>
    <dict>
        <key>#bundleid#</key>
        <string>#配置文件名称#</string>
    </dict>
    <key>signingCertificate</key>
    <string>iPhone Distribution</string>
    <key>signingStyle</key>
    <string>manual</string>
    <key>stripSwiftSymbols</key>
    <true/>
    <key>teamID</key>
    <string>#teamID,证书信息中可查到#</string>
    <key>thinning</key>
    <string>&lt;none&gt;</string>
</dict>
</plist>

里面的有 Bundle Id, ProvisioningProfiles 和 teamID 的信息,对应填写上即可。另外 method 对应的是打包环境,可以设置为:app-storead-hocenterprisedevelopment,如果不太清楚具体应该如何设置该文件,则可以通过 xcode 9.0 打包项目导出.ipa文件时获得,文件名为 ExportOptions.plist

此问题遇到的错误代码是:Error Domain=IDEProvisioningErrorDomain Code=9

  1. 配置啥的都是正确的,证书也没有过期,但是签名阶段失败,如果遇到这样的问题,可以前往 Keychain access.app 在钥匙串中选择 登录,并在 种类 中选择 密钥,查看重复的密钥并删除,注意同一名称的密钥会对应 公用密钥专用密钥千万别误删了。

此问题遇到的错误代码是:Command/usr/bin/codesign failed with exit code 1

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

推荐阅读更多精彩内容