一尘不染

如何获得Xcode 5在Jenkins从站上运行iOS单元测试?

jenkins

我们一直在使用带有Xcode插件的Jenkins来运行iOS应用程序的持续集成,包括自动执行和报告单元测试。在Linux机器和运行Xcode
4.6.3的Mac从属计算机上使用Jenkins可以很好地工作。

现在,我们正在寻求将安装程序更新为Xcode 5,以支持定位iOS 7,并遇到了以下问题。

首先,单元测试根本不会运行,因为我们使用的是Xcode 5中不再支持的Xcode
4中的RunUnitTests脚本。我按照Xcode的建议,通过为单元设置了合适的方案来解决了工作空间,从而解决了这个问题。测试目标。

然后,我在Jenkins作业的Xcode步骤中配置了自定义xcodebuild参数,test -destination platform=${DESTINATION_PLATFORM},name=${DESTINATION_NAME},OS=${DESTINATION_OS}以使其能够运行单元测试。

如果我运行xcodebuild命令行,即Jenkins的Xcode插件在我自己的计算机上的Terminal中运行,则单元测试将运行,但是当Jenkins作业运行时,它在尝试运行单元测试时会失败或挂起。

我怀疑这是因为使用Xcode 5和测试buildaction而不是RunUnitTests脚本,单元测试现在在iOS
Simulator中运行,这需要交互式会话,并且Jenkins从属进程正在通过Jenkins主服务器(Linux)上的SSH运行。如果我使用Jenkins用于SSH的帐户登录到从属计算机,则可以看到应该运行单元测试时iOS
Simulator启动,但是测试似乎没有运行并且作业挂起。如果我没有登录从机,则Jenkins作业无法运行单元测试。

是否有任何方法可以使iOS单元测试通过SSH在Jenkins从属服务器上运行,如果没有,那么在必须使用Xcode
5构建项目时如何保持单元测试执行自动化的任何建议?


阅读 277

收藏
2020-07-25

共1个答案

一尘不染

根据答案,我提出了一个完整的解决方案。

首先,Mac从站无法使用SSH启动,必须​​使用交互式会话手动启动,然后始终保持登录状态。在我的情况下,奴隶实际上是无头的,所以这是进一步的复杂化。

这是我用来使所有这些操作都可用的步骤。

  1. 在配置了唯一标签的Jenkins主服务器上创建一个新的从属节点(我选择“ xcode-unittests”),并将启动方法设置为“通过Java Web Start启动从属代理”。

  2. 通过屏幕共享(VNC)登录到Mac从属设备并启动从属代理。就我而言,我无法从浏览器启动从属服务器,可能是因为我的浏览器没有运行小程序所需的Java插件。因此,我使用了命令行javaws http://{jenkins-host}/computer/{slave-name}/slave-agent.jnlp。为了使此操作更可靠,我将此命令配置为在每次交互式登录计算机时都在“系统偏好设置”,“用户和组”,“登录项”下自动运行。

  3. 退出屏幕共享而不注销Mac从站。即使没有人实际使用计算机,这也可以使运行从属代理的交互式会话保持活动状态。

为了使单元测试在不提示用户的情况下运行,我还必须sudo DevToolsSecurity -enable在Mac从属计算机上运行。这使Xcode可以与iOS模拟器进行交互,而无需每次都交互式地请求许可。

如果从属计算机重新引导,则必须有人登录Mac从属服务器才能使该从属代理再次运行。因此,我还使基于SSH的从服务器保持活动状态。我将Jenkins作业拆分为多个单独的作业,以构建应用程序和运行单元测试。用于构建应用程序的作业被配置为在基于SSH的从属服务器上运行,而用于运行单元测试的作业被配置为在上述交互式从属节点上运行。这样,如果交互式从属设备出现故障,则仅会影响单元测试,而不会构建产品。

2020-07-25