做者 : iOS Team 高祥git
在App开发周期中, 须要不断的对develop上面的代码进行build、Test、Analyze等一些列的操做, 保证在主干分支上的代码永远是在一种可发布的状态,可是这些操做是简单可是很耗时的一个操做,所以采用持续集成的方案。 所谓持续集成,就是把编译、测试、分析、打包、报告结果的过程交给持续集成服务器来完成,这样能大量省去了开发的时间。shell
iOS的集成方案有不少,有最原始的利用Xcodebuild来打包工具,也有利用Jenkins来作持续集成。而咱们采用的是Apple 一直支持的 Xcode server来处理。 它由以下优势:json
网上一搜Xcode build 持续集成,总能搜到不少不少的版本,有的甚至是Xcode5 甚至Xcode6的,可是面对跟如今有很大的区别。所以提供以下两中教程。(PS: 在实际处理中,实际官方文档才是最全面的)api
教程一: Xcode 8 或者 Xcode8如下xcode
教程二: Xcode9bash
也许你会说,这算是嘛事啊,让看官方文档。由于官方文档对各类配置有很详细的解释。 我看了不少关于Xcode Server 持续集成的文档,步骤基本如出一辙,没有详细说明。看完后 你仍是一脸懵逼。甚至于,有不少仍是是错的,看完更懵逼。所以强烈推荐官方的。服务器
由于教程步骤等,官方很详细,推荐你们去阅读如下。可是坑可就是千奇百怪的。这才是重点。app
问题描述: 当一切设置好以后,取运行ezbuy项目,发现跑着跑着就被cancel了(非人为) 解决方式 在Xcode9 -> Prefrences -> Server & Bots 运维
问题描述 咱们集成Xcode Server最终为了是将最后生成的iPA上传到咱们的运维服务去,在最后执行所写的脚本的时候,须要取到对应的iPA路径,其路径是IPA Name来肯定的,可是若是IPA名称中带了“空格",处理起来相对会麻烦一点。 解决方式 方式1: 修改iPA的名字,将 ezbuy EnterPrise UAT.ipa修改成ezbuy_EnterPrise_UAT.ipa。 对应的脚本以下ssh
#!/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,修改为不带空格名称便可。
在编写程序中,须要一步步来验证,为了获取到最后的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脚本),而后检查,上传到咱们的服务器。
现象: 这个问题,很难复现,若是你出现了,恭喜你。
Xcode Server setup failed (starting api server) Try clicking Choose Xcode and selecting a newer version of Xcode
复制代码
针对这个问题,StackOverFlow和 苹果社区都没有找到答案,卸载Xcode与Server从新安装都不能够,最后系统重装,才解决了。
若是你碰到了 有对应的解决办法,还但愿反馈一下.
网上有看处处理方式,可是无效,若是你出现了这个问题,能够在终端执行试试 sudo xcrun xcscontrol --reset sudo /Applications/Xcode.app/Contents/Developer/usr/bin/xcscontrol --reset
只要在脚本之中,写上下面代码,就会将系统全部的参数显示出来,so easy
set
复制代码
由于咱们的 ezbuy Enterprise UAT 是企业版本,在Xcode8之中,配置至关复杂,在Xcode9之中,只要配置以下(这也是几经折腾,选择Xcode9的缘由)
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><none></string>
<key>teamID</key>
<string>你本身的TeamID</string>
<key>uploadSymbols</key>
<true/>
<key>stripSwiftSymbols</key>
<true/>
</dict>
</plist>
复制代码
具体各类参数信息,可在mac 终端,输入:
xcodebuild --help
便可看到详细信息
Bot效果截图
Bot after脚本
若是对环境变量不熟悉的,推荐在脚本中打印 set,而后详细了解一下。