【问题标题】:Unable to sign iOS builds with Jenkins无法使用 Jenkins 签署 iOS 版本
【发布时间】:2012-03-26 10:54:48
【问题描述】:

我们的 Jenkins CI 构建服务器设置在运行 OSX Lion (10.7.3) 的 Mac Mini 上,我无法让它签署 iOS 构建以便将它们上传到 TestFlight。

该进程以名为 jenkins 的普通用户身份运行,并在启动时使用 launchd 启动。 (外部世界无法访问该机器,因此在普通用户帐户下运行它应该没有任何安全问题。)

这是 jenkins 控制台输出中的错误:

[workspace] $ /usr/bin/xcodebuild -target iMobileStCloud -configuration Release clean build
=== CLEAN NATIVE TARGET MyApp OF PROJECT MyProject WITH CONFIGURATION Release ===
Check dependencies
[BEROR]Code Sign error: The identity 'iPhone Distribution' doesn't match any valid certificate/private key pair in the default keychain

部分问题似乎是当进程从启动时启动时只有系统钥匙串可用。我在构建过程中添加了一个脚本来列出钥匙串:

[workspace] $ /bin/sh -xe /var/folders/1y/1q3st_ss58z9ffj4dwbkdw8r0000gt/T/hudson8514187812830984272.sh
+ /usr/bin/security list-keychains
    "/Library/Keychains/System.keychain"
    "/Library/Keychains/applepushserviced.keychain"
    "/Library/Keychains/System.keychain"
+ /usr/bin/security find-identity

我能够找到两种解决方法,但没有一种是真正可行的:

  1. 如果我们登录到服务器并重新启动启动进程每次机器重新启动然后 jenkins 就能够加载登录钥匙串并访问证书以进行签名:

    sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
    sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
    
  2. 我们可以将证书添加到系统钥匙串,但这意味着我们不能使用这台机器来进行我们的应用商店分发构建。 (Xcode 不喜欢系统钥匙串)。

还有其他人找到其他可行的解决方法吗?除了 launchd 之外,还有什么其他东西可以用来在 OSX 上启动时运行进程吗?

【问题讨论】:

  • 如果登录和系统钥匙串中相同的钥匙,Xcode还会有问题吗?
  • 我认为将钥匙放在两个地方是另一种解决方法,但根据过去的经验,我知道它确实会导致钥匙串访问程序出现问题。它似乎很困惑,不会删除两个钥匙串中存在的钥匙。
  • 查看此堆栈交换问题以获得可能的解决方案:stackoverflow.com/questions/6827874/…
  • 如果接受的答案对你来说还不够,试试这个..egeek.me/2013/02/23/…

标签: ios jenkins launchd


【解决方案1】:

我通过将 SessionCreate=true 添加到我的 org.jenkins-ci.plist 文件中解决了这个问题。此调用初始化安全框架。

来源:http://developer.apple.com/library/mac/#technotes/tn2083/_index.html

在下面完整地查看我的:

<?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>daemon</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>
</plist>

【讨论】:

  • 这被证实对我也有效,所以我切换了我的答案复选标记。这是拼图中最后缺失的一块。非常感谢!
  • 嗨,SessionCreate 已正确放置在我的 .plist 文件中,并且安全列表钥匙串显示 Jenkins login.keychain 但我在构建时仍然遇到相同的错误。有什么想法吗?
  • 你重启过还是重启过jenkins?不确定,有很多事情可能出错。还要确保证书/私钥对在 jenkins 用户的钥匙串中。最后右键单击您的密钥并在访问控制下授予对所有应用程序的访问权限。
  • 这个文件在哪里?我已经签入~/Library/Preferences~/Library/LaunchDaemons 但没有运气
  • /System/Library/下查看
【解决方案2】:

您也可以尝试我的替代 Jenkins 安装程序,它将 Jenkins 作为应用程序运行。

该项目位于https://github.com/stisti/jenkins-app。 下载地址为https://github.com/stisti/jenkins-app/downloads

Jenkins 需要在用户上下文中运行才能访问钥匙串。

【讨论】:

  • 我希望我在几个月前就知道这个项目。
  • 这真的很容易设置和使用。比我默认设置的 Jenkins 要好得多。
【解决方案3】:

我遇到了同样的问题。主要问题实际上是在 launchd 启动 LaunchDaemon 时引起的。即使您指定了要在其下运行 launchd 进程的用户,也不会像您以该用户身份登录一样运行它。这就是为什么您在 Jenkins 可用的钥匙串列表中没有看到登录钥匙串的原因。

我遇到了一项涉及调用su - yourbuilduser -c ./start-jenkins.sh 的工作,其中start-jenkins.sh 是自定义启动脚本,来自您的launchd plist(作为LaunchDaemon)。这保证了对登录钥匙串的访问,但使 Jenkins 难以从启动中控制。具体来说,您不能通过调用 launctl unload ... 来停止 Jenkins,您必须手动终止该进程。

目前我们在 LaunchAgents 中使用 plist 运行我们的 iOS CI(它只是使用 java -jar jenkins.war 启动 Jenkins)而不是在 LaunchDaemons 中。乏味这意味着您的用户必须登录到服务器(如果您的机器在您的专用网络中或在正确配置的 DMZ 中,则不是问题),但这也意味着可以从 launchctl 控制 Jenkins 进程并且它具有访问用户的钥匙串。您可以将用户设置为自动登录,以便在启动时获得 Jenkins。

我已经成功地自动化了 iOS 二进制文件的持续交付管道的几乎所有方面,这是我的解决方案感觉不对的唯一部分(理想情况下,我只能使用可以访问的 LaunchDaemon到用户的钥匙串)。

【讨论】:

  • 不确定我是否关注您,但我认为您的意思是您将 Jenkins 用户设置为自动登录,然后添加了一个 shell 脚本作为该用户的登录项之一。对吗?
  • 好的,不要将 plist 添加到 /Library/LaunchDeamons,将其添加到 /Users/youruserhere/Library/LaunchAgents 然后将该用户设置为自动登录。这个 jenkins 实例将有权访问“youruserhere”的登录钥匙串。您可能必须在构建代码的詹金斯作业期间解锁它。
  • 让 Jenkins 用户保持登录状态并不理想,但它不会破坏交易,它确实使 CI 构建服务器完全自动化。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2013-05-30
  • 1970-01-01
  • 2017-11-02
  • 2019-08-31
  • 2014-01-15
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多