在花了数小时和几天的时间解决此问题后,我发现了一个相当简单的解决方案。如上所述,在启动的配置中是否有不同的用户名并不重要:
<key>UserName</key>
<string>user</string>
缺少的证书和密钥必须位于系统密钥链(/Library/Keychains/System.keychain
)上。我设置了执行几个security
shell调用的jenkins作业后,发现了这一点。有趣的是security list-keychains
:
+ security list-keychains
"/Library/Keychains/System.keychain"
"/Library/Keychains/applepushserviced.keychain"
"/Library/Keychains/System.keychain"
这就是詹金斯将搜索证书和密钥的钥匙串,因此它们应该在那里。在我将证书移到那里之后,它就可以工作了。确保您还将“ Apple全球开发者关系证书颁发机构”证书复制到系统钥匙串,否则将显示CSSMERR_TP_NOT_TRUSTED
错误消息codesign
。
也可以向注册更多的钥匙串security list-keychains -s [path to additional keychains]
。我还没有尝试过,但是像security list-keychains -s $HOME/Library/Keychains/login.keychain
在jenkins中执行预构建外壳程序之类的东西可能会起作用。
我试图将用户钥匙串添加到搜索路径,-s
但我无法使其正常工作。因此,现在,我们必须将我们的证书和密钥复制到系统密钥链中。
。
我找到了一个解决方案,可以让我为Jenkins用户访问常规的钥匙串。
除了按照接受的答案在plist
中指定UserName
元素外,获取在UserName中指定的用户的普通钥匙串的权限的技巧还在于在plist文件中添加一个值为
true的
SessionCreate元素-
/ Library /launchdaemons / org.jenkins-ci.plist`:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>JENKINS_HOME</key>
<string>/Users/Shared/Jenkins/Home</string>
</dict>
<key>GroupName</key>
<string>wheel</string>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>org.jenkins-ci</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Library/Application Support/Jenkins/jenkins-runner.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>jenkins</string>
<key>SessionCreate</key>
<true />
</dict>
然后重新启动守护程序,并尝试在Jenkins中运行一个调用安全性列表钥匙串的作业-您应该不再将System.keychain视为唯一条目,而是常规登录名和您可能已添加到该钥匙串列表中的任何自定义钥匙串。 “詹金斯”用户。