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

Dmy*_*tro 41 hudson keychain launchd ios jenkins

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

<?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>
Run Code Online (Sandbox Code Playgroud)

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

你知道为什么会这样吗?

joe*_*son 71

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

除了在接受的答案建议中指定plist中的UserName元素之外,访问您在UserName中指定的用户的普通键链的技巧是还将一个值为true的SessionCreate元素添加到plist文件中 - /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>
Run Code Online (Sandbox Code Playgroud)

然后重新启动守护程序并尝试在Jenkins中运行调用安全列表 - 密钥链的作业 - 您不应再将System.keychain视为唯一的条目,而是常规登录和您可能已添加到密钥链列表中的任何自定义密钥链"jenkins"用户.

我现在正在使用Jenkins构建服务器上的自定义密钥链中的代码签名证书 - 我没有在我的系统密钥链中安装任何证书或密钥.

  • 好方案!使用这个,而不是我的! (2认同)

Jen*_*ohl 20

在花了几个小时和几天这个问题后,我找到了一个相当简单的解决方案.如上所述,如果您的launchd配置中有不同的用户名,则无关紧要:

<key>UserName</key>
<string>user</string>
Run Code Online (Sandbox Code Playgroud)

丢失的证书和密钥必须在系统密钥链(/Library/Keychains/System.keychain)上.我在设置了一个执行多个securityshell调用的jenkins作业后发现了这个.有趣的是security list-keychains:

+ security list-keychains
    "/Library/Keychains/System.keychain"
    "/Library/Keychains/applepushserviced.keychain"
    "/Library/Keychains/System.keychain"
Run Code Online (Sandbox Code Playgroud)

这是钥匙链jenkins将搜索证书和密钥,因此他们应该在那里.我将证书移到那里后就可以了.确保您还将"Apple Worldwide Developer Relations Certification Authority"证书复制到系统密钥链,否则您将看到CSSMERR_TP_NOT_TRUSTED错误codesign.

也可以注册更多的钥匙串security list-keychains -s [path to additional keychains].我没有尝试过,但像security list-keychains -s $HOME/Library/Keychains/login.keychainjenkins中的预构建shell执行一样可能会起作用.

编辑:我试图将用户钥匙串添加到搜索路径,-s但我无法让它工作.所以现在,我们必须将我们的证书和密钥复制到系统密钥链中.

编辑^ 2:阅读并使用joensson的解决方案而不是我的,他设法访问用户的钥匙串而不仅仅是系统钥匙串.

  • +1赞美指出别人的更好答案 (3认同)

cem*_*nds 6

我们在 Mac OSX Lion 上作为启动守护进程启动的 hudson 从机也遇到了同样的问题。当我们使用 webstart 启动从站时,它起作用了。我们发现的唯一区别是环境变量不同。

com.apple.java.jvmTask=WebStart
Run Code Online (Sandbox Code Playgroud)

有效,如果我们在没有 webstart 的情况下启动从站,则变量为

com.apple.java.jvmTask=CommandLine.java
Run Code Online (Sandbox Code Playgroud)

我们找不到预先影响价值的方法。我建议您在 Hudson 中创建一个新节点,在同一台计算机上运行并由 webstart 启动。为了启动从站,我们使用以下 launchdaemon 配置:

<?xml version"1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>jenkins</string>
    <key>UserName</key>
    <string>apple</string>
    <key>Program</key>
    <string>/usr/bin/javaws</string>
    <key>ProgramArguments</key>
    <array>
        <string>-verbose</string>
        <string>-wait</string>
        <string>http://<hudson-hostname>:8080/computer/<node-name>/slave-agent.jnlp</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>WorkingDirectory</key>
    <string>/Users/apple</string>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)