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
- Step1: 查看Xcode8以下的教程,虽然Xcode9集成很简单,但是为了更好理解各种参数意义,推荐去看看。
- Step2: 根据WWDC2017的What's New in Signing for Xcode and Xcode Server从07:37开始。
也许你会说,这算是嘛事啊,让看官方文档。因为官方文档对各种配置有很详细的解释。 我看了很多关于Xcode Server 持续集成的文档,步骤基本一模一样,没有详细说明。看完后 你还是一脸懵逼。甚至于,有很多还是是错的,看完更懵逼。因此强烈推荐官方的。
三、踩的各种坑
因为教程步骤等,官方很详细,推荐大家去阅读以下。但是坑可就是千奇百怪的。这才是重点。
坑1: 跑着跑着就歇火了
问题描述:
当一切设置好之后,取运行ezbuy项目,发现跑着跑着就被cancel了(非人为)
解决方式
在Xcode9 -> Prefrences -> Server & Bots
坑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,修改成不带空格名称即可。
坑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
针对这个问题,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的原因)
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,然后详细了解一下。
Xcode Server持续集成的更多相关文章
- Jenkins持续集成相关文章整理
构建iOS持续集成平台(一)——自动化构建和依赖管理 构建iOS持续集成平台(二)——测试框架 构建iOS持续集成平台(三)——CI服务器与自动化部署 使用Jenkins搭建iOS开发的CI服务器 一 ...
- 持续集成(CI – Continuous Integration)
持续集成(CI – Continuous Integration) 在传统的软件开发中,整合过程通常在每个人完成工作之后.在项目结束阶段进行.整合过程通常需要数周乃至数月的时间,可能会非常痛苦.持续集 ...
- 持续集成:CruiseControl.NET + VisualSVN.Server
刚换了工作,有需要搭建一套持续集成的平台,做一下总结. 首先是我用到的工具: 上面缺少了Microsoft Fxcop,可以用来做代码校验,不过实际情况暂时还没有用到.主要的需求目前是,使用已发布的稳 ...
- 搭建你的持续集成server - CruiseControl step by step(1)
CruiseControl是CIserver的老者,诞生已是多年,在很多方面,CruiseControlserver已经成为持续集成实践的同义词.而如今,CruiseControl已发展成为一个家族式 ...
- .NET持续集成与自动化部署之路第二篇——使用NuGet.Server搭建公司内部的Nuget(包)管理器
使用NuGet.Server搭建公司内部的Nuget(包)管理器 前言 Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基 ...
- Jenkins+GitHub+Xcode+fir搭了一个持续集成环境
enkins+GitHub+Xcode+fir搭了一个持续集成环境 字数826 阅读5699 评论44 喜欢49 原文链接 Coding Duck 今天用Jenkins+GitHub+Xcode+fi ...
- 【iOS】Jenkins Gitlab持续集成打包平台搭建
Jenkins Gitlab持续集成打包平台搭建 SkySeraph July. 18th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点: ...
- Jenkins Gitlab持续集成打包平台搭建
http://www.cnblogs.com/skyseraph/p/5695021.html 1. 相关概念 Jenkins Jenkins,一个用Java编写的开源的持续集成工具,提供了软件开发的 ...
- 使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境
使用jenkins+calabash+cocoapods搭建ios持续集成环境 持续集成 持续集成到底是什么呢?依据敏捷大师Martin Fowler的定义: 持续集成是一种软件开发实践. 在持续集成 ...
随机推荐
- angular5 给元素添加自定义属性
今天尝试给一个a 标签添加一个自定义属性,用于存放相关数据,但是angular templates 编译不通过. <a href="javascript:void(0);" ...
- 磁盘管理|df、du|分区 fdisk |格式化
3.磁盘管理 3.1命令df ·用于查看已挂载磁盘的总容量,使用容量,剩余容量等. -i:查看inodes的使用情况 -h:使用合适的单位显示 -k:以KB为单位显示 -m:以MB为单位显示 3.1. ...
- unsigned char bcd串乱码问题解决
unsigned char bcd[13]; ...... string bcdstr; for(int i=0;i < 12;i++) { bcdstr=FormatString(" ...
- sql query执行的顺序
第一, from, 选择或者join多个表得到基础数据表,所以,联结是第一步要执行的操作,它在获取最基础的数据表: 第二,where,过滤掉基础数据表中不符合条件的行,得到后续操作的数据表: 第三, ...
- lb开金矿 QDUOJ 数论
lb开金矿 QDUOJ 数论 原题链接,点我进去 题意 大家都知道lb有n个小弟(编号从2到n+1),他们可以按照规则传递信息:某天编号为i的小弟收到信息后,那么第二天他会给编号为j的小弟传达信息,其 ...
- 题解 CF1140D 【Minimum Triangulation】
题意:求将一个n边形分解成(n-2)个三边形花费的最小精力,其中花费的精力是所有三角形的三顶点编号乘积的和(其中编号是按照顶点的顺时针顺序编写的) 考虑1,x,y连了一个三角形,x,y,z连了一个三角 ...
- yii日志保存机制
一.修改yii框架的配置文件(main.php) 'log' => array( 'class' => 'CLogRouter', 'routes' => array( array( ...
- Scrapy 教程(九)-日志系统
最新版本的 scrapy 已经废弃了 scrapy.log 的使用,赞成显示调用python标准日志记录. Python 内建日志系统 import logging ### python 内建 log ...
- js实现404页面倒计时跳转
<script type="text/javascript"> (function(){ var i=5,timer=null,number=document.getE ...
- SEM和SEO的区别?
https://www.zhihu.com/question/20307058 SEM在营销中扮演的角色:进攻 搜索引擎营销,即SEM(Search Engine Marketing),是基于搜索引擎 ...