Macos OS X上的Jenkins:xcodebuild给出代码符号错误

Macos OS X上的Jenkins:xcodebuild给出代码符号错误,macos,jenkins,Macos,Jenkins,总结: 使用最新的安装程序()在OS X上设置Jenkins变得非常容易,但是管理代码签名过程仍然非常困难,没有直接的答案 动机: 运行遵循在OS X()上运行服务的常见最佳实践的无头CI服务器 背景: 2009年10月12日- 2011年6月15日- 2011年6月23日- 2011年7月26日- 2011年8月30日- 2011年9月20日- 2011年9月14日- 2011年11月12日- 2012年1月23日- 2012年3月7日- 过程: 通过OS X安装Jenkins CI。对于

总结:

使用最新的安装程序()在OS X上设置Jenkins变得非常容易,但是管理代码签名过程仍然非常困难,没有直接的答案

动机:

运行遵循在OS X()上运行服务的常见最佳实践的无头CI服务器

背景:

  • 2009年10月12日-
  • 2011年6月15日-
  • 2011年6月23日-
  • 2011年7月26日-
  • 2011年8月30日-
  • 2011年9月20日-
  • 2011年9月14日-
  • 2011年11月12日-
  • 2012年1月23日-
  • 2012年3月7日-
过程:

通过OS X安装Jenkins CI。对于“安装类型”步骤,单击“自定义”按钮,然后选择“启动时以‘jenkins’的形式启动”

讨论:

在这一点上,天真的期望是使用构建脚本
xcodebuild-target-MyTarget-sdk iphoneos
的自由风格项目应该可以工作。正如本文标题所示,它不符合以下要求:

代码签名错误:身份“iPhone开发者”与默认密钥链中的任何有效证书/私钥对都不匹配

很明显,需要发生什么-您需要将有效的代码签名证书和私钥添加到默认密钥链中。在研究如何做到这一点的过程中,我没有找到一个解决方案不会使系统暴露出某种程度的漏洞

问题1:jenkins守护程序没有默认的密钥链

sudo-u jenkins安全默认钥匙链
…产生“找不到默认密钥链”

正如下面所指出的,默认情况下,jenkins守护进程的UserShell设置为/usr/bin/false(我认为这是一个特性,而不是bug);按照他的答案将UserShell更改为bash。然后,您可以使用
sudo su jenkins
以jenkins用户身份登录并获得bash提示

  • sudo su jenkins
  • cd~/Library
  • mkdir钥匙链
  • cd钥匙链
  • security创建钥匙链。钥匙链
  • 安全默认密钥链-s.keychain
  • 好的,很好。我们现在有了一个默认的钥匙链;让我们继续吧,对吗?但是,首先,我们为什么还要费心制作一个默认的钥匙链呢

    我在整个研究过程中读到的几乎所有答案、建议或对话都表明,应该将代码签名证书和密钥扔进系统密钥链中。如果您在Jenkins中以自由风格项目运行
    安全列表keychains
    ,您会看到唯一可用的keychain是系统keychain;我想这就是大多数人想到把他们的证书和钥匙放在里面的地方。但是,这似乎是一个非常糟糕的主意——尤其是考虑到这一点

    问题2:添加代码签名证书和私钥

    这就是我真正开始感到恶心的地方。我有一种直觉,我应该创建一个新的公钥/私钥,专门用于Jenkins。我的想法是,如果jenkins守护进程遭到破坏,那么我可以轻松地在Apple的Provisioning Portal中撤销证书,并生成另一个公钥/私钥。如果我对我的用户帐户和Jenkins使用相同的密钥和证书,那么如果Jenkins服务受到攻击,就意味着更麻烦(损坏?)

    指向将使用纯文本密码从脚本解锁钥匙链。在jenkins守护进程的密钥链中保留“一次性”证书和密钥之外的任何东西似乎都是不负责任的

    + security list-keychains
        "/Library/Keychains/System.keychain"
        "/Library/Keychains/System.keychain"
    
    我对任何相反的讨论都很感兴趣。我是否过于谨慎?

    为了在终端中创建一个新的CSR作为jenkins守护进程,我执行了以下操作

  • sudo su jenkins
  • certtool r CertificateSigningRequest.certSigningRequest
    系统会提示您输入以下内容(其中大部分我都是根据知识猜测正确答案的;您是否有更好的洞察力?请分享)。。。
    • 输入密钥和证书标签:
    • 选择算法:
      r
      (适用于RSA)
    • 以位输入密钥大小:
      2048
    • 选择签名算法:
      5
      (适用于MD5)
    • 输入质询字符串:
    • 然后是一堆关于RDN的问题
  • 以新的苹果ID将生成的CSR文件(CertificateSigningRequest.certSigningRequest)提交到苹果的供应门户
  • 批准请求并下载.cer文件
  • 安全解锁钥匙链
  • security add certificate ios\u development.cer
  • 这让我们更进一步

    问题3:配置文件和钥匙链解锁

    我在资源调配门户中创建了一个特殊的资源调配配置文件,仅用于CI,希望如果发生了一些不好的事情,我可以将影响减小一点。最佳做法还是过于谨慎

  • sudo su jenkins
  • mkdir~/Library/MobileDevice
  • mkdir~/Library/MobileDevice/Provisioning\Profiles
  • 将在资源调配门户中设置的资源调配配置文件移动到此新文件夹中。我们现在离以jenkins的身份从命令行运行xcodebuild只差两步了,这意味着我们也接近于能够让jenkins CI运行构建
  • 安全解锁钥匙链-p
  • xcodebuild-target-MyTarget-sdk iphoneos
  • 现在,当我们以jenkins守护程序的身份登录时,我们从命令行获得了一个成功的构建,因此,如果我们创建一个自由风格的项目并添加最后两个步骤(上面的第5步和第6步),我们将能够自动构建iOS项目

    这可能没有必要,但在我成功完成所有设置后,我觉得将jenkins UserShell设置回/usr/bin/false会更好。我是偏执狂吗

    问题4:德福
    security unlock-keychain -p mySecretPassword...
    
    <target name="unlock_keychain">
        <exec executable="security">
            <arg value="-v"/>
            <arg value="unlock-keychain"/>          
            <arg value="-p"/>
            <arg value="<My Password>"/>
            <arg value="/Users/macbuild/Library/Keychains/login.keychain"/>
        </exec>
    </target>
    
    + security list-keychains
        "/Library/Keychains/System.keychain"
        "/Library/Keychains/System.keychain"
    
    sudo dscl . -change /Users/jenkins UserShell /usr/bin/false /bin/bash
    
    $ security import devcertificate.cer -k jenkins.keychain -A
    
    $ security import AppleWWDRCA.cer -k jenkins.keychain -A
    
    $ security unlock-keychain -p YourKeychainPass jenkins.keychain
    $ security import devprivatekey.p12 -k login.keychain -P ThePasswordYouSetWhenExporting -A