问题 如何让Xcode 5在Jenkins奴隶上运行iOS单元测试?


我们一直在使用Jenkins和Xcode插件来运行iOS应用程序的持续集成,包括自动执行和单元测试报告。这在使用Jenkins的Linux机器和运行Xcode 4.6.3的Mac从机上运行良好。

现在我们正在寻求将设置更新为Xcode 5以支持目标iOS 7并遇到以下问题。

首先,单元测试根本不会运行,因为我们使用Xcode 4中不再支持的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模拟器中运行,这需要交互式会话,Jenkins从属进程正在通过Jenkins大师(Linux)的SSH运行。如果我使用Jenkins用于SSH的帐户登录到奴隶机器,我可以看到iOS模拟器在单元测试运行时启动,但测试似乎没有运行且作业挂起。如果我没有登录到从属机器,则Jenkins作业无法运行单元测试。

有没有办法让iOS单元测试通过SSH在Jenkins从站上运行,如果没有,有什么建议在项目必须使用Xcode 5构建时如何保持单元测试执行的自动化?


7352
2017-09-20 16:00


起源



答案:


基于 喝咖啡休息时间回答,我想出了一个完整的解决方案。

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

以下是我用来实现这一切的所有步骤。

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

  2. 通过屏幕共享(VNC)登录到Mac从站并启动从属代理。在我的情况下,我无法从浏览器启动从属设备,可能是因为我的浏览器没有运行applet所需的Java插件。因此我使用了命令行 javaws http://{jenkins-host}/computer/{slave-name}/slave-agent.jnlp。为了使其更加健壮,我将此命令配置为每次在系统首选项,用户和组,登录项下以交互方式登录计算机时自动运行。

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

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

如果从机重启,有人必须登录到Mac从机才能让奴隶代理再次运行。出于这个原因,我也让我的基于SSH的奴隶也活跃了。我将我的Jenkins工作拆分为单独的工作,用于构建应用程序和运行单元测试。用于构建应用程序的作业配置为在基于SSH的从属设备上运行,并且用于运行单元测试的作业配置为在上述交互式从属节点上运行。这样,如果交互式从属设备发生故障,则只会影响单元测试,而不会影响产品构建。


11
2017-09-24 19:29





尝试从Mac从站上的标准终端启动jenkins从站,而不是使用SSH从主站启动。


4
2017-09-23 06:27





看到 GBegen 和 喝咖啡休息时间'答案。当Jenkins受到保护时,使用备用命令行从屏幕共享/ VNC终端会话启动它

java -jar slave.jar -jnlpUrl http://jenkins-master:port/computer/jenkins-slave/slave-agent.jnlp -secret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

1
2017-10-01 04:40



好注意。因为javaws在我的环境中工作,所以我不需要这个。 - GBegen


答案:


基于 喝咖啡休息时间回答,我想出了一个完整的解决方案。

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

以下是我用来实现这一切的所有步骤。

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

  2. 通过屏幕共享(VNC)登录到Mac从站并启动从属代理。在我的情况下,我无法从浏览器启动从属设备,可能是因为我的浏览器没有运行applet所需的Java插件。因此我使用了命令行 javaws http://{jenkins-host}/computer/{slave-name}/slave-agent.jnlp。为了使其更加健壮,我将此命令配置为每次在系统首选项,用户和组,登录项下以交互方式登录计算机时自动运行。

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

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

如果从机重启,有人必须登录到Mac从机才能让奴隶代理再次运行。出于这个原因,我也让我的基于SSH的奴隶也活跃了。我将我的Jenkins工作拆分为单独的工作,用于构建应用程序和运行单元测试。用于构建应用程序的作业配置为在基于SSH的从属设备上运行,并且用于运行单元测试的作业配置为在上述交互式从属节点上运行。这样,如果交互式从属设备发生故障,则只会影响单元测试,而不会影响产品构建。


11
2017-09-24 19:29





尝试从Mac从站上的标准终端启动jenkins从站,而不是使用SSH从主站启动。


4
2017-09-23 06:27





看到 GBegen 和 喝咖啡休息时间'答案。当Jenkins受到保护时,使用备用命令行从屏幕共享/ VNC终端会话启动它

java -jar slave.jar -jnlpUrl http://jenkins-master:port/computer/jenkins-slave/slave-agent.jnlp -secret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

1
2017-10-01 04:40



好注意。因为javaws在我的环境中工作,所以我不需要这个。 - GBegen


@GBegen所说的是正确的,我之前也是这样做的 - 运行模拟器并退出VNC而不退出,但这不可靠。我现在做的是有一个脚本,如果它没有运行,实际上启动模拟器。 Xcode 5也破了,但我通过将jenkins用户添加到管理组来修复它。


0
2017-09-30 20:13



现在我面临发布单元测试结果的问题。我使用ocunit2junit,它将解析命令行日志并创建Jenkins随后将发布的junit xml文件。现在以某种方式运行build命令不再将输出写入控制台以运行测试,因此ocunit2junit无法解析它并创建XML文件。我现在正在调查 - RPM
看起来用户必须登录才能运行单元测试。因此,登录和退出VNC仍然必须完成。 - RPM
使用xcode5,我不必手动启动模拟器,但我必须按照您的说明离开会话。至于您的单元测试发布,您可能希望看到 stackoverflow.com/q/18995187/10223 - GBegen