【问题标题】:xcodebuild running tests headless?xcodebuild 无头运行测试?
【发布时间】:2014-07-23 14:06:24
【问题描述】:

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

【问题讨论】:

    标签: unit-testing xcodebuild headless


    【解决方案1】:

    Headless 和 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 slaves 和 master 如何启动的讨论,请查看这个 Jenkins 错误:https://issues.jenkins-ci.org/browse/JENKINS-21237

    【讨论】:

    • 嗨 Gardner,我会在有时间的时候尝试这种方法并批准它是否有效 :)
    • @Erik 这个答案对你有用吗?我即将设置类似的东西。
    • 我们没有让它工作,所以我们设置 jenkins 在 windows 管理器中运行
    • @Erik 你能详细说明你的设置吗?
    【解决方案2】:

    Erik - 我最终完成了 documented here 的项目:

    基本上:

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

    其次,XCode 开发工具需要提升权限才能执行单元测试中的所有任务。有时你可能会错过它,但没有这些,模拟器会给你一个永远不会清除的身份验证提示。

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

    sudo security authorizationdb write system.privilege.taskport allow
    

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

    sudo DevToolsSecurity --enable
    

    根据 Apple 关于此工具的手册页:

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

    唯一的问题是,一旦我升级到 Xcode 6,这些相同的东西似乎就坏了。回到绘图板......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-01
      • 2015-01-30
      • 2022-08-04
      • 2011-07-21
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      相关资源
      最近更新 更多