我们一直在使用Jenkins和Xcode插件来运行iOS应用程序的持续集成,包括自动执行和单元测试报告。这在使用Jenkins的Linux机器和运行Xcode 4.6.3的Mac从机上运行良好。
现在我们正在寻求将设置更新为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构建时如何保持单元测试执行的自动化?
基于 喝咖啡休息时间“ 回答,我想出了一个完整的解决方案。
首先,无法使用SSH启动Mac从站,必须使用交互式会话手动启动,然后始终保持登录状态。在我的情况下,奴隶实际上是无头的,所以这是一个进一步的复杂化。
以下是我用来实现这一切的所有步骤。
在配置了唯一标签的Jenkins主机上创建一个新的从节点(我选择“xcode-unittests”)并将启动方法设置为“通过Java Web Start启动从属代理”。
通过屏幕共享(VNC)登录到Mac从站并启动从属代理。在我的情况下,我无法从浏览器启动从属设备,可能是因为我的浏览器没有运行applet所需的Java插件。因此我使用了命令行 javaws http://{jenkins-host}/computer/{slave-name}/slave-agent.jnlp
。为了使其更加健壮,我将此命令配置为每次在系统首选项,用户和组,登录项下以交互方式登录计算机时自动运行。
退出屏幕共享而不退出Mac从站。这使得运行从属代理的交互式会话保持活动状态,即使没有人实际使用该机器。
为了在不提示用户的情况下运行单元测试,我还必须运行 sudo DevToolsSecurity -enable
在Mac奴隶上。这允许Xcode与iOS模拟器进行交互,而无需每次都以交互方式请求许可。
如果从机重启,有人必须登录到Mac从机才能让奴隶代理再次运行。出于这个原因,我也让我的基于SSH的奴隶也活跃了。我将我的Jenkins工作拆分为单独的工作,用于构建应用程序和运行单元测试。用于构建应用程序的作业配置为在基于SSH的从属设备上运行,并且用于运行单元测试的作业配置为在上述交互式从属节点上运行。这样,如果交互式从属设备发生故障,则只会影响单元测试,而不会影响产品构建。
尝试从Mac从站上的标准终端启动jenkins从站,而不是使用SSH从主站启动。
看到 GBegen 和 喝咖啡休息时间'答案。当Jenkins受到保护时,使用备用命令行从屏幕共享/ VNC终端会话启动它
java -jar slave.jar -jnlpUrl http://jenkins-master:port/computer/jenkins-slave/slave-agent.jnlp -secret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
基于 喝咖啡休息时间“ 回答,我想出了一个完整的解决方案。
首先,无法使用SSH启动Mac从站,必须使用交互式会话手动启动,然后始终保持登录状态。在我的情况下,奴隶实际上是无头的,所以这是一个进一步的复杂化。
以下是我用来实现这一切的所有步骤。
在配置了唯一标签的Jenkins主机上创建一个新的从节点(我选择“xcode-unittests”)并将启动方法设置为“通过Java Web Start启动从属代理”。
通过屏幕共享(VNC)登录到Mac从站并启动从属代理。在我的情况下,我无法从浏览器启动从属设备,可能是因为我的浏览器没有运行applet所需的Java插件。因此我使用了命令行 javaws http://{jenkins-host}/computer/{slave-name}/slave-agent.jnlp
。为了使其更加健壮,我将此命令配置为每次在系统首选项,用户和组,登录项下以交互方式登录计算机时自动运行。
退出屏幕共享而不退出Mac从站。这使得运行从属代理的交互式会话保持活动状态,即使没有人实际使用该机器。
为了在不提示用户的情况下运行单元测试,我还必须运行 sudo DevToolsSecurity -enable
在Mac奴隶上。这允许Xcode与iOS模拟器进行交互,而无需每次都以交互方式请求许可。
如果从机重启,有人必须登录到Mac从机才能让奴隶代理再次运行。出于这个原因,我也让我的基于SSH的奴隶也活跃了。我将我的Jenkins工作拆分为单独的工作,用于构建应用程序和运行单元测试。用于构建应用程序的作业配置为在基于SSH的从属设备上运行,并且用于运行单元测试的作业配置为在上述交互式从属节点上运行。这样,如果交互式从属设备发生故障,则只会影响单元测试,而不会影响产品构建。
尝试从Mac从站上的标准终端启动jenkins从站,而不是使用SSH从主站启动。
看到 GBegen 和 喝咖啡休息时间'答案。当Jenkins受到保护时,使用备用命令行从屏幕共享/ VNC终端会话启动它
java -jar slave.jar -jnlpUrl http://jenkins-master:port/computer/jenkins-slave/slave-agent.jnlp -secret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@GBegen所说的是正确的,我之前也是这样做的 - 运行模拟器并退出VNC而不退出,但这不可靠。我现在做的是有一个脚本,如果它没有运行,实际上启动模拟器。 Xcode 5也破了,但我通过将jenkins用户添加到管理组来修复它。