美文网首页
Mac中使用Jenkins搭建iOS持续集成环境

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

作者: 思想猿 | 来源:发表于2018-03-08 16:37 被阅读0次

    每次测试阶段都需要多次打包项目提供给测试同事,最近项目不算紧,抽出了部分时间来研究了下关于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

    相关文章

      网友评论

          本文标题:Mac中使用Jenkins搭建iOS持续集成环境

          本文链接:https://www.haomeiwen.com/subject/fpuyfftx.html