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

如何让Xcode 5在Jenkins从机上运行iOS单元测试?,ios,objective-c,xcode,unit-testing,jenkins,Ios,Objective C,Xcode,Unit Testing,Jenkins,我们一直在使用Jenkins和Xcode插件来运行iOS应用程序的持续集成,包括自动执行和报告单元测试。在Linux机器上使用Jenkins和运行Xcode 4.6.3的Mac从机时,这种方法效果很好 现在,我们希望将设置更新为Xcode 5,以支持针对iOS 7的设置,并遇到以下问题 首先,单元测试根本不会运行,因为我们使用的是来自Xcode 4的RunUnitTests脚本,而Xcode 5不再支持该脚本。按照Xcode的建议,我通过使用单元测试目标的适当方案设置工作区来解决这个问题 然后,

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

现在,我们希望将设置更新为Xcode 5,以支持针对iOS 7的设置,并遇到以下问题

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

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

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

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


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

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

基于“,我已经想出了一个完整的解决方案

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

以下是我用来让这一切正常运作的步骤

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

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

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

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


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

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

    请参阅和的答案。当jenkins被保护时,使用备用命令行从屏幕共享启动它/VNC终端会话是安全的

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

    现在,我面临发布单元测试结果的问题。我使用ocunit2junit,这将解析命令行日志并创建junit xml文件,Jenkins随后将发布这些文件。不知何故,现在运行build命令不再为运行的测试将输出写入控制台,因此ocunit2junit无法解析并创建xml文件.我现在正在研究这个问题。看起来用户必须登录才能运行单元测试。因此,登录和退出VNC仍然必须完成。使用xcode5,我不必手动启动模拟器,但我必须让会话按照您的说明登录。至于单元测试发布,您可能希望看到良好的说明。我不需要这样做在我的例子中,javaws在我的环境中工作。