Xcode,Jenkins / SSH的Codesign错误 - “不允许用户交互”

21

我正在尝试在Jenkins上运行自动化的xcodebuild,但是遇到了以下错误:

不允许用户交互。 命令/usr/bin/codesign执行失败,退出码为1。

我已经参考了"User interaction is not allowed" trying to sign an OSX app using codesign和其他类似的主题,但是没有一个解决方案能够正确地解决这个错误。


这是我已经尝试过的:

  • I have allowed all items to access the keychain, and I have specifically added codesign to the "always allow" list (as done here https://dev59.com/cmIj5IYBdhLWcg3wfVJ8#22637896)

  • I have set the keychain to not automatically lock with a timeout, both through Keychain Access's settings, and through the command

    security set-keychain-settings -t 3600 -l <KEYCHAIN>
    
  • I have tried calling

    codesign --sign <CODE SIGN IDENTITY> --force ...
    

    before the project compiles (more specifically, this solution https://dev59.com/cmIj5IYBdhLWcg3wfVJ8#20208104), and although this successfully builds the project I don't think that codesigning before compiling is correct or reliable. (edit: this also failed when run from jenkins)


这是我正在执行的命令:

security unlock-keychain -p <PASSWORD> <KEYCHAIN>
xcodebuild -scheme <SCHEME> -workspace <WORKSPACE> -derivedDataPath <BUILD DIRECTORY> -configuration <CONFIGURATION> "CONFIGURATION_BUILD_DIR=<BUILD DIRECTORY>" "CODE_SIGN_IDENTITY=<CODE SIGN ID>" "PROVISIONING_PROFILE=<PROVISIONING PROFILE>" clean build

有趣的是,在本地构建项目时,使用上述命令可以正常工作,但尝试在ssh(和jenkins)上运行完全相同的命令会导致错误。

提前感谢您的帮助!


Jenkins 是否有访问 /usr/bin/codesign 的权限? - Opal
是的,它确实有访问权限。 - reyes20
1
你可以在这里找到解决方案:https://dev59.com/cmIj5IYBdhLWcg3wfVJ8 - kazerm
1
我刚刚解决了一个类似的问题。在尝试了所有方法(解锁、设置超时等)之后,我使用sudo su进入ssh用户并尝试模拟完全相同的流程,最终出现了一个钥匙串弹窗(允许、始终允许、拒绝),选择“始终允许”后,它终于可以正常工作了。我的设置涉及到一个愚蠢的从属OSX机器,主控Jenkins(Linux)通过ssh构建IOS应用程序。 - Dmitry Fink
请参见 https://dev59.com/cmIj5IYBdhLWcg3wfVJ8#20208104 获取另一个不错的答案。 - Danny Schoemann
显示剩余2条评论
6个回答

16

如果有人错过了,链接的问题中的答案解决了这个问题。基本上,你需要运行 security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN"。我在编译之前运行此命令,然后代码签名成功。


对我来说有效,只有在你作为服务运行时才需要。 - Alon
使用 security list-keychains 命令来确定您想要解锁的钥匙串。通常情况下,它应该是 "~/Library/Keychains/login.keychain-db" - rpstw

14

由于苹果设备是无头设备,所以不支持通过SSH运行自动化构建,因此可能是由于通过SSH运行引起的问题:

LaunchDaemons提供的上下文不支持运行GUI应用程序。SSH服务和Jenkins的默认设置都是作为LaunchDaemons实现的。在早期版本的Xcode 5中,xcodebuild可以在此上下文中在iOS模拟器上运行测试,但是它从未被支持,并且如您所注意到的,自Xcode 6以来已不再工作。

与LaunchDaemons不同,LaunchAgents提供了一个上下文,可以在用户在使用窗口服务器/Aqua会话登录时运行GUI应用程序。将Jenkins配置从LaunchDaemon转换为LaunchAgent将避免报告的问题。您还可以使用launchd从SSH会话中运行iOS模拟器上的测试,方法是创建一个LaunchAgent并手动加载/启动它,或者使用“launchctl submit”。

您是否尝试使用Web代理?


花了将近一个半小时尝试通过ssh登录到我的构建服务器来使我的构建脚本工作。将我的代码提交并通过Web UI运行脚本,成功地构建了...这节省了我不知道还要多少痛苦的尝试。谢谢。 - Taz

9

将您的密钥放入系统钥匙串中,而不是登录/iCloud/本地项目中。


这实际上是一个非常好的建议,因为它不需要将密码导出到变量中,也不需要找到正确的钥匙串所在位置。 - igraczech
我也遇到了同样的错误,但我已经在使用系统钥匙串。结果发现提示是因为缺少证书密码。即使这不是最终解决方案,打开交互式会话以查看提示要求有所帮助。 - Carl Walsh

3
在此处安装Xcode插件:https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin 选择选项以解锁钥匙串并提供钥匙串路径,例如${HOME}/Library/Keychains/login.keychain
确保您设置了$HOME环境变量。根据经验,像开发人员一样让机器登录作为用户只是更容易做到。

$HOME 变量不是来自于 bash 吗? - shim

1
我曾经遇到过 Jenkins Xcode 插件的问题。
我只需在“Xcode - 签名代码和 OS X 钥匙串选项”中勾选“解锁钥匙串?”即可使我的构建运行。请注意,保留 HTML 标签。

enter image description here


0

自动化构建(Jenkins w/remote SSH)使用productsign工具一直很好,直到我们将构建盒子从Yosemite升级到Sierra。

productsign[4065:51711] 配置RSA签名时出错:不允许用户交互。 (-25308)

我们尝试了在SO上找到的不同解决方案,但都没有奏效。

最终,我通过以下方式解决了问题:

  1. 打开钥匙串,进入首选项
  2. 点击“重置我的默认钥匙串”
  3. 会出现“操作不允许”或类似的消息
    • 错误没有任何意义,因为用户是管理员
    • 登录钥匙串被删除,但未重新创建。
  4. 注销并重新登录
    • 新的登录钥匙串出现
    • productsign再次正常工作(通过自动化构建)

请注意,我们的“Developer ID Installer: ACME, Inc (12345ABCDE)”证书位于系统钥匙串中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接