Jenkins 与 Xcode 8 和 iOS 模拟器:"Timed out waiting 120 seconds for simulator to boot, current state is 1"

Jenkins with Xcode 8 and iOS Simulators: "Timed out waiting 120 seconds for simulator to boot, current state is 1"

我在我的机器上安装了本地版本的 Jenkins,一台带有 El Capitan 的 Macbook Pro,在将配置推送到我们的 CI 构建之前,我将其用于开发和调试目的。

最近,我认为 自升级到 Xcode 8 后,我们开始收到此超时错误

iOSSimulator: Timed out waiting 120 seconds for simulator to boot, current state is 1.

要测试的命令很简单xcodebuild,

xcodebuild clean test -scheme UnitTests -destination OS=9.3,name='iPhone 6' -sdk iphonesimulator -configuration Release ONLY_ACTIVE_ARCH=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES -enableCodeCoverage=YES

但由于某些原因,最近开始出现此错误,这确实影响了 运行 此环境的本地版本。

在我的情况下,这几乎完全与我安装 Jenkins 的方式有关。

我最初在 /Library/LaunchDaemons/org.jenkins.plist 中将 Jenkins 安装为根进程。在那个配置中,它在 UserName 键下有我的用户名,并且 运行ning whoami 表明这是正确的,但是 OSX 运行s DaemonsLaunchAgents 是关键。

在那个 plist 中,我还将 SessionCreate 设置为 true,这在这种情况下会导致问题。

这需要编辑/明确设置为 "false" 以确保,<key>SessionCreate</key><false/>,在我的情况下,还应检查用户和组名键是否为正确的登录用户总之,我的 plist 的开头看起来像,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>UserName</key>
    <string>seaders</string>
    <key>GroupName</key>
    <string>staff</string>
    <key>SessionCreate</key>
    <false/>
    <key>EnvironmentVariables</key>
    <dict>
      <key>JENKINS_HOME</key>
      <string>/Users/Shared/Jenkins/Home</string>
    </dict>
    ...

对于我的情况,我需要将 Jenkins 配置 plist 从 root 的 LaunchDaemons 移动到我自己用户的 LaunchAgent 目录,

$ # If jenkins is currently loaded from root, it needs unloading
$ sudo launchctl unload /Library/LaunchDaemons/org.jenkins.plist
$ sudo mv /Library/LaunchDaemons/org.jenkins.plist ~/Library/LaunchAgents/
$ # If jenkins had run under root, and used the regular log paths, we need to change the ownerships of a few places, my full command is
$ sudo chown -R seaders:staff ~/Library/LaunchAgents/org.jenkins.plist /var/log/jenkins/ /Users/Shared/Jenkins/Home
$ launchctl load ~/Library/LaunchAgents/org.jenkins.plist

Jenkins 的整体效果是真正的 运行 作为您的 当前 登录用户,进程是您的,用户名和组名是您的,并且您明确告诉它根本不要创建新会话。

最重要的是,当用 iOS 签名时,运行这样,您应该不再需要解锁钥匙串,但如果你这样做,这就是我们与 Jenkins 一起使用的过于偏执的脚本,

$ security unlock-keychain -p ${USERPASS} ${HOME}/Library/Keychains/login.keychain
$ security list-keychains -s ${HOME}/Library/Keychains/login.keychain
$ security -v list-keychains -s ${HOME}/Library/Keychains/login.keychain
$ security list-keychains # so we can verify that it was added if it fails again
$ security -v unlock-keychain -p ${USERPASS} ${HOME}/Library/Keychains/login.keychain

但同样,如果您在将机器正确设置为开发盒(允许对应用程序进行签名)后 运行进入密钥签名错误,并且Jenkins 是真正的 运行ning 作为您的用户,您实际上应该不再需要解锁钥匙串了。

希望这对那些一直在使用这款手机的人有所帮助CI见鬼。