web-dev-qa-db-ja.com

Jenkins / HudsonをiOSおよびMac開発の継続的インテグレーションとして使用しているときに、キーチェーンに証明書とキーがない

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>

これは問題なく動作しますが、Hudsonによって起動されたxcodebuildがアプリに署名しようとすると、キーチェーンで適切なキー/証明書を見つけることができないため失敗します。ただし、コマンドラインからHudsonを起動すると正しく機能するため、キーと証明書のペアは存在します。

なぜそれが起こるのか、何か考えはありますか?

42
Dmytro

この問題に何時間も費やした後、私はこれに対するかなり簡単な解決策を見つけました。上記のように、launchd構成に明確なユーザー名があるかどうかは関係ありません。

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

不足している証明書とキーは、システムキーチェーン(/Library/Keychains/System.keychain)に存在する必要があります。いくつかのsecurity Shell呼び出しを実行するjenkinsジョブをセットアップした後、これを見つけました。興味深いのはsecurity list-keychainsです。

+ security list-keychains
    "/Library/Keychains/System.keychain"
    "/Library/Keychains/applepushserviced.keychain"
    "/Library/Keychains/System.keychain"

それは、jenkinsが証明書とキーを検索してそこにあるはずのキーチェーンです。証明書をそこに移動した後、動作します。 "Apple Worldwide Developer Relations Certification Authority"証明書もシステムのキーチェーンにコピーしてください。そうしないと、codesignからCSSMERR_TP_NOT_TRUSTEDエラーが表示されます。

security list-keychains -s [path to additional keychains]でより多くのキーチェーンを登録することも可能です。私はそれを試していませんが、ジェンキンスでのビルド前のシェル実行としてsecurity list-keychains -s $HOME/Library/Keychains/login.keychainのようなものが機能する可能性があります。

編集:-sを使用してユーザーキーチェーンを検索パスに追加しようとしましたが、機能しませんでした。したがって、今のところは、証明書とキーをシステムのキーチェーンにコピーする必要があります。

EDIT ^ 2:私の代わりにjoensson ' solution を読んで使用し、彼はそれを管理するだけでなく、ユーザーのキーチェーンにアクセスしましたシステムのキーチェーン。

20
Jens Kohl

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」ユーザー。

Jenkinsビルドサーバーでカスタムキーチェーンからのコード署名証明書を使用しています。システムキーチェーンに証明書またはキーをインストールしていません。

71
joensson

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>
4
cemonds

Jenkinsを実行する別の方法として、私のJenkins.app https://github.com/stisti/jenkins-app を試すことができます。ユーザーセッションでJenkinsを実行するため、キーチェーンアクセスは問題になりません。

2
sti

同じ問題に直面し、/ Library/LaunchDaemons/org.jenkins-ci.plistでユーザー名を変更してみました。ただし、それでも機能せず、不明瞭なNullPointerExceptionが原因で問題を特定できませんでした。したがって、私は自分の解決策を共有するだけです。JENKINS_HOMEディレクトリ(org.jenkins-ci.plistでも定義されています)の所有者も変更する必要がありました。

chown -R myBuildUser /Users/Shared/Jenkins

myBuildUserは、証明書がインストールされているユーザーです。これは、plistファイルで指定したユーザーです。

この解決策は私が最終的に気づいたときに非常に明白でした-しかし、これを知るのに数時間かかったので、この投稿が他の誰かのために時間を節約できれば幸いです:-)

2
JRV

同じ問題があったのでこれを追加しましたが、これらの解決策はどれもうまくいきませんでした。

私の問題は、署名証明書の有効期限が切れていることでした。アップデート後、xcodeと実行中のxcodebuildは手動で正常に機能しましたが、Jenkinsはアプリに署名できませんでした。

修正方法は次のとおりです。

  1. キーチェーンを調べ、キーを検索します。何らかの理由で理解できないので、複数の結果が出ました。

  2. 秘密鍵がシステムレベルにあることを確認します(そうでない場合は、左側のシステムアイコンにドラッグアンドドロップします。

enter image description here

1
Francois Nadeau

Jenkins/Hudsonの区分化されたキーチェーンを保持するために、launchctlアイテムを

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

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

これにより、Jenkins用に作成された秘密キーチェーンにアクセスできます。

1
igorsales

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でも機能しますが、並列セッション(vnc login/logoutなど)でユーザー固有のlogin.keychainを閉じると、キーチェーンが失われます。ライオンの行動は異なります。 Lionはキーチェーンをユーザーから切り離し、ログインセッションに割り当てているようです。

1
hieroGlype

手動署名の場合キーチェーンでログインからシステムに証明書を移動します。アーカイブおよびiPAの生成中はログインにアクセスできません。

0
Shauket Sheikh

SessionCreateを追加し、キーチェーンマネージャーで「常に信頼する」ように多くの証明書を設定すると、plistからビルドボットを使用して動作しましたが、ある時点で、CSSMERR_TP_NOT_TRUSTEDでコードサインが失敗し始めました。 iPhoneディストリビューションの証明書をキーチェーンマネージャーで「システムのデフォルトを使用する」に設定して回復しました。ログインせずに再起動した後でも、buildbotスレーブはコードに署名できました。

0
Dan Kegel