zoukankan      html  css  js  c++  java
  • Xcode Server持续集成

    这是一篇2017-11-12 年我还在 ezbuy 的一篇文章,时间过去很早了,最近在整理笔记的时候发现了, 同步过来,文章内容现在是否有效不确定,应该大差不差,读者仅做参考

    最后更新 2017-11-12

    一、为什么要持续集成

    在App开发周期中, 需要不断的对develop上面的代码进行build、Test、Analyze等一些列的操作, 保证在主干分支上的代码永远是在一种可发布的状态,但是这些操作是简单但是很耗时的一个操作,因此采用持续集成的方案。
    所谓持续集成,就是把编译、测试、分析、打包、报告结果的过程交给持续集成服务器来完成,这样能大量省去了开发的时间。

    iOS的集成方案有很多,有最原始的利用Xcodebuild来打包工具,也有利用Jenkins来做持续集成。而我们采用的是Apple 一直支持的 Xcode server来处理。
    它由如下优点:

    • 方便集成,在Xcode9中,Apple直接将其嵌入Xcode之中,集成非常简单;
    • 提供了用于监视机器人的Web仪表板;
    • 能创建可安装的IPA,并能通过Web仪表板安装;
    • 能都很好的继续分析测试等;
    • 越发详细的log信息,如果出现错误,可以根据log信息来处理;(PS:实际上,我调试问题,都是根据log信息来处理的。)

    二、怎么做

    网上一搜Xcode build 持续集成,总能搜到很多很多的版本,有的甚至是Xcode5 甚至Xcode6的,但是面对跟现在有很大的区别。因此提供如下两中教程。(PS: 在实际处理中,实际官方文档才是最全面的)

    教程一: Xcode 8 或者 Xcode8以下

    教程二: Xcode9

    也许你会说,这算是嘛事啊,让看官方文档。因为官方文档对各种配置有很详细的解释。 我看了很多关于Xcode Server 持续集成的文档,步骤基本一模一样,没有详细说明。看完后 你还是一脸懵逼。甚至于,有很多还是是错的,看完更懵逼。因此强烈推荐官方的。


    三、踩的各种坑

    因为教程步骤等,官方很详细,推荐大家去阅读以下。但是坑可就是千奇百怪的。这才是重点。

    坑1: 跑着跑着就歇火了

    问题描述:
    当一切设置好之后,取运行ezbuy项目,发现跑着跑着就被cancel了(非人为)
    解决方式
    在Xcode9 -> Prefrences -> Server & Bots
    image_1blp6d2tfgloq20neqkm8mu19.png-71.7kB

    坑2:名字的坑

    问题描述
    我们集成Xcode Server最终为了是将最后生成的iPA上传到我们的运维服务去,在最后执行所写的脚本的时候,需要取到对应的iPA路径,其路径是IPA Name来确定的,但是如果IPA名称中带了“空格",处理起来相对会麻烦一点。
    解决方式
    方式1: 修改iPA的名字,将 ezbuy EnterPrise UAT.ipa修改为ezbuy_EnterPrise_UAT.ipa
    对应的脚本如下

    #!/bin/sh
    
    # 找到iPA的名称
    IPA_NAME=$(basename "${XCS_ARCHIVE%.*}".ipa)
    
    # 找到iPA路径
    IPA_PATH="${XCS_OUTPUT_DIR}/ExportedProduct/Apps/${IPA_NAME}"
    
    # 讲iPA路径底下的文件空改成下划线,例如ezbuy Enterprise UAT.ipa 改为 ezbuy_Enterprise_UAT.ipa
    NEW_NAME="$(ls ${IPA_PATH}  | grep "$IPA_NAME" | sed 's/ /_/g')"
    echo $NEW_NAME
    
    # 修改iPA名称
    mv $IPA_PATH/"$IPA_NAME" $IPA_PATH/$NEW_NAME
    

    因为对shell 脚本不熟,写出这个小脚本还是挺自豪的,但是最终发现存在一个问题
    如果你将名字修改了,那么对于系统生成的 Server local 的iPA 你将无法看见。这个解决方式也很简单,就会将文件复制出来,到自定义的目录中,然后改名字,处理。
    相应脚本如下:

    
    #!/bin/sh
    
    # 找到iPA的名称
    IPA_NAME=$(basename "${XCS_ARCHIVE%.*}".ipa)
    
    # 找到对应的目录文件
    OUTPUT_DIR_PATH="${XCS_OUTPUT_DIR}"
    echo $OUTPUT_DIR_PATH
    
    # 移动的最终的文件夹名称(指定)
    DES_DIR_PATH=/Users/server/XcodeServer/ezbuy_Enterprise_UAT
    
    # 新建一个文件夹,按照时间排序,方便以后找
    FILE_NAME=$(date +%Y%m%d%H%M)
    cd $DES_DIR_PATH
    mkdir $FILE_NAME
    echo $DES_DIR_PATH/$FILE_NAME
    echo "1-------
    "
    
    # 移动操作
    cp -r $OUTPUT_DIR_PATH $DES_DIR_PATH/$FILE_NAME
    
    # 拼接iPA路径
    IPA_PATH="${DES_DIR_PATH}/${FILE_NAME}/Integration-${XCS_INTEGRATION_ID}/ExportedProduct/Apps"
    
    echo $IPA_PATH
    echo $IPA_NAME
    
    # 讲iPA路径底下的文件空改成下划线,例如ezbuy Enterprise UAT.ipa 改为 ezbuy_Enterprise_UAT.ipa
    NEW_NAME="$(ls ${IPA_PATH}  | grep "$IPA_NAME" | sed 's/ /_/g')"
    echo $NEW_NAME
    
    mv $IPA_PATH/"$IPA_NAME" $IPA_PATH/$NEW_NAME
    
    echo $IPA_PATH/$NEW_NAME
    
    # ssh 上传到自己服务器
    scp -P 22 $IPA_PATH/$NEW_NAME xxxxxxxxxx(字符服务器路径)
    
    

    但是这个方式,在最后一个,我也放弃了。采用了方式2

    方式2: (推荐这种解决方式)
    选中项目,然后选择 Edit Scheme -> Archive -> Archive Name,修改成不带空格名称即可。
    image_1blp7eqdbvn4k6g1f281sso1dca9.png-48.3kB

    坑3: ipa去哪里了

    在编写程序中,需要一步步来验证,为了获取到最后的iPA,我打印其路径

    # 找到iPA的名称
    IPA_NAME=$(basename "${XCS_ARCHIVE%.*}".ipa)
    
    # 找到iPA路径
    IPA_PATH="${XCS_OUTPUT_DIR}/ExportedProduct/Apps/${IPA_NAME}"
    
    echo $IPA_PATH
    

    but: 每次我根据打印的log信息的时候,根据其显示的Path 取找对应的iPA,文件夹空空. 后来找到半天,找到了答案
    在Xcode Server 执行完毕之后,会自动删除掉生成iPA的文件夹.
    What????

    StackOverFlow上面找到最终iPA地址

    TARGET_NAME=`basename "${XCS_ARCHIVE}" .xcarchive`
    IPA_PATH=${INTEGRATION_ASSETS}/${XCS_BOT_ID}-${XCS_BOT_NAME}/${XCS_INTEGRATION_NUMBER}/${TARGET_NAME}.ipa
    

    But,这个地址也没用啊,在执行 POST - Integration Scripts时候,此文件夹还未生成.
    最终发现,在集成的过程中, 在IPA_PATH会生成ipa,存在其文件夹中,然后执行完所有的程序后自动删除。 我所验证的操作是,将其复制出来(按照上面的shell脚本),然后检查,上传到我们的服务器。

    坑4 一个我至今无法爬出的坑

    现象:
    这个问题,很难复现,如果你出现了,恭喜你。

    Xcode Server setup failed (starting api server) Try clicking Choose Xcode and selecting a newer version of Xcode
    

    Snip20170714_8.png-96.6kB

    针对这个问题,StackOverFlow和 苹果社区都没有找到答案,卸载Xcode与Server重新安装都不可以,最后系统重装,才解决了。

    如果你碰到了 有对应的解决办法,还希望反馈一下.

    网上有看到处理方式,但是无效,如果你出现了这个问题,可以在终端执行试试
    sudo xcrun xcscontrol --reset
    sudo /Applications/Xcode.app/Contents/Developer/usr/bin/xcscontrol --reset

    怎么看log信息,怎么看那些参数

    只要在脚本之中,写上下面代码,就会将系统所有的参数显示出来,so easy

    set
    

    为何用Xcode9 Bata

    因为我们的 ezbuy Enterprise UAT 是企业版本,在Xcode8之中,配置相当复杂,在Xcode9之中,只要配置如下(这也是几经折腾,选择Xcode9的原因)
    image_1blp8nevn1eufmkv17fsad41pve1p.png-55.5kB

    ExportOptins.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>method</key>
    	<string>enterprise</string>
    	<key>thinning</key>
    	<string>&lt;none&gt;</string>
    	<key>teamID</key>
        <string>你自己的TeamID</string>
        <key>uploadSymbols</key>
        <true/>
        <key>stripSwiftSymbols</key>
        <true/>
    </dict>
    </plist>
    

    具体各种参数信息,可在mac 终端,输入: xcodebuild --help即可看到详细信息


    三、最终效果以及各种配合信息截图

    Bot效果截图
    image_1blp9fdf7mkdfp13hj6m21u783d.png-239kB
    image_1blp9b2ppqecn5o12kova0tt126.png-305kB

    image_1blp9j71sa201paa4qckdt1kk46a.png-42.1kB

    Bot after脚本
    Snip20170725_18.png-345.7kB

    如果对环境变量不熟悉的,推荐在脚本中打印 set,然后详细了解一下。

  • 相关阅读:
    python文件打开方式详解——a、a+、r+、w+、rb、rt区别
    io.UnsupportedOperation: can't do nonzero cur-relative seeks”错误
    端口三种模式:access,hybrid,trunk
    水仙花数
    maktrans和translate详解
    实战NFS服务搭建与配置
    except 配合 shell实现公钥分发脚本
    linux系统免秘钥分发文件
    rsync + inotify 实现远程实时同步数据
    通过rsync实现全网数据备份检查脚本
  • 原文地址:https://www.cnblogs.com/gaox97329498/p/11916820.html
Copyright © 2011-2022 走看看