xcodebuild运行测试无头?

时间:2014-07-23 14:06:24

标签: unit-testing xcodebuild headless

众所周知,在iOS上运行测试的唯一方法是使用模拟器。我的问题是我们正在运行jenkins并且iOS构建在从属服务器上运行(通过SSH),因此运行xcodebuild无法启动模拟器(因为它运行无头)。我已经读过某个地方应该可以使用SimLauncher(gem sim_launcher)。但我找不到有关如何使用xcodebuild进行设置的任何信息。欢迎任何指示。

2 个答案:

答案 0 :(得分:2)

无头和xcodebuild混合不好。请考虑这个替代方案:

您可以将从属节点配置为通过jnlp(webstart)启动。我使用带有.command扩展名的bash脚本作为登录项(系统偏好设置 - >用户 - >登录项),其中包含以下内容:

#!/bin/bash

slave_url="https://gardner.company.com/jenkins/jnlpJars/slave.jar"

max_attempts=40 # ten minutes
echo "Waiting to try again. curl returneed $rc"
curl -fO "${slave_url}" >>slave.log
rc=$?
if [ $rc -ne 0 -a $max_attempts -gt 0 ]; then
  echo "Waiting to try again. curl returneed $rc"
  sleep 5
  curl -fO "${slave_url}" >>slave.log
  rc=$?
  if [ $rc -eq 0 ]; then
    zip -T slave.jar
    rc=$?
  fi
  let max_attempts-=1
fi

# Simulator
java -jar slave.jar -jnlpUrl https://gardner.company.com/jenkins/computer/buildmachine/slave-agent.jnlp -secret YOUR_SECRET_KEY

构建用户设置为自动登录。您可以通过执行以下命令查看slave.jar应用程序的参数:

gardner:~ buildmachine$ java -jar slave.jar --help
"--help" is not a valid option
java -jar slave.jar [options...]
 -auth user:pass                 : If your Jenkins is security-enabled, specify
                                   a valid user name and password.
 -connectTo HOST:PORT            : make a TCP connection to the given host and
                                   port, then start communication.
 -cp (-classpath) PATH           : add the given classpath elements to the
                                   system classloader.
 -jar-cache DIR                  : Cache directory that stores jar files sent
                                   from the master
 -jnlpCredentials USER:PASSWORD  : HTTP BASIC AUTH header to pass in for making
                                   HTTP requests.
 -jnlpUrl URL                    : instead of talking to the master via
                                   stdin/stdout, emulate a JNLP client by
                                   making a TCP connection to the master.
                                   Connection parameters are obtained by
                                   parsing the JNLP file.
 -noReconnect                    : Doesn't try to reconnect when a communication
                                   fail, and exit instead
 -proxyCredentials USER:PASSWORD : HTTP BASIC AUTH header to pass in for making
                                   HTTP authenticated proxy requests.
 -secret HEX_SECRET              : Slave connection secret to use instead of
                                   -jnlpCredentials.
 -slaveLog FILE                  : create local slave error log
 -tcp FILE                       : instead of talking to the master via
                                   stdin/stdout, listens to a random local
                                   port, write that port number to the given
                                   file, then wait for the master to connect to
                                   that port.
 -text                           : encode communication with the master with
                                   base64. Useful for running slave over 8-bit
                                   unsafe protocol like telnet

gardner:~ buildmachine$ 

有关OSX从站以及如何启动主站的讨论,请参阅此Jenkins错误:https://issues.jenkins-ci.org/browse/JENKINS-21237

答案 1 :(得分:2)

Erik - 我最终做了documented here项目:

基本上:

第一个问题是,您必须让运行构建的用户也登录到该Mac构建计算机上的控制台。它需要能够弹出模拟器,并且如果你没有用户登录就会失败 - 因为如果没有显示器它就无法完全无头。

其次,XCode Developer工具需要提升权限才能执行Unit测试的所有任务。有时您可能会错过看到它,但如果没有这些,模拟器将为您提供永不清除的身份验证提示。

第一个解决方案(在Mavericks上)是运行:

sudo security authorizationdb write system.privilege.taskport allow

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

sudo DevToolsSecurity --enable

Per Apple关于此工具的手册页:

  

在普通用户系统上,第一次在给定的登录会话中   任何这样的Apple代码签名调试器或性能分析工具   用于检查用户进程之一,查询用户   授权的管理员密码。 DevToolsSecurity工具   更改授权策略,以便成为其成员的用户   管理员组或_developer组不需要输入   使用Apple代码签名调试器的附加密码   绩效分析工具。

唯一的问题是,一旦我升级到Xcode 6,这些事情似乎就会被打破。回到绘图板....