每次测试阶段都需要多次打包项目提供给测试同事,最近项目不算紧,抽出了部分时间来研究了下关于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打包所需的证书配置设置中。
在配置证书之前,有个小步骤需要大家注意下,因为系统权限问题,会导致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
配置界面了,具体配置如下:
- 上传
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
里面找到,只用复制对应的证书名称填入此处即可,如下图红框部分复制即可。
- 上传
Provisioning Profiles
文件
a. 继续点击
选取文件
选择/Users/shared/Jenkins/Library/MobileDevice/Provisioning Profiles
中对应需要的打包配置文件,并点击upload
上传。b. 上传之后,我们就可以在最下方的
Provisioning Profiles
部分看到刚刚添加的文件了。c. 按照以上步骤逐一添加配置文件后,需要在
Provisioning Profiles Directory Path
一栏中填入刚才添加的Provisioning Profiles
所在地址,最后点击save
进行保存。
到此,构建前所需的工作都已完成,接下来就可以开始进行构建操作。
3. 新建项目
回到Jenkins主页,点击左侧 新建
按钮,接下来选择 构建一个自由风格的软件项目
并且输入一个项目/任务名称,之后我们会看到一个配置页面,我们需要在这里进行构建的设置,我们一项一项来看:
- General,关于项目的简介和基础设置
- 源码管理,配置代码所在的远程仓库地址
- 构建触发器,设定构建周期/时间,自动化测试可能会用到
- 构建环境,设置打包所需的配置/密钥之类的文件
- 构建,构建项目所需的脚本
- 构建后操作,设置项目构建之后其他操作事件,如上传发布等等
ok,我们来进行具体设置。
首先设置项目名称和构建保留数量,后者是可选的,目的为了节省空间,释放不必要留存的旧的构建文件。
接着设置项目代码的位置,如果源码在本地,则直接默认选择
None
并在后续的构建步骤中进行设置文件位置即可;如果源码在远程仓库中,则需要填入Git地址,如果为ssh方式连接,还需要去Credentials
里面设置对应的私钥文件,过程比较简单,网上大部分文章都会介绍如何配置,此处不再赘述,这里我们选择None
。
- 由于不需要轮询操作,此处略过
构建触发器
步骤,直接到构建环境
部分进行证书文件配置。由于前面我们已经在Keychains and Provisioning Profiles Management
中配置好了证书和相关配置文件,所以此处直接勾选Keychains and Code Signing Identities
和Mobile Provisioning Profiles
两项,然后选择对应的打包所需的签名文件和配置文件即可,需要注意的是,此处证书和配置文件类型需要跟后面构建
中打包脚本所对应的发布方式一致,如Debug
、Release
、Adhoc
。
- 进入构建脚本步骤,先点击
增加构建步骤
选择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. 遇到的问题
在配置构建项目过程中,遇到了不少问题,通过网上搜索和自身经验奋战一晚终于解决了所有问题,下面列出一些比较有特点的问题,记录在此以作日后参考。
- 前面在配置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><none></string>
</dict>
</plist>
里面的有 Bundle Id, ProvisioningProfiles 和 teamID 的信息,对应填写上即可。另外 method
对应的是打包环境,可以设置为:app-store
、 ad-hoc
、 enterprise
和 development
,如果不太清楚具体应该如何设置该文件,则可以通过 xcode 9.0 打包项目导出.ipa文件时获得,文件名为 ExportOptions.plist
。
此问题遇到的错误代码是:Error Domain=IDEProvisioningErrorDomain Code=9
- 配置啥的都是正确的,证书也没有过期,但是签名阶段失败,如果遇到这样的问题,可以前往
Keychain access.app
在钥匙串中选择登录
,并在种类
中选择密钥
,查看重复的密钥并删除,注意同一名称的密钥会对应公用密钥
和专用密钥
千万别误删了。
此问题遇到的错误代码是:Command/usr/bin/codesign failed with exit code 1