Xcode服务器:for iOS连续交付的十大限制


就在苹果公司宣布Xcode Sever(又名XCS)内置Xcode 9之后,我写了一篇关于如何设置Xcode服务器以便iOS与Xcode 9持续集成的详细文章。这篇文章还有一个展示Xcode服务器新特性的示例项目。这篇文章提到了一些关键特性,包括内置服务器、无头并行测试、自动代码签名和设备配置。这篇文章最初发表在我的personal blog并转贴于MediumDZone还有。然而,过了一段时间,我开始收到关于Xcode服务器实现iOS应用连续交付的局限性的评论。我在使用Xcode服务器进行配置项时也遇到了一些问题。其中有些是已知的,有些是未知的。我认为值得分享;在这篇文章中,我们将讨论Xcode服务器的最大限制。

Xcode服务器的当前限制

这里列出了与Xcode服务器相关的各种问题here但是我们将讨论Xcode 9和Xcode服务器的前10个问题。请注意,所有这些问题都是在写这篇文章的时候出现的。

1.拉请求测试

目前,还没有办法测试GitHubpull requests。许多配置项服务器,如TravisCI, 一旦创建了拉取请求,就可以构建iOS项目,这样开发人员就可以获得早期反馈。然而,对于Xcode服务器,目前这是不可能的。我的印象是Xcode服务器不仅仅是为GitHub构建的,但是考虑到Xcode 9与GitHub的紧密集成,苹果也应该考虑这个问题。这是Xcode服务器中一个严重缺失的特性。没有这个功能,这个产品就不完整。

以前,有一些工具可以提供解决方法。工具,如Buildasaur或者XBot Builder可以用来监视GitHub存储库的拉请求。一旦创建了拉请求,这些工具就可以用来创建Xcode Bots,并用结果更新GitHub。然而,事情已经发生了很大变化。这些工具不再适用于最新版本的Xcode服务器。

另一种解决方法是创建一个GitHub网络钩子来观察拉请求,使用Xcode服务器应用编程接口创建Xcode僵尸工具,并用集成的结果更新GitHub拉请求。这涉及到繁重的脚本编写。最令人沮丧的部分是用户现在不能用Xcode服务器APIs创建Xcode机器人,我们将在后面讨论。因此,目前没有测试GitHub拉请求的解决方法

2.用Xcode服务器应用编程接口创建机器人

目前,Xcode服务器在使用Xcode服务器应用编程接口的开机自检请求创建机器人时抛出了一个内部服务器错误。我和其他一些用户也面临着同样的问题。如果这是真正的问题,那么我会说这是最关键的问题。当我们不能使用开机自检请求创建机器人时,Xcode服务器应用编程接口的使用变得毫无意义。这也意味着我们不能使用自定义脚本测试拉请求。

3.可量测性

在企业级使用Xcode服务器的主要问题之一是它的可伸缩性和分布性。Xcode服务器似乎是一个小团队的好选择,他们只有一台专用的macOS服务器或几台服务器。然而,用Xcode服务器管理多台macOS服务器会有点棘手。Xcode服务器有几个限制:

  • Xcode Bots不能动态分配给服务器。
  • 管理多个macOS服务器需要配置管理;手动设置将是一场噩梦。
  • 有了Xcode服务器,我们就不能利用空闲的服务器和共享繁忙服务器的负载。

如果Xcode服务器可以给我们动态分配僵尸服务器的灵活性,那么这将是非常可扩展的方法。

4.缺少将IPA上传到iTunes Connect的支持

目前,当Xcode Bot选择存档选项时,Xcode服务器会创建一个存档和IPA文件,该文件可以安装在设备上或上传到iTunes Connect。然而,这个过程就此结束。没有内置的选项将IPA上传到iTunes Connect进行测试飞行测试。似乎有一个选项允许我们向应用商店提交一个档案,但是我们错过了测试飞行步骤。

作为解决方法,我们必须下载IPA文件,并使用应用程序加载器、本地Xcode或agvtool命令行实用程序手动将其上传到iTunes Connect。之后,该构建将可用于测试飞行的测试。

5.超级机器人备份

Xcode服务器没有任何干净的机制来维护Xcode僵尸工具,以防重置配置项服务器。就我个人而言,我喜欢定期拆除和重建苹果迷你电脑,这样我们就可以避免在服务器上积累的混乱。此外,在Xcode升级的情况下,我们需要备份更新版本的机器人。Xcode服务器也有重置所有数据的选项,但是备份机器人并不简单。

理想情况下,我们可以编写脚本或使用配置管理工具,如Ansible或者Chef重新创建整个环境,包括最近配置的bot创建。然而,这目前无法实现,因为我们被Bot创建问题所阻碍。有人提到,我们可以复制整个/Library/Developer/XcodeServer目录,并将其粘贴到新版本中。我不完全确定这种方法有多干净,因为数据库、用户或其他方面可能会有一些变化。相关的线索是here

6.保留最后几个集成

构建、测试和归档iOS应用程序的Xcode僵尸程序占用了大量磁盘空间。根据我的经验,每次整合至少需要500MB。这意味着我们有可能很快用完磁盘空间。相关的线索是here

理想情况下,应该有一个机制来保留最后X个集成,并删除所有其他的,像其他配置项服务器一样,做同样的事情。他们保留最后几个版本和固定/最喜欢的版本,并清理其他版本。如果Xcode服务器也有类似的功能就好了。

作为解决方法,我们必须使用Xcode服务器应用编程接口手动删除集成,或者删除Xcode服务器上的集成资产。

7.缺乏第三方集成

Xcode服务器具有添加预集成和后集成脚本的功能。通过使用这个特性,我们可以与任何可能的第三方服务集成,比如Slack、HipChat、GitHub、Fabric等等。这种方法非常耗时,大多数iOS开发人员不具备编写这些集成的脚本技能。它包括分析第三方应用编程接口和用另一种语言如Bash、Ruby或Python编写脚本。我不确定其他第三方,但苹果肯定应该考虑与GitHub整合。

8.在GitHub中标记构件

我的一条评论blog post声明Xcode服务器缺乏在GitHub上标记构建的能力。由于Xcode服务器没有任何第三方集成,所以不可能在GitHub上标记构建,但是只需一点点脚本就可以轻松实现。

9.共享设置配置文件

当我们有多台Xcode服务器机器时,有时很难跟踪配置文件,并且Xcode服务器无法创建归档。一些用户已经遇到了问题,并且不完全确定当他们允许Xcode服务器管理所有证书和配置文件时缺少了什么。Xcode服务器可以通过单击“允许Xcode服务器管理我的证书和配置文件”来自动处理代码签名,但有时您可能会收到“存档失败”错误。这可能是因为Xcode服务器没有足够的详细信息来提供对iOS应用进行代码签名所需的配置文件。提到了一个黑客here我们需要关闭自动代码签名并使用下载所有的配置文件Fastlane sigh在预集成脚本中。

10.多模拟器并行测试问题

关于Xcode服务器的并行测试特性有各种各样的问题。在Xcode服务器上选择多个模拟器进行测试时,构建失败,但测试在本地通过。这tweet 显示错误,显示“模拟器的未知状态。”我也遇到过类似的错误,我通过只使用一个模拟器解决了这个问题。

结论

虽然Xcode服务器现在是iOS应用程序持续集成和运行的一个很好的解决方案,但是仍然有一些限制让Xcode服务器用户感到痛苦,这也需要考虑。这些限制是有变通办法的,但如果能被苹果公司解决就太好了。你有什么经历?我在这篇文章中错过了Xcode服务器带给你的痛苦,你有没有面对过?分享下面的评论。