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

2020/12/16 03:22 · ios ·  · 0评论

我正在尝试改进适用于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,它就可以正常工作。

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

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

<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但是我无法使其正常工作。因此,现在,我们必须将我们的证书和密钥复制到系统密钥链中。

编辑^ 2:阅读并使用joensson的解决方案而不是我解决方案,他管理它来访问用户的钥匙串,而不仅仅是系统钥匙串。

我找到了一种解决方案,可以让我的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视为唯一条目,而应该将常规登录名和任何自定义钥匙链添加到该清单中“詹金斯”用户。

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

对于在Mac OSX Lion上作为启动守护程序启动的哈德逊从属服务器,我们遇到了同样的问题。当我们使用webstart启动从属服务器时,它起作用了。我们发现的唯一区别是不同的环境变量。

com.apple.java.jvmTask=WebStart

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

com.apple.java.jvmTask=CommandLine.java

我们发现没有办法影响预付款的价值。我建议您在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>

您可以尝试我的Jenkins.app,https://github.com/stisti/jenkins-app,这是运行Jenkins的另一种方法。它在用户会话中运行Jenkins,因此钥匙串访问不是问题。

我遇到了同样的问题,并尝试按照其他文章之一中的描述在/Library/LaunchDaemons/org.jenkins-ci.plist中更改用户名。但是,它仍然无法正常工作,有些晦涩的NullPointerException不能帮助我确定问题所在。因此,我只想分享我的解决方案:我还必须更改JENKINS_HOME目录的所有者(同样在org.jenkins-ci.plist中定义):

chown -R myBuildUser /Users/Shared/Jenkins

myBuildUser是已安装证书的用户,这是我在plist文件中指定的用户。

当我最终意识到它时,这个解决方案就非常明显了-但是花了我几个小时才找到答案,所以希望这篇文章可以为其他人节省时间:-)

我们在Lion和SnowLeopard上都面临着完全相同的问题。我们必须使用xcodebuild作业作为服务来启动Tomcat / Hudson。从命令行启动时,xcodebuild可以访问login.keychain以使用其中包含的证书。但是在重新启动盒子之后,login.keychain对xcodebuild不可见,因此签名失败。

由于我们需要通过钥匙串提供公司证书,因此系统钥匙串不是一个选择。相反,我们通过一个简单的解决方法解决了该问题。我们删除了用户名,以便启动启动守护进程在root下启动进程

<plist version="1.0">
 <dict>
   <key>Label</key>
   <string>${LAUNCH_LABEL}</string>
   <key>Disabled</key>
   <false/>
   <key>RunAtLoad</key>
   <true/>
   <key>ProgramArguments</key>
   <array>
     <string>${INSTALL_DIR}/start.sh</string>
   </array>
   <key>StandardOutPath</key>
   <string>${INSTALL_DIR}/tomcat-stdout.log</string>
   <key>StandardErrorPath</key>
   <string>${INSTALL_DIR}/tomcat-stderr.log</string>
 </dict>
</plist>

启动守护程序称为简单脚本(start.sh),模拟完整登录并运行所需的程序

su -l username -c program

现在,即使在启动后,xcodebuild也可以访问login.keychain。这也适用于Snow Leopard,但是,如果您在并行会话中关闭用户特定的login.keychain(例如vnc login / logout),则钥匙串会丢失。狮子的行为有所不同。似乎Lion将用户的钥匙串解开,并将其分配给登录会话。

为了为詹金斯/哈德森保留分隔的钥匙串,我将launchctl项目从

/Library/LaunchDaemons/org.jenkins-ci.plist

/Users/Shared/Jenkins/Home/Library/LaunchAgents/org.jenkins-ci.plist

这使我可以访问为詹金斯创建的专用钥匙串。

由于存在相同的问题,因此添加了这些内容,但是这些解决方案都不适合我。

我的问题是我的签名证书已过期。更新后,xcode和手动运行xcodebuild可以正常工作,但Jenkins无法对应用程序进行签名。

这是我的解决方法:

  1. 调查“钥匙串”并搜索钥匙由于某种原因,我不明白我得到了多个结果。

  2. 确保私钥在系统级别(如果不是,则将其拖放到左侧的系统图标上)。

在此处输入图片说明

从plist开始,在buildbot中添加SessionCreate并在钥匙串管理器中设置很多证书以“始终信任”对我来说是有用的,但是从某些时候开始,codesign因CSSMERR_TP_NOT_TRUSTED开始失败。我通过在钥匙串管理器中将iPhone Distribution证书设置为“使用系统默认值”来恢复。即使重启后,即使没有登录,buildbot从站也能够签名。

对于手动签名,将证书从登录名移到钥匙串中的System中。在存档和生成iPA期间无法访问登录。

本文地址:http://ios.askforanswer.com/zaijiangjenkins-hudsonyongzuoioshemackaifadechixujichengshiqueshaoyaoshichuanzhongdezhengshuhemiyao.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!