iOS自动化打包实战(Jenkins)

Continuous Integration(CI)持续集成的优点

  • 简而言之,它能带来高效的开发流程,让开发人员从”集成”的人力成本中解放出来

Jenkins工具对于CI的意义

  • 如果说CI是一种概念,那Jenkins就是实现这个概念的比较有力的工具
  • 对于移动端开发而言,持续集成的最好实践就是自动化打包测试
  • Jenkins在移动端CI上有着以下几点的优势
    • Mac平台上搭建简易:iOS自动化打包需要Xcode命令行工具的支持,在Mac平台上搭建会方便许多,坑也会少很多
    • 插件支持友好:对于iOS自动化打包,Jenkins提供足够多的插件支持
    • 自带日志:Jenkins默认情况下集成日志,不需要手动生成
    • 默认集成GIT:Jenkins集成的GIT模块可以方便地对GIT上的代码进行持续集成的工作

Jenkins部署

  • 从官网jenkins.io/ 上下载最新的pkg安装包
  • 安装完成后,打开浏览器,输入http://localhost:8080
    • 如果无法打开,则说明Java环境有问题,重新安装最新的JDK即可
    • 出现以下界面说明Jenkins已经被正确地启动服务

      《iOS自动化打包实战(Jenkins)》 服务正确启动.png

    • 按照提示,在Finder中定位到文件夹,右键选择“显示简介”,设置权限

      《iOS自动化打包实战(Jenkins)》 Finder 简介.png

    • 权限设置完毕后,进入文件夹打开initialAdminPassword就能找到密码,复制并填写到Jenkins服务的网页(http://localhost:8080)中并继续
    • 初始化设置,按照默认的就好了,继续
    • 创建用户,然后点击“保存并完成”
  • 插件安装(系统管理->管理插件->可选插件)
    • GitLab Plugin(可选,如果代码是部署到GitLab环境的话安装)
    • Gitlab Hook Plugin(可选,如果代码是部署到GitLab环境的话安装)
    • Xcode integration(可选,如果不想写脚本执行打包的选择这个作为替代)注意:目前发现新版本的MAC系统(10.13)和Xcode9默认是不允许访问钥匙串的,所以建议都用脚本打包
    • Keychains and Provisioning Profiles Management(如果使用脚本执行打包,则需要安装该插件来管理钥匙串和证书)

信息配置

  • 钥匙串和证书
    • 使用Jenkins部署自动化打包环境总的来说是比较友好而且快速的,如果说有坑,那最主要的坑来源就在证书和钥匙串准备这一环节
    • Jenkins在Mac环境下是通过独立用户来做到文件系统层面上的相对独立,总所周知,打包iOS的iPA包是需要本机环境拥有签名数字证书(Certificate)和描述文件(Provisioning profile)的,由于环境的独立性,需要在Jenkins所在的环境内放置/安装这些内容
    • 以下是在Jenkins配置签名数字证书(Certificate)和描述文件(Provisioning profile)的可能是最保险的实现方式
      • 在Jenkins Dashborad(Jenkins首页)下,点击“系统管理”—>“系统设置”,滚动找到Xcode Builder这一个fragment
        《iOS自动化打包实战(Jenkins)》 Xcode Builder fragment.png
      • 上图所示,Keychain path的默认值如图,可以指定一个路径(最好是Jenkins用户文件夹下的路径,以防访问权限问题),这里直接在该默认路径下使用Finder创建对应的文件夹,并把/Users/用户名/Library/Keychains/login.keychain复制进该文件夹,如果钥匙串文件有密码,记得填上

        《iOS自动化打包实战(Jenkins)》 Keychain path.png

      • 最重要的一步,双击复制之后的login.keychain,进入到“钥匙串访问”,看看里面的签名数字证书是否正确的(如果你主机的证书变动过,复制之后的login.keychain不一定是跟主机的login.keychain一样,所以要打开确认一下,原因是实际上证书的完整内容是保存login.keychain-db里面,login.keychain和login.keychain-db的信息不一定完全对等),如果不正确,就需要把缺失的证书补全,调整完之后可以在钥匙串访问中删除该登录钥匙串的引用

        《iOS自动化打包实战(Jenkins)》 钥匙串访问.png

  • 命令行打包配置:Keychains and Provisioning Profiles Management
    • 如果使用命令行打包,则需要额外配置钥匙串和配置文件
    • 设置位置:Jenkins Dashborad(Jenkins首页)-> 系统管理 -> Keychains and Provisioning Profiles Management

      《iOS自动化打包实战(Jenkins)》 Keychains and Provisioning Profiles Management.png

  • 设置域名验证(以GitLab为例,GitHub也大同小异)
    • Jenkins Dashborad(Jenkins首页)-> Credentials
    • 这里可以选择两种添加方式:全局证书 & 域名证书
    • 顾名思义:全局证书就是全局都能使用的证书,域名证书则是指定域名才能使用的证书

      《iOS自动化打包实战(Jenkins)》 Credentials.png

    • 这里以域名证书为例,设置GitLab SSH(为什么不用HTTP,因为Jenkins的HTTP连接方式可能会无法连上,而且SSH可以绕过Nginx的文件上传大小限制,总之用SSH的坑会少一些)

      《iOS自动化打包实战(Jenkins)》 新增域名.png
      《iOS自动化打包实战(Jenkins)》 填写SSH信息.png
      《iOS自动化打包实战(Jenkins)》 添加完成.png

  • PS: 如果经过以上步骤仍然出现因为证书而无法打包成功的情况,可以把证书安装到“钥匙串访问”-“系统”里(原来一般都会把证书安装到“钥匙串访问”-“登录”里面)

构建项目

  • Jenkins Dashborad(Jenkins首页)点击“新建”

    《iOS自动化打包实战(Jenkins)》 新建项目.png

  • 新建项目界面,按照提示填写并继续

    《iOS自动化打包实战(Jenkins)》 项目基本信息.png

  • 配置项目(这里以执行脚本打包的方法为例)

    《iOS自动化打包实战(Jenkins)》 General.png
    《iOS自动化打包实战(Jenkins)》 源码管理.png
    《iOS自动化打包实战(Jenkins)》 构建触发器.png
    《iOS自动化打包实战(Jenkins)》 构建环境.png
    《iOS自动化打包实战(Jenkins)》 构建.png

  • 编写执行的脚本

    • 本人比较推荐使用脚本的方式进行打包,而不是使用Jenkins的Xcode integration,因为使用脚本比较灵活而且可复用
    • 脚本核心逻辑:清理工程 -> 归档工程 -> 导出ipa -> 验证ipa -> 上传ipa
    • 核心逻辑对应的脚本代码(以使用cocoapod的iOS项目为例):
      • 重要参数解析:
        • CODE_SIGN_IDENTITY:签名证书的名字,格式–“iPhone Distribution: Shanghai ******* Co., Ltd.(*****)”

        • PROVISIONING_PROFILE:配置文件的UUID,获取方式–Jenkins Dashborad(Jenkins首页)-> 系统管理 -> Keychains and Provisioning Profiles Management

          《iOS自动化打包实战(Jenkins)》 Keychains and Provisioning Profiles Management.png

        • -exportOptionsPlist:这是导出选项的plist文件的路径,该plist文件的简单示例如下,具体解释可以在命令行中输入xcodebuild -help查看

            <?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>method</key>
                <string>app-store</string>
                <key>teamID</key>
                <string>开发小组ID</string>
            </dict>
            </plist>
        
        • altool路径:这其实就是ipa上传工具Application Loader的命令行工具,一般地址位于/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool
      • 清理工程:xcodebuild -workspace <工作区间名字.xcworkspace> -scheme <scheme名字,一般为工程名字> -configuration <Release或者Debug> clean
      • 归档工程:xcodebuild archive -workspace <工作区间名字.xcworkspace> -scheme <scheme名字,一般为工程名字> -archivePath <归档路径> -configuration <Release或者Debug> CODE_SIGN_IDENTITY=<签名证书的完整名字> PROVISIONING_PROFILE=<配置文件的UUID>
      • 导出ipa:xcodebuild -exportArchive -archivePath <归档路径> -exportPath <导出ipa路径> -exportOptionsPlist <导出选项的plist文件>
      • 验证ipa:<altool路径> –validate-app -f <验证ipa的完整路径> -u <appleID账号名> -p <appleID密码> -t <平台名,ios> –output-format <输出日志的格式normal或者xml>
      • 上传ipa:<altool路径> –upload-app -f <验证ipa的完整路径> -u <appleID账号名> -p <appleID密码> -t <平台名,ios> –output-format <输出日志的格式normal或者xml>
    原文作者:聪明的笨白
    原文地址: https://www.jianshu.com/p/85b8d649f8d5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞