通过 SSH 在 Xcode 6 下运行 xcodebuild 测试时超时

Posted

技术标签:

【中文标题】通过 SSH 在 Xcode 6 下运行 xcodebuild 测试时超时【英文标题】:Timeout when running xcodebuild tests under Xcode 6 via SSH 【发布时间】:2014-10-12 08:57:49 【问题描述】:

我似乎在将 Xcode6 与 jenkins 集成时遇到问题,我目前有此设置并使用 Xcode 5。

xcode 6 通过 SSH 远程运行,模拟器超时,当我在本地运行时它成功。

命令

xcodebuild -workspace PROJECTNAME.xcworkspace -scheme BGO_Tests -destination 'platform=ios Simulator,name=iPhone 5s' -derivedDataPath ./Build clean test

2014-08-19 10:46:36.591 xcodebuild[33966:381f] iPhoneSimulator:超时等待 >simulator 启动 120 秒,当前状态为 1。

测试失败: 测试目标 BGO_Tests 遇到错误(Timed out waiting 120 seconds for simulator to boot, current state is 1

用最近的 Xcode 6 beta 6 测试

【问题讨论】:

我在使用葫芦运行测试时遇到了类似的问题:github.com/calabash/calabash-ios/issues/251。我想您没有使用葫芦,但原因可能相似。 @Opal 我也在使用葫芦,但两者都有问题,我想先解决单元测试。 我很抱歉,但真的不知道如何帮助你。一会儿我会问我的伙伴。 GM 版本的 Xcode 6 仍然存在。这里也提到了 github.com/facebook/xctool/issues/404 我们Bitrise 使用基于服务器的解决方案,您可以在GitHub 上找到它。看来您必须从从用户 GUI 启动的进程运行 xcode 单元测试(例如使用 ~/Library/LaunchAgents 代理/守护进程)。 【参考方案1】:

我终于设法找到了一个很好的简单解决方案。 JNLP 导致我们的 jenkins 服务器出现许多问题。

SSH 超时的解决方法,通过https://corner.squareup.com/2015/07/ios-build-infrastructure.html

“Mavericks (10.9) 和 Yosemite (10.10) 确定进程是否可以通过访问进程的父级访问可访问性挂钩。通过将 launchd 放入允许的进程列表中,通过 SSH 或 Jenkins 启动的进程可以访问到整个系统的可访问性挂钩。为此,您可以根据此要点修改 TCC 数据库。需要重新启动才能使更改生效。"

#!/bin/bash

# This will add lauchd to the list of allowed processes for accessibility access
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "INSERT or REPLACE INTO access VALUES('kTCCServiceAccessibility','/sbin/launchd',1,1,1,NULL)"

# This outputs the rows in the TCC database
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db 'select * from access'

echo "Restart is required for these changes to take effect"

2016 年 8 月 2 日更新 现在在 Xcode 7.2.1 中修复了这个问题(“命令行工具‘xcodebuild test’将不再超时等待 Simulator.app 启动”)

【讨论】:

【参考方案2】:

注意:设备名称在 Xcode 7 中已更改,因此您不再使用 iPhone 5 (9.1 Simulator) 指定它们,而是使用 iPhone 5 (9.1)

使用xcrun instruments -s 获取当前设备列表,然后您可以使用以下命令预启动它:

xcrun instruments -w "iPhone 5 (9.1)" || echo "(Pre)Launched the simulator."

预启动

我到了一个地步,我在那里提出的建议不再起作用了。除了进行此处提到的更改之外,您还需要启动模拟器 xcodebuild 期望 BEFORE xcodebuild 运行:

# First get the UDID you need
xcrun instruments -s

# Then launch it
open -a "iOS Simulator" --args -CurrentDeviceUDID <sim device UDID>

# and wait some time....
sleep 5

# Then launch your unit tests
xcodebuild [...] -destination 'platform=iOS Simulator,name=<device name matching the UDID>' 

旧帖

此错误已在 Xcode 6.3 及更高版本中修复。如果您在较新的 Xcode 中遇到类似问题,则可能是另一个错误。

Apple 跟进 Bug ID# 18001199:

运行 GUI 不支持 LaunchDaemons 提供的上下文 应用程序。 SSH 服务和 Jenkins 的默认设置是 两者都实现为 LaunchDaemons。在 Xcode 5 的早期版本中 xcodebuild 可以在这种情况下在 iOS 模拟器上运行测试,但是 这从来都不是受支持的配置,正如您所注意到的 从 Xcode 6 开始不再工作。

与 LaunchDaemons 不同,LaunchAgents 提供了一个可以运行的上下文 GUI 应用程序 - 如果用户当时已登录,则有一个窗口 服务器/Aqua 会话。将您的 Jenkins 配置从 从成为 LaunchDaemon 到成为 LaunchAgent 将避免报告的 问题。您还可以使用 launchd 在 iOS 模拟器上运行测试 从 SSH 会话,通过制作 LaunchAgent 和手动 加载/启动它,或使用“launchctl submit”。

好的,在对周围的 cmets 进行了更多挖掘之后(非常感谢Opal),我发现通过 JNLP 启动从站是可行的。

正如许多人提到的,目前无法通过 SSH 运行单元测试,因此在 Apple 修复它之前,您可能希望暂时转向 JNLP 代理。


如果用JNLP连接还是不能解决,试试这个comment中提到的解决方案。

即:在命令行上运行这些:

DevToolsSecurity -启用

须藤 dscl 。 -append /Groups/_developer GroupMembership "user-that-runs-the-sim"

security authorizationdb write system.privilege.taskport is-developer

请参阅参考资料 here 和 here。

我最近发现,如果您安装了新版本的 Xcode 并且不启动它。模拟器可能会再次开始超时。为了解决这个问题,我不得不手动启动 Xcode,并安装它要求的其他工具。

【讨论】:

您有关于使用Java web start() 的说明吗,我有一台Mac Pro,上面运行着3 个虚拟机。所有这些都配置为 Jenkins slave。 Master jenkins 节点运行 linux。 JNLP 是 Web 启动代理 (afaik),请查看 link 了解有关如何设置的更多详细信息。 今天测试了这个答案,非常感谢您的说明,我还必须更新我的 ocunit2junit 版本以支持新的输出。 我会跳过 JNLP 连接建议,直接运行建议的 3 命令修复。这对我很有用,而且我的测试仍然像往常一样通过 SSH 运行。 哦,是吗?可以肯定的是,我直接尝试了这些都无济于事。感谢分享!会再试一次。【参考方案3】:

我遇到了同样的问题。我的工作理论是 OSX 上的 SSH 作为 LaunchDaemon 启动,并且 LaunchDaemons 不允许呈现 UI; Reference.

我能够通过使用 Java Web Start 来启动 Jenkins 从站来解决这个问题。然后我将 Jenkins 从站安装为启动服务。

不幸的是,Jenkins slave 将自己安装为 - 你猜对了 - LaunchDaemon,导致无法启动测试的完全相同的问题; Reference.

我通过将 /System/Library/LaunchDaemons 中的 Jenkins Slave LaunchDaemon plist 和 jar 文件移动到 ~/Library/LaunchAgents 来解决该问题,并更新了 plist 文件中的路径。

这最终让我能够在 OSX jenkins slave 上运行 XCode6 (Beta6) 测试。

【讨论】:

嗨,马克,我使用带有多个 VM 的 Mac Pro 进行构建,这个解决方案看起来非常手动。我曾尝试从另一台 Mac 直接通过 SSH 运行它,但它遇到了同样的问题,所以它不能是詹金斯特有的。还有其他想法吗? 我们Bitrise 使用基于服务器的解决方案,您可以在GitHub 上找到它。实际上,您似乎必须从从用户的 GUI 启动的进程(例如使用 ~/Library/LaunchAgents 代理/守护进程)运行 xcode 单元测试。 我遇到了同样的问题,我将 plist 文件移动到 LaunchAgents,但它仍然无法正常工作。你有没有做任何其他事情来使它工作?谢谢。【参考方案4】:

我最终通过doing the steps here 在 Xcode 5 上解决了这个问题,基本上是在运行:

sudo security authorizationdb write system.privilege.taskport allow

这将消除其中一类身份验证弹出窗口。您还需要运行:

sudo DevToolsSecurity -enable

但是,一旦我升级到 Xcode 6,我现在在尝试通过 SSH 运行 xcodebuild 测试时遇到了无限挂起。只要我登录控制台并从键盘运行它们,它们就会继续运行良好。

【讨论】:

我已经为 Xcode 5 开启了这些设置,问题是我无法让我的 CI 环境在没有 GUI 会话的情况下启动模拟器。 我为此向 Apple 开了一张票。他们承认这是一个问题,并提供了一个解决方法,将 Jenkins 奴隶作为 JNLP 启动——这对我完全没有帮助,因为我在 Thoughtworks Go 上。如果我得到解决方案,会通知您。 @Tad 你有雷达吗?我想用 Apple 进行 DUP。【参考方案5】:

我以前见过这个错误,一种可能是因为您可能从互联网下载了 Xcode6 Beta(不是应用商店,因为它尚不可用),您尝试运行它的机器将显示一个弹出窗口询问您是否真的要从互联网上打开此应用。

当 xcodebuild 尝试启动 iPhone 模拟器应用程序时,也会发生同样的情况。

您可能想尝试的一件事是与机器共享屏幕,然后在该弹出窗口中单击“打开”。

如果还是不行,我会尝试:

    重置模拟器的内容和设置 重启机器并确保启动时没有模拟器在运行(您可以选择重启时不重新打开任何应用)

【讨论】:

嗨迈克尔,我已经尝试了所有这些选项,不幸的是我可以通过 vnc 和命令行运行 xcode 6 和模拟器,只是 ssh xcodebuild 无法正常工作(模拟器无法启动)。跨度>

以上是关于通过 SSH 在 Xcode 6 下运行 xcodebuild 测试时超时的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 7.2 不加载通过 Cocoapods 安装的库中的类

Xcode 5 在没有调试器的情况下不从标准输入读取

Jenkins Xcode 构建 alamofire 错误

是否可以在 High Sierra (10.13.6) 上安装 Xcode 10.2?

iOS,Xcod7/8,iOS使用修改点

Xcode 中的 OpenCV C++ 错误