首页 文章

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

提问于
浏览
11

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

现在我们正在寻求将设置更新为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构建时自动执行单元测试的建议?

4 回答

  • 11

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

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

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

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

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

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

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

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

  • 1

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

  • 4

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

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

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

相关问题