44

iOS用のHudsonCIを改善し、システムが起動したらすぐに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を起動すると正しく機能するため、キーと証明書のペアがあります。

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

4

10 に答える 10

71

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ビルドサーバーでカスタムキーチェーンのコード署名証明書を使用しています。システムキーチェーンに証明書やキーをインストールしていません。

于 2012-02-28T13:22:46.523 に答える
21

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

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

不足している証明書とキーは、システムキーチェーン(/Library/Keychains/System.keychain)にある必要があります。securityいくつかのシェル呼び出しを実行する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«証明書をシステムキーチェーンにコピーしてください。コピーしないと、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のソリューションを読んで使用し、彼はそれを管理して、システムキーチェーンだけでなくユーザーキーチェーンにアクセスしました。

于 2011-10-18T09:54:36.400 に答える
4

MacOSXLionでlaunchdaemonとして開始されたハドソンスレーブでも同じ問題が発生しました。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>
于 2011-09-15T15:10:57.317 に答える
2

私たちはLionとSnowLeopardでまったく同じ問題に直面しました。xcodebuildジョブをサービスとして使用してTomcat/Hudsonを起動する必要がありました。コマンドラインから開始している間、xcodebuildはlogin.keychainにアクセスして、含まれている証明書を使用できます。しかし、ボックスを再起動した後、login.keychainはxcodebuildに表示されなかったため、署名は失敗しました。

キーチェーンで会社の証明書を提供する必要があったため、システムキーチェーンはオプションではありませんでした。代わりに、簡単な回避策で問題を解決しました。ユーザー名を削除して、launchデーモンが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にアクセスできます。これはSnowLeopardでも機能しますが、並列セッション(vnc login / logoutなど)でユーザー固有のlogin.keychainを閉じると、キーチェーンが失われます。ライオンの振る舞いは異なります。Lionがキーチェーンをユーザーから切り離し、ログインセッションに割り当てているようです。

于 2011-11-08T13:11:49.330 に答える
2

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

于 2012-04-01T22:08:49.000 に答える
2

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

chown -R myBuildUser /Users/Shared/Jenkins

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

私がついにそれを実現したとき、この解決策は非常に明白でした-しかし、これについて知るのに数時間かかったので、この投稿が他の誰かの時間を節約できることを願っています:-)

于 2012-11-14T07:31:32.053 に答える
2

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

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

これが私がそれを修正した方法です:

  1. キーチェーンを調べて、キーを検索します。どういうわけか、私には複数の結果がありました。

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

ここに画像の説明を入力してください

于 2018-08-29T14:16:52.920 に答える
0

Jenkins / Hudsonのコンパートメント化されたキーチェーンを維持するために、launchctlアイテムをから移動しました

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

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

これにより、Jenkins用に作成されたプライベートキーチェーンにアクセスできます。

于 2011-11-22T01:54:03.397 に答える
0

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

于 2013-04-29T18:11:15.707 に答える
0

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

于 2018-09-06T04:10:44.520 に答える