11

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

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

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

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

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

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

有没有办法让 iOS 单元测试通过 SSH 在 Jenkins 从属设备上运行,如果没有,当项目必须使用 Xcode 5 构建时,关于如何继续自动执行单元测试的任何建议?

4

4 回答 4

11

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

首先,Mac slave 无法使用 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 的从属节点上运行,而用于运行单元测试的作业被配置为在上述交互式从属节点上运行。这样,如果交互式从站出现故障,只有单元测试会受到影响,产品构建不会受到影响。

于 2013-09-24T19:29:33.270 回答
4

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

于 2013-09-23T06:27:52.903 回答
1

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

java -jar slave.jar -jnlpUrl http://jenkins-master:port/computer/jenkins-slave/slave-agent.jnlp -secret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
于 2013-10-01T04:40:59.930 回答
0

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

于 2013-09-30T20:13:18.120 回答