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已经被正确地启动服务


      服务正确启动.png
    • 按照提示,在Finder中定位到文件夹,右键选择“显示简介”,设置权限


      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
        Xcode Builder fragment.png
      • 上图所示,Keychain path的默认值如图,可以指定一个路径(最好是Jenkins用户文件夹下的路径,以防访问权限问题),这里直接在该默认路径下使用Finder创建对应的文件夹,并把/Users/用户名/Library/Keychains/login.keychain复制进该文件夹,如果钥匙串文件有密码,记得填上


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


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


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


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


      新增域名.png

      填写SSH信息.png

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

构建项目

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


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


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


    General.png

    源码管理.png

    构建触发器.png

    构建环境.png

    构建.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


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

推荐阅读更多精彩内容