iOS 测试 jenkins 通过 xcode 命令执行 ios 自动化打包的奇怪问题

杭州-BTJF-Teddy · 2015年12月11日 · 最后由 dong09000 回复于 2018年11月21日 · 3200 次阅读

这几天在做 ios 自动化打包。

现状

现在部署了两个 jenkins,一个在 linux 上,作为 master,另一个在 mac 上,作为 slave。在 master 上创建了 job,分发到 slave 上执行。命令很简单。

xcodebuild clean -workspace './AiCardForStaff.xcworkspace' -scheme 'AiCardForStaff' -configuration TestEv -archivePath build/AiCardForStaff.xcarchive archive

xcodebuild clean -exportArchive -exportFormat IPA -archivePath build/AiCardForStaff.xcarchive -exportPath build/AiCardForStaff.ipa -exportProvisioningProfile "XC: com.icar.staff"

问题:

job 分发到 slave 上执行时,提示签名错误:

The following build commands failed:
    CodeSign /Users/taoy/Library/Developer/Xcode/DerivedData/AiCardForStaff-ahaekiszslilvjcifzgyqjrabwkm/Build/Intermediates/ArchiveIntermediates/AiCardForStaff/InstallationBuildProductsLocation/Applications/AiCardForStaff.app

但是,我在 slave 的 jenkins 上单独配置一个 job,在 mac 本机上执行,就能成功。在 mac 机器上执行该命令也能成功,但是其他电脑 ssh 过去 mac 机器上,在终端下执行该命令也是同样失败了。尝试过把命令放在.sh 文件中,jenkins 去调用,也是同样的理由失败。

推测:

难道有啥机制限制外部电脑来执行 xcodebuild 命令?

后续:
有网友怀疑是 keychain 的证书签名问题。因为正常打包时,第一次也会提示是否允许访问 keychain。
准备尝试一下 jenkins 的 xcodebuild integration 插件。希望能搞定。

共收到 5 条回复 时间 点赞

但是其他电脑 ssh 过去 mac 机器上,在终端下执行该命令也是同样失败了

检查下是不是有些命令在远程 ssh 下不会自动执行?我们这里也是 mac jenkins 作为 slave ,打包没有任何问题。我们的用法是在 mac 上有一个 shell 脚本,里面调用 xcodebuild 的方式是:

bash -c "xcodebuild ${SETTING}"

${SETTING} 就是构建需要的那些参数。

感谢 @ 北京-My 提供的帮助:
根本原因是 Jenkins,ssh 方式到 slave 机上,默认是没有账户的,但是访问钥匙串要求必须有用户身份,所以添加一步输入密码解锁钥匙串,可以给 Jenkins 一个用户身份。
build 步骤前添加一步解锁钥匙串。
security unlock-keychain ~/Library/Keychains/login.keychain
http://stackoverflow.com/questions/6416121/keychain-wont-unlock-from-jenkins-script-unless-user-logged-in

我也出现这个问题 请问是有解决方案吗 这个问题我没看懂

重要提示:

  • Jenkins,ssh 方式到 slave 机上,默认是没有账户的,但是访问钥匙串要求必须有用户身份,所以添加一步输入密码解锁钥匙串,可以给 Jenkins 一个用户身份。 在 build 中的 shell 中添加一行代码在 xcodebuild 之前解锁钥匙串。 security unlock-keychain -p "your login pwd" ~/Library/Keychains/login.keychain

也有网友是这样解释的,殊途同归:
Linux 服务器上的 Jenkins 调用 Mac Slave 时,是通过之前设置的 SSH 登录的方式,而 Apple 为了安全,在 ssh 登录时,是不允许读取 Keychains(钥匙串)的,所以 security -v unlock-keychain -p "yourpassword"这行命令就很重要了。在构建打包前,先解锁 Keychains。
作者:Dark_Angel

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册