我怎样才能让Xcode 5在Jenkins slave上运行iOSunit testing?

我们一直使用Jenkins和Xcode插件来运行iOS应用程序的持续集成,包括自动执行和unit testing报告。 这在Linux机器和运行Xcode 4.6.3的Mac从机上使用Jenkins很有效。

现在我们正在考虑更新Xcode 5的设置,以支持目标iOS 7,并遇到以下问题。

首先,unit testing根本不会运行,因为我们使用了Xcode 4中不再支持的RunUnitTests脚本,Xcode 5不再支持这个脚本。我按照Xcode的build议,通过使用单元设置适当的scheme来解决这个问题testing目标。

然后,我使用定制的xcodebuild参数设置为test -destination platform=${DESTINATION_PLATFORM},name=${DESTINATION_NAME},OS=${DESTINATION_OS}来configurationJenkins作业的Xcode步骤,以运行unit testing。

如果我运行xcodebuild命令行,Jenkins的Xcode插件在我自己的机器上运行在terminal上,unit testing运行,但是当Jenkins作业运行时,它在尝试运行unit testing时失败或挂起。

我怀疑这是因为在Xcode 5和testingbuildaction而不是RunUnitTests脚本的情况下,unit testing现在在需要交互式会话的iOS Simulator中运行,而Jenkins从属进程正在通过Jenkins主(Linux)的SSH运行。 如果我使用Jenkins用于SSH的帐户login到slave机器,我可以看到iOS Simulator在unit testing应该运行时启动,但是testing似乎不运行,而且作业挂起。 如果我没有login到奴隶机器,jenkins作业无法运行unit testing。

有没有办法让iOSunit testing通过SSH运行在Jenkins从站上,如果没有,如何在Xcode 5构build项目时如何保持自动执行unit testing的任何build议?

基于coffeebreaks的答案 ,我提出了一个完整的解决scheme。

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

以下是我用来完成所有操作的步骤。

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

  2. 通过屏幕共享(VNC)login到Mac从机并启动从机代理。 在我的情况下,我无法从浏览器启动从服务器,可能是因为我的浏览器没有运行小应用程序所必需的Java插件。 因此,我使用了命令行javaws http://{jenkins-host}/computer/{slave-name}/slave-agent.jnlp 。 为了使这个更健壮一点,我configuration了这个命令,每次我以交互方式在系统首选项,用户和组,login项下login到机器时自动运行。

  3. 退出屏幕共享,无需注销Mac从站。 这使得运行从属代理的交互式会话保持活动状态,即使没有人正在使用机器。

为了让unit testing在没有提示用户的情况下运行,我还必须在Mac slave上运行sudo DevToolsSecurity -enable 。 这允许Xcode与iOS模拟器进行交互,而无需每次都交互地请求这样做。

如果从机重新启动,则必须有人login到Mac从机才能使从机代理再次运行。 出于这个原因,我也离开了我的基于SSH的从机。 我把jenkins的工作分解成独立的工作,用于构build应用程序和运行unit testing。 用于构build应用程序的作业被configuration为在基于SSH的从站上运行,并且用于运行unit testing的作业被configuration为在上述的交互式从站节点上运行。 这样,如果交互式从站closures,只有unit testing受到影响,而不是产品构build。

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

见GBegen和coffeebreaks的答案。 当Jenkins安全时,使用替代命令行从屏幕共享/ VNCterminal会话开始

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

@GBegen说的是正确的,我以前也是这么做的 – 运行模拟器并退出VNC而不注销,但这不可靠。 我现在所做的是有一个脚本,如果它没有运行,实际上启动模拟器。 随着Xcode 5也打破了,但我通过将jenkins用户添加到pipe理组来解决这个问题。