除非用户登录,否则钥匙串不会从 Jenkins 脚本解锁

Posted

技术标签:

【中文标题】除非用户登录,否则钥匙串不会从 Jenkins 脚本解锁【英文标题】:Keychain won't unlock from Jenkins script unless user logged in 【发布时间】:2011-09-18 22:57:05 【问题描述】:

我在 OS X 机器上运行 Jenkins CI 服务器。服务器作为标准用户“john”运行,并通过运行 launchctl 启动。该服务器所做的其中一件事是使用存储在钥匙串“xcode.keychain”中的密钥和证书构建 XCode 项目:

Jenkins(根据活动监视器在用户 'john' 下运行)在用户按下 Web 界面上的按钮时从脚本调用这些命令。

security default-keychain -s /Users/john/Library/Keychains/xcode.keychain
security unlock-keychain -p password /Users/john/Library/Keychains/xcode.keychain
xcodebuild ...

如果我碰巧通过 UI 以“john”身份登录到服务器,则当 Jenkins 调用这些命令时,钥匙串会正确解锁。但是,如果我没有登录,xcode.keychain 不会解锁并且构建失败。有什么想法吗?

【问题讨论】:

将所有密钥和证书移入 System.keychain 解决了这个问题。我猜这与从 launchctl 运行的 Jenkins 有关,但仍然很好奇为什么它之前不能正常工作。 您是如何做到这一点的?我试图复制你的解决方案,但我仍然收到错误:( YMMV,但我只是按照上面的建议将我的密钥和证书移动到系统钥匙串中,它对我有用。 这里解释原因和解决方法:***.com/a/9482707/111823 将带有证书的密钥拖到系统钥匙串对我有用,并且不需要将我的钥匙串密码放入脚本中,谢谢! 【参考方案1】:

我不得不:

    右键单击我的钥匙串中的私钥,我的构建过程 正在尝试使用 点击“获取信息” 然后是“访问控制”选项卡。 您可以将特定应用程序(如“代码设计”)添加到应用程序列表中 允许访问该密钥,或者只允许所有应用程序访问。

这让我明白了。

这些 cmets 中的更多信息: https://***.com/a/12235462/544130 https://***.com/a/14761060/544130

【讨论】:

【参考方案2】:

在没有 launchd 的情况下运行 Jenkins。我使用了以下命令:

sudo su jenkins -c "JENKINS_HOME=/Users/Shared/Jenkins/Home /Library/Application\ Support/Jenkins/jenkins-runner.sh"

【讨论】:

【参考方案3】:

我最近偶然发现了完全相同的问题。

security list-keychains -s /Users/john/Library/Keychains/xcode.keychain 可能会解决您的问题。让我知道它是否有效。

最近我在那边找到了解决方案:Missing certificates and keys in the keychain while using Jenkins/Hudson as Continuous Integration for ios and Mac development

【讨论】:

【参考方案4】:

您可以尝试Jenkins.app,这是运行 Jenkins 的另一种方式。它在用户会话中运行 Jenkins,所以 Keychain 应该不是问题。

【讨论】:

以上是关于除非用户登录,否则钥匙串不会从 Jenkins 脚本解锁的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins - Xcode 构建工作代码设计失败

用于启动 Tomcat 和 Jenkins 的非特权用户的 iOS 默认钥匙串

詹金斯删除钥匙串中的钥匙

除非用户登录,否则 VB6 应用程序不会按计划任务执行

如何使用钥匙串验证用户名和密码

iOS - 如何使用钥匙串/核心数据创建登录过程?