Xcode Server持续集成

Xcode Server持续集成

标签 : iOS XcodeServer 持续集成 作者 : iOS Team 高祥

一、为什么要持续集成

在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
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-------\n"

# 移动操作
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
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
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
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_1blp9fdf7mkdfp13hj6m21u783d.png-239kB

image_1blp9b2ppqecn5o12kova0tt126.png-305kB
image_1blp9b2ppqecn5o12kova0tt126.png-305kB

image_1blp9j71sa201paa4qckdt1kk46a.png-42.1kB
image_1blp9j71sa201paa4qckdt1kk46a.png-42.1kB

Bot after脚本

Snip20170725_18.png-345.7kB
Snip20170725_18.png-345.7kB

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

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

推荐阅读更多精彩内容

  • 码字不易,转载请注明出处。 前言 iOS常用的持续集成工具有Jenkins、Travis CI、Xcode ser...
    牧码人_阅读 9,509评论 23 48
  • 本文章转载于搜狗测试 提起持续集成测试,大家能够想到很多强大的持续集成工具Jenkins、Travis CI等等,...
    夜境阅读 703评论 0 1
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,982评论 4 60
  • 有种孤独是 你以为别人都不会忘记你的存在 可是有一天你发现那只是你以为 有种孤独是 一大群人出去 你却无处可去 有...
    潇湘颦儿阅读 421评论 0 6
  • 以前冰箱里塞满了零食,却永远喂不饱自己的胃;咖啡里加了双倍糖,却还是觉得心里空落落。 我们之所以熬夜,可能是身边没...
    长腿程阅读 986评论 0 0