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を起動すると正しく機能するため、キーと証明書のペアは存在します。
なぜそれが起こるのか、何か考えはありますか?
この問題に何時間も費やした後、私はこれに対するかなり簡単な解決策を見つけました。上記のように、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 を読んで使用し、彼はそれを管理するだけでなく、ユーザーのキーチェーンにアクセスしましたシステムのキーチェーン。
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ビルドサーバーでカスタムキーチェーンからのコード署名証明書を使用しています。システムキーチェーンに証明書またはキーをインストールしていません。
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を実行する別の方法として、私のJenkins.app https://github.com/stisti/jenkins-app を試すことができます。ユーザーセッションでJenkinsを実行するため、キーチェーンアクセスは問題になりません。
同じ問題に直面し、/ Library/LaunchDaemons/org.jenkins-ci.plistでユーザー名を変更してみました。ただし、それでも機能せず、不明瞭なNullPointerExceptionが原因で問題を特定できませんでした。したがって、私は自分の解決策を共有するだけです。JENKINS_HOMEディレクトリ(org.jenkins-ci.plistでも定義されています)の所有者も変更する必要がありました。
chown -R myBuildUser /Users/Shared/Jenkins
myBuildUserは、証明書がインストールされているユーザーです。これは、plistファイルで指定したユーザーです。
この解決策は私が最終的に気づいたときに非常に明白でした-しかし、これを知るのに数時間かかったので、この投稿が他の誰かのために時間を節約できれば幸いです:-)
Jenkins/Hudsonの区分化されたキーチェーンを保持するために、launchctlアイテムを
/Library/LaunchDaemons/org.jenkins-ci.plist
に
/Users/Shared/Jenkins/Home/Library/LaunchAgents/org.jenkins-ci.plist
これにより、Jenkins用に作成された秘密キーチェーンにアクセスできます。
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はキーチェーンをユーザーから切り離し、ログインセッションに割り当てているようです。
手動署名の場合キーチェーンでログインからシステムに証明書を移動します。アーカイブおよびiPAの生成中はログインにアクセスできません。
SessionCreateを追加し、キーチェーンマネージャーで「常に信頼する」ように多くの証明書を設定すると、plistからビルドボットを使用して動作しましたが、ある時点で、CSSMERR_TP_NOT_TRUSTEDでコードサインが失敗し始めました。 iPhoneディストリビューションの証明書をキーチェーンマネージャーで「システムのデフォルトを使用する」に設定して回復しました。ログインせずに再起動した後でも、buildbotスレーブはコードに署名できました。