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

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

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

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

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

Mac中使用Jenkins搭建iOS持续集成环境_第1张图片
加入控制权限

1.基础配置部分

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

1.安装所需插件

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

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

Mac中使用Jenkins搭建iOS持续集成环境_第2张图片
管理插件

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

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

Mac中使用Jenkins搭建iOS持续集成环境_第3张图片
插件安装

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 里面找到,只用复制对应的证书名称填入此处即可,如下图红框部分复制即可。

Mac中使用Jenkins搭建iOS持续集成环境_第4张图片
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 进行保存。

Mac中使用Jenkins搭建iOS持续集成环境_第5张图片
Keychains and Provisioning Profiles Management

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

3. 新建项目

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

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

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

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

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

Mac中使用Jenkins搭建iOS持续集成环境_第6张图片
源码管理
  1. 由于不需要轮询操作,此处略过 构建触发器 步骤,直接到 构建环境 部分进行证书文件配置。由于前面我们已经在 Keychains and Provisioning Profiles Management 中配置好了证书和相关配置文件,所以此处直接勾选 Keychains and Code Signing IdentitiesMobile Provisioning Profiles 两项,然后选择对应的打包所需的签名文件和配置文件即可,需要注意的是,此处证书和配置文件类型需要跟后面 构建 中打包脚本所对应的发布方式一致,如 DebugReleaseAdhoc
Mac中使用Jenkins搭建iOS持续集成环境_第7张图片
构建环境
  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任务设置已经完成,回到任务的面板页,在左侧栏点击 立即构建 开始对我们设定的源码文件进行打包输出。

Mac中使用Jenkins搭建iOS持续集成环境_第8张图片
立即构建

4. 遇到的问题

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

  1. 前面在配置Jenkins插件时,提到的 Xcode integration 插件并未在文章中使用,其原因是,在最后的签名脚本部分,此插件并未针对xcode 9.0所需的 exportOptions.plist 文件进行更新,导致其所需的部分设置信息未能提供出来,正确的配置信息如下:




    compileBitcode
    
    method
    ad-hoc
    provisioningProfiles
    
        #bundleid#
        #配置文件名称#
    
    signingCertificate
    iPhone Distribution
    signingStyle
    manual
    stripSwiftSymbols
    
    teamID
    #teamID,证书信息中可查到#
    thinning
    <none>


里面的有 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

你可能感兴趣的:(Mac中使用Jenkins搭建iOS持续集成环境)