一尘不染

在将Jenkins / Hudson用作iOS和Mac开发的持续集成时,缺少钥匙串中的证书和密钥

jenkins

我正在尝试改进适用于iOS的Hudson CI,并在系统启动后立即启动Hudson。为此,我使用以下启动脚本:

<?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>Label</key>
    <string>Hudson CI</string>
    <key>ProgramArguments</key>
    <array>
    <string>/usr/bin/java</string>
    <string>-jar</string>
    <string>/Users/user/Hudson/hudson.war</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>UserName</key>
    <string>user</string>
</dict>
</plist>

这可以正常工作,但是当由Hudson启动的xcodebuild尝试对应用程序进行签名时,它失败了,因为它无法在钥匙串中找到正确的钥匙/证书。但是,这里有密钥/证书对,因为如果我从命令行启动Hudson,它就可以正常工作。

您有什么想法为什么会发生吗?


阅读 548

收藏
2020-07-25

共2个答案

一尘不染

在花了数小时和几天的时间解决此问题后,我发现了一个相当简单的解决方案。如上所述,在启动的配置中是否有不同的用户名并不重要:

<key>UserName</key>
<string>user</string>

缺少的证书和密钥必须位于系统密钥链(/Library/Keychains/System.keychain)上。我设置了执行几个securityshell调用的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但我无法使其正常工作。因此,现在,我们必须将我们的证书和密钥复制到系统密钥链中。

2020-07-25
一尘不染

我找到了一个解决方案,可以让我为Jenkins用户访问常规的钥匙串。

除了按照接受的答案在plist中指定UserName元素外,获取在UserName中指定的用户的普通钥匙串的权限的技巧还在于在plist文件中添加一个值为trueSessionCreate元素-/ 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视为唯一条目,而是常规登录名和您可能已添加到该钥匙串列表中的任何自定义钥匙串。 “詹金斯”用户。

我现在正在使用Jenkins构建服务器上自定义钥匙串的代码签名证书-我的系统钥匙串中未安装任何证书或钥匙。

2020-07-26