【问题标题】:How can I get Xcode 5 to run iOS unit tests on a Jenkins slave?如何让 Xcode 5 在 Jenkins slave 上运行 iOS 单元测试?
【发布时间】:2013-09-26 02:18:26
【问题描述】:

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

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

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

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

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

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

有什么方法可以让 iOS 单元测试通过 SSH 在 Jenkins 从站上运行,如果没有,有什么建议可以在必须使用 Xcode 5 构建项目时继续自动执行单元测试?

【问题讨论】:

    标签: ios objective-c xcode unit-testing jenkins


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      基于coffeebreaks'answer,我想出了一个完整的解决方案。

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

      这是我用来完成这一切的步骤。

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

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

      3. 在不注销 Mac 从属设备的情况下退出屏幕共享。这使运行从代理的交互式会话保持活动状态,即使实际上没有人使用该机器。

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

      如果从属机器重新启动,则必须有人登录到 Mac 从属机器才能让从属代理再次运行。出于这个原因,我也让我的基于 SSH 的从站处于活动状态。我将我的 Jenkins 作业拆分为单独的作业,用于构建应用程序和运行单元测试。用于构建应用程序的作业被配置为在基于 SSH 的从属节点上运行,而用于运行单元测试的作业被配置为在上述交互式从属节点上运行。这样,如果交互式从站出现故障,只有单元测试会受到影响,产品构建不会受到影响。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 现在我面临发布单元测试结果的问题。我使用 ocunit2junit,它会解析命令行日志并创建 junit xml 文件,然后 Jenkins 会发布这些文件。现在以某种方式运行 build 命令不再将输出写入控制台以进行测试,因此 ocunit2junit 无法解析它并创建 XML 文件。我现在正在调查
        • 看起来用户必须登录才能运行单元测试。所以登录退出VNC还是要做的。
        • 使用 xcode5,我不必手动启动模拟器,但我必须按照您的说明让会话保持登录状态。至于您的单元测试发布,您可能希望看到stackoverflow.com/q/18995187/10223
        【解决方案4】:

        请参阅 GBegencoffeebreaks 的答案。当 Jenkins 得到保护时,使用备用命令行从屏幕共享/VNC 终端会话启动它

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

        【讨论】:

        • 好笔记。在我的情况下我不需要这个,因为 javaws 在我的环境中工作。
        猜你喜欢
        • 2013-03-26
        • 2013-09-27
        • 2021-11-25
        • 2014-03-28
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        相关资源
        最近更新 更多