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.pngScheme: 选择要构建哪个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目录,存放的是从仓库中拉到的代码。
接下来
现在虽然可以满足基本的持续集成需求,但是缺少了重要的邮件通知功能。在下一篇中,会讲述如何配置邮件功能,来对开发人员和测试人员进行通知。
网友评论
http://www.iosprogrammer.tech/2018/03/06/XCode-Server-CI/
试了下 这样 curl -F "file= "${XCS_PRODUCT}"" \ 也不行, 好像XCS_PRODUCT获取到的为空
另外,你的IPA文件多大?由于XCS_PRODUCT会被删除,所以我怀疑可能是上传需要的时间比较长,然后文件被删了,导致失败?
脚本要这样写:
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对应的路径生成。
至于具体的值,你可以在script里打印这个环境变量,理解的就更深了。