基于Xcode9和Xcode Server的iOS持续集成-基础

作者: buptwsg | 来源:发表于2017-10-11 23:23 被阅读1492次

    Xcode Server是苹果官方提供的持续集成方案,在Xcode9之前就已经存在,不过需要从MAC App Store下载并安装OS X Server(付费软件),使用起来比较繁琐。在Xcode9中,Xcode Server被内置在了Xcode中,于是整个的CI环境搭建过程也大大的简化了。

    搭建基本的持续集成环境

    接下来我们要搭建一个基本的持续集成环境,这个集成环境可以:

    • 拉取指定仓库的特定分支的代码
    • 指定触发CI的条件
    • 执行Archive操作,并导出Ad-Hoc签名的安装包
    • 将此安装包上传到蒲公英,供测试人员去下载安装

    这里以笔者自己的一个GitHub上的公有仓库作为例子,仓库地址为:https://github.com/buptwsg/iOSCoreAnimation

    首先Clone此仓库到本地。

    第1步,开启Xcode Server

    打开Xcode->Preferences->Server & Bots,点击显示为OFF的开关,输入管理员密码后,在弹出的窗口中选择Integration User。苹果建议是使用一个特定的,非管理员权限的用户,不过也可以使用当前登录的用户。在这里,可以直接选择当前登录用户。


    WX20171011-064822.png

    点击Continue后,会去配置并启动Server,完成以后,界面如下:


    WX20171011-065759.png

    至此,Xcode Server就已经启动了。可以根据自己的需要,对Server进行配置,暂时我们不用修改任何设置。

    第2步,创建Bot

    2.1 在Xcode中打开项目,点击Product->Create Bot...

    要创建Bot,必须在打开项目的状态下,否则'Product->Create Bot...'项是灰色的,无法点击。

    2.2 连接到服务器

    在弹出窗口中,可以为Bot命名,然后从下拉框中选择'Add New Server...'。
    在接下来的界面中,从列表中选择Server,然后点击'Next'。
    然后,输入用户名,密码,点击'Add'。


    WX20171011-071233.png

    在这里,我选择的是作为'Registered user'的身份连接到Server,然后输入当前登录用户的用户名和密码。回想一下,在开启Server的时候,我们选择的Integration User是当前登录用户。
    如果选择'Guest',虽然也可以,但是之后会发现,无法对创建好的Bot进行编辑。

    这一步的结果,实质上是创建了一个Xcode Server类型的Account,并添加到Xcode中。


    WX20171011-072117.png

    在写这篇文章的时候,Xcode有bug,添加了Xcode Server的Account以后,会发现之前添加的Apple ID类型的账户都没有了。

    2.3连接到代码仓库

    由于当前打开的项目,是Clone下来的Git仓库,所以Xcode很智能的读取出了仓库的信息。在下面的界面中,可以从下拉框中选择具体的分枝,然后点击Next。


    WX20171011-214926.png

    2.4设置构建配置

    WX20171011-220027.png

    Scheme: 选择要构建哪个scheme,被构建的scheme必须是共享的。所以如果scheme是未共享的状态,请保持'Share and commit scheme'被选中。

    Actions:指定要执行哪些动作。一共有3类,Analyze(代码静态分析),Test(测试), Archive(打包)。
    针对Export,笔者选择的是'Use Custom Export Options Plist',原因是因为如果不选择这项,打出来的包总是用iPhone Developer的证书进行的签名,无法打出Ad-Hoc类型的包。

    至于ExportOptions.plist,可以通过下面的办法得到:手动执行Product->Archive,然后导出Ad-Hoc安装包,在导出的目录中,就包含了一个ExportOptions.plist文件,直接用这个文件即可。

    Configuration: 这里选择Release版本。

    2.5设置构建触发器

    可以选择的类型:周期性构建,每次提交构建,手动构建。这里笔者选择的是手动构建。
    另外还可以设置每次构建前是否Clean。


    WX20171011-220137.png

    2.6设置签名信息

    WX20171011-220249.png

    在这里可以将指定的证书和Provisioning Profiles添加到Server。
    另外要将Xcode工程设置为手动管理签名,也就是不选中'Automatically Manage Signing'。

    2.7 设置环境变量以及传递给xcodebuild的参数

    这一步可以根据需要进行设置,目前我们不需要。

    2.8 设置触发器

    该步骤中,可以设置构建前执行的脚本,构建后执行的脚本,以及邮件相关的触发器。由于我们需要将构建出的IPA包上传到蒲公英,因此需要添加一个构建后执行的脚本,并指定只在构建成功时才执行。


    WX20171011-224106.png

    点击Done,一个基本的Bot就配置好了,第一次的Integration自动开始。在集成结束的时候,打包出的IPA文件会被上传到蒲公英。

    查看集成的结果并管理Bots, Integrations

    在Xcode中,转到Report Navigator,选择Bot或是某次集成,在右侧的窗口区域,可以查看集成结果,触发一次新的集成,以及对Bots进行管理,如编辑,删除等。


    WX20171011-224734.png

    构建时的一些目录

    /Library/Developer/XcodeServer/IntegrationAssets:这个目录会保存所有的Bot的每一次的集成结果,IPA文件,符号文件都可以在目录中找到。
    ~/Library/Caches/XCSBuilder/Bots/xxx/:xxx代表一个Bot的ID,在该目录下的Source目录,存放的是从仓库中拉到的代码。

    接下来

    现在虽然可以满足基本的持续集成需求,但是缺少了重要的邮件通知功能。在下一篇中,会讲述如何配置邮件功能,来对开发人员和测试人员进行通知。

    参考

    XcodeServer and Continuous Integration Guide

    相关文章

      网友评论

      • Mr_Zander:按照文章的教程做了一遍,遇到了几个问题,最后从另一个文章找到了答案
        http://www.iosprogrammer.tech/2018/03/06/XCode-Server-CI/
      • Dariel:似乎按照这个路径并不能上传到蒲公英 curl -F "file=@$XCS_PRODUCT}" \
        试了下 这样 curl -F "file= "${XCS_PRODUCT}"" \ 也不行, 好像XCS_PRODUCT获取到的为空
        buptwsg:@Dariel_陈旗 那你看一下你脚本的log。集成运行完以后,点击上方的"Logs"这个Tab,然后在下方左侧的下拉框中选择你脚本的名字,查看log。看能不能从这里找到原因。
        另外,你的IPA文件多大?由于XCS_PRODUCT会被删除,所以我怀疑可能是上传需要的时间比较长,然后文件被删了,导致失败?
        Dariel:@buptwsg 的确可以看到有生成,但按照你这样的写法还是没有上传到蒲公英啊,我用postman试了下是ok的,这是为何,大神求解啊
        buptwsg:你好,我试了一下,没有问题的。
        脚本要这样写:
        echo $XCS_PRODUCT

        curl -F "file=@$XCS_PRODUCT" \
        -F "uKey=YOUR_UKEY" \
        -F "_api_key=YOUR API KEY" \
        https://www.pgyer.com/apiv1/app/upload

        上面的脚本里通过echo打印了XCS_PRODUCT,你可以在集成完以后,去看一下log。
        在我的环境中,打印出来的值是/Users/shuguangwang/Library/Caches/XCSBuilder/Integration-1b7050fef9b455f8f63f01787e0081ea/ExportedProduct/AnimationPlayer.ipa。不过这个路径在集成以后会被删除,你可以在集成的过程中打开~/Library/Caches/XCSBuilder这个目录,观察确实有XCS_PRODUCT对应的路径生成。
      • ac86a822c0ff:你好,我想请问一下,再上传到蒲公英时,你的$XCS_PRODUCT是怎么定义的?
        buptwsg:@黑马饮清泉 最近各种忙,没时间写,还没实现呢。
        黑马饮清泉:你好,邮件通知功能实现了吗,选择From的email是什么
        buptwsg:这个不是我定义的,是Xcode Server内置的环境变量,可以直接引用。文档在这里:https://developer.apple.com/library/content/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/EnvironmentVariableReference.html#//apple_ref/doc/uid/TP40013292-CH14-SW1

        至于具体的值,你可以在script里打印这个环境变量,理解的就更深了。

      本文标题:基于Xcode9和Xcode Server的iOS持续集成-基础

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