概要:
OS XでのJenkinsのセットアップは、最新のインストーラーで大幅に簡単になりました( 現在1.449-2012年3月9日 )。
動機:
OS Xでサービスを実行するための一般的なベストプラクティスに従うヘッドレスCIサーバーを実行します( その一部はここでは平易な言語で説明されています )。
背景:
プロセス:
OS X経由でJenkins CIをインストールします インストーラーパッケージ 。 「インストールの種類」の手順では、「カスタマイズ」ボタンをクリックして、「起動時に「jenkins」として起動」を選択します。
ディスカッション:
この時点での単純な期待は、ビルドスクリプトxcodebuild -target MyTarget -sdk iphoneos
を使用したフリースタイルプロジェクトが機能することでした。この投稿のタイトルで示されているように、次のように失敗し、失敗します。
Code Sign error: The identity 'iPhone Developer' doesn't match any valid certificate/private key pair in the default keychain
何が起こる必要があるかは十分明らかです。有効なコード署名証明書と秘密鍵をデフォルトのキーチェーンに追加する必要があります。これを達成する方法を研究する中で、システムをある程度の脆弱性にさらさない解決策は見つかりませんでした。
問題1:jenkinsデーモンのデフォルトキーチェーンがありません
Sudo -u jenkins security default-keychain
... yields "デフォルトのキーチェーンが見つかりませんでした"
以下で Ivo Dancet で指摘されているように、UserShellはデフォルトでjenkinsデーモンの/ usr/bin/falseに設定されます(これはバグではなく機能だと思います)。彼の答えに従ってUserShellをbashに変更します。次に、Sudo su jenkins
を使用して、jenkinsユーザーとしてログインし、bashプロンプトを取得できます。
Sudo su jenkins
cd ~/Library
mkdir Keychains
cd Keychains
security create-keychain <keychain-name>.keychain
security default-keychain -s <keychain-name>.keychain
いいですねデフォルトのキーチェーンが用意されました。右に移動しましょうか?しかし、最初に、なぜデフォルトのキーチェーンを作成する必要があるのでしょうか?
私が調査を通じて読んだほぼすべての回答、提案、または会話は、コード署名証明書とキーをシステムのキーチェーンにチャックするだけでよいことを示唆しています。 Jenkinsでsecurity list-keychains
をフリースタイルプロジェクトとして実行すると、利用可能なキーチェーンはシステムキーチェーンのみであることがわかります。ほとんどの人が証明書とキーをそこに入れるというアイデアを思いついたのはそこだと思います。しかし、これは非常に悪い考えのように思えます-特に キーチェーンを開くにはパスワード付きのプレーンテキストスクリプトを作成する必要があります 。
問題2:コード署名証明書と秘密キーを追加する
これは私が本当にきしむようになるところです。私は、ジェンキンスで使用するためのユニークな新しい公開/秘密キーを作成する必要があると感じています。私の思考プロセスは、jenkinsデーモンが侵害された場合、Appleのプロビジョニングポータルで証明書を簡単に失効させ、別の公開/秘密キーを生成できることです。ユーザーアカウントとJenkinsに同じキーと証明書を使用する場合、jenkinsサービスが攻撃されると、さらに面倒(損傷?)になります。
Simon Urbanek's answer を指すと、プレーンテキストパスワードでスクリプトからキーチェーンのロックが解除されます。 jenkinsデーモンのキーチェーンに「使い捨て」の証明書とキー以外を保持するのは無責任なようです。
反対の議論に非常に興味があります。私は過度に慎重ですか?
ターミナルでジェンキンスデーモンとして新しいCSRを作成するために、私は次のことをしました...
Sudo su jenkins
certtool r CertificateSigningRequest.certSigningRequest
次のプロンプトが表示されます(これらのほとんどは、正しい答えで教育的な推測を行いました。より良い洞察がありますか?共有してください。)... r
(RSAの場合)2048
5
(MD5の場合)security unlock-keychain
security add-certificate ios_development.cer
これにより、一歩近づきます...
問題3:プロビジョニングプロファイルとキーチェーンのロック解除
CIで使用するためだけに、Provisioning Portalで特別なプロビジョニングプロファイルを作成しました。何か悪いことが起こった場合、その影響をもう少し小さくしたいと考えています。ベストプラクティスまたは過度に慎重ですか?
Sudo su jenkins
mkdir ~/Library/MobileDevice
mkdir ~/Library/MobileDevice/Provisioning\ Profiles
security unlock-keychain -p <keychain password>
xcodebuild -target MyTarget -sdk iphoneos
これで、jenkinsデーモンとしてログインしたときにコマンドラインからビルドが成功するので、フリースタイルのプロジェクトを作成し、最後の2つのステップ(上記の#5と#6)を追加すると、ビルドを自動化できますiOSプロジェクト!
必要ではないかもしれませんが、このセットアップをすべて成功させた後、jenkins UserShellを/ usr/bin/falseに戻す方が良いと感じました。私は妄想的ですか?
問題4:デフォルトのキーチェーンはまだ使用できません!
(編集:質問に編集内容を投稿し、ソリューションが100%であることを確認するために再起動しました。もちろん、手順を省略しました)
上記のすべての手順を実行した後でも、 この回答 に記載されているように、/ Library/LaunchDaemons/org.jenkins-ci.plistのLaunch Daemon plistを変更する必要があります。これも openrdarバグ であることに注意してください。
次のようになります。
<?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>
<!-- **NEW STUFF** -->
<key>SessionCreate</key>
<true />
</dict>
</plist>
このセットアップでは、 JenkinsのXcodeプラグイン もお勧めします。これにより、xcodebuildスクリプトのセットアップが少し簡単になります。この時点で、xcodebuildのmanページを読むこともお勧めします-ターミナルでここまでやってくれたのですか?
このセットアップは完璧ではなく、アドバイスや洞察は大歓迎です。
私が問題を解決するために使用するようになったのは、ほぼ全員の入力のコレクションだったので、「正しい」答えを選択するのに苦労しました。私は少なくとも全員に賛成票を投じようとしましたが、サイモンが元の質問にほとんど答えたので、サイモンに答えを授与しました。さらに、 SamiTikka は、JenkinsをAppleScriptを使用して単純なol 'OS Xアプリとして動作させるための努力に多大な功績があります。 Jenkinsを立ち上げて、ユーザーセッション内で素早く動作することにのみ関心がある場合(つまり、ヘッドレスサーバーとしてではない場合)、彼のソリューションははるかにMacに似ています。
私の努力sparkさらなる議論、そして彼らがiOSプロジェクトのためにJenkins CIを週末に彼らが持っているすべての素晴らしいことのためにセットアップすることができると考えて来る次の貧しい人々を助けることを願っていますそれについて聞いた。
非常に多くの賛成票とお気に入りがあるので、18か月後にこの簡単な教訓を学びに戻ってくると思いました。
レッスン1:Jenkinsを公開インターネットに公開しない
2012年のWWDCで、XcodeとOS X Serverのエンジニアにこの質問をしました。私は「それをしないでください!」という不協和音を受け取りました。私が尋ねた人から。彼らは全員、自動化されたビルドプロセスは素晴らしいことですが、サーバーにはローカルネットワークでのみアクセスできるようにすることに同意しました。 OS X Serverのエンジニアは、VPN経由のリモートアクセスを許可することを提案しました。
レッスン2:新しいインストールオプションがあります
先日、CocoaHeadsでJenkinsの体験について話しましたが、驚いたことに、Homebrewと Bitnami Mac App Store バージョンという新しいインストール方法が見つかりました。これらは間違いなくチェックする価値があります。 Jonathan Wright には要点を詳述する要点があります Homebrew Jenkinsが働いています 。
レッスン3:いいえ、真剣に、ビルドボックスをインターネットに公開しないでください
元の投稿から、私がシステム管理者でもセキュリティの専門家でもないことは明らかです。プライベートなもの(キーチェーン、クレデンシャル、証明書など)についての常識は、私がJenkinsボックスをインターネットに置くことにかなり不安を感じさせました。 Nick Arnott Neglected Potentialは、 この記事 で私のヒッピージービーを簡単に確認できました。
TL; DR
ビルドプロセスの自動化を検討している他の人への私の推奨は、この1年半で変わりました。 Jenkinsマシンがファイアウォールの内側にあることを確認してください。インストーラー、Bitnami Mac App Storeバージョン、Sami TikkaのAppleScriptなどを使用して、Jenkinsを専用のJenkinsユーザーとしてインストールおよび設定します。これにより、上記で説明した頭痛のほとんどが解決されます。リモートアクセスが必要な場合、OS X ServerでVPNサービスを設定するには10分かかります。私はこのセットアップを1年以上使用していますが、非常に満足しています。幸運を!
キーチェーンを使用するには、ロックを解除する必要があります。 security unlock-keychain
を使用してロックを解除できます。インタラクティブに(安全)またはコマンドラインでパスワードを指定する(安全でない)ことができます。例:
security unlock-keychain -p mySecretPassword...
明らかに、これをスクリプトに組み込むと、そのキーチェーンのセキュリティが低下するため、多くの場合、このような損傷を最小限に抑えるために署名資格情報のみで個別のキーチェーンを設定します。
通常、Terminal
では、デフォルトのキーチェーンはログイン時にロック解除されるため、キーチェーンはセッションによって既にロック解除されています。そのため、これを行う必要はありません。ただし、セッションで実行されないプロセスは、ユーザーとしてユーザーがいる場合でも、キーチェーンのロックが解除されません(ほとんどの場合、これはssh
に影響しますが、他のプロセスにも影響します)。
また、Jenkinsを介してアドホック配布を行いたい場合、プロビジョニングプロファイルに加えて、Jenkinsが配布証明書とチーム管理者IDにアクセスする必要があります。
.cerファイルでエクスポートされたIDを使用して、プログラムでインポートできます。-Aスイッチは、すべてのプログラムがこのエントリにアクセスできるようにします。または、いくつかの-T /path/to/program
スイッチを使用して、codesign
およびxcodebuild
アクセスを許可することもできます。
$ security import devcertificate.cer -k jenkins.keychain -A
もちろん、Apple WWDCRA証明書もほぼ同じ方法でインポートされている必要があります。
$ security import AppleWWDRCA.cer -k jenkins.keychain -A
ただし、devcertificate.cer
の秘密鍵も必要です。これを行うには、対応する秘密キーを.p12キーとしてエクスポートし、パスワードを設定する必要があります。 Jenkins Shellからアクセスできる場所に置き、キーチェーンのロックを解除してインポートします。
$ security unlock-keychain -p YourKeychainPass jenkins.keychain
$ security import devprivatekey.p12 -k login.keychain -P ThePasswordYouSetWhenExporting -A
配布証明書のインポートも同じように機能します。 .cerではなく.p12をインポートするためにキーチェーンのロックを解除する必要がある理由がわかりません。
また、プロビジョニングプロファイルへのアクセスも必要になります。これらの手順をこの投稿で編集します。
私は同じ問題を抱えていて、答えを探していました。ここで私が学んだことの1つがあります。
私はjenkinsユーザー、インストーラーによって作成されたユーザーとしてjenkinsを実行しています。他の誰もが言ったように、彼はあなたの通常のユーザーと同じキーチェーンにアクセスできません。 jenkinsユーザーとしてログインしようとする代わりに、jenkinsユーザーとしてテストしたいコマンドを実行する「シェルの実行」という1つのビルドステップのみを含む2番目のビルドプロジェクトを作成しました。
設定が完了したら、コマンドを実行できます
security list-keychains
そして、これはジェンキンスが見ることができる唯一のものがシステムキーチェーンであることを私に明らかにしました。
+ security list-keychains
"/Library/Keychains/System.keychain"
"/Library/Keychains/System.keychain"
その後、キーチェーンアクセスアプリを開き、「iPhone Developer:xxxx」証明書をシステムキーチェーンにコピーしました(右クリックして、「ログイン」キーチェーンからコピーします)。
これにより、証明書/秘密キーペアのコード署名エラーに合格しましたが、プロビジョニングプロファイルで別のエラーを開きました(同様の、しかし異なる問題のようです)。
パスワードを変更するには、Sudo passwd jenkins <new-pw>
を使用できます。ただし、dsclコマンドを使用してパスワードを変更する方が良いと思います。
私のインストールでは、jenkins(公式インストーラー)にはユーザーShell/usr/bin/falseがありました。 bashに変更することで、ログインできないという問題を解決しました。
Sudo dscl . -change /Users/jenkins UserShell /usr/bin/false /bin/bash
これで、su jenkins
でログインできるはずです。
Xcodeプラグインを使用してiOSアプリを構築しました。プロジェクトの構成。
ビルドステップの追加> Xcode>コード署名とOS Xキーチェーンオプションを選択します
キーチェーンのロック解除ボックスに追加し、次のように追加します(例)
時々、エラーが出たら
コード署名エラー:...
Jenkinsを再度開き、パスワードをもう一度入力してロックを解除します
キーチェーンに問題がある人のために、 https://github.com/stisti/jenkins-app で代替のJenkinsインストーラーを試してみることをお勧めします https:// github。 com/stisti/jenkins-app/downloads
Jenkins.appはユーザーセッションでJenkinsを実行するため、キーチェーンアクセスの問題は問題ではありません。
Sudoがある場合、passwdを使用してJenkinsユーザーのパスワードを変更できます。その後、Jenkinsパスワードを取得できます。
また、これがあなたにとっての問題かどうかはわかりませんが、私がJenkins経由で使用するANTスクリプトには次のようなものがあります。
<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>
何らかの理由で、Jenkinsを新しくインストールしたLionで「セキュリティ」ユーティリティが機能していませんでした。
「sudo su jenkins」の後、新しいキーチェーンを作成できましたが、すべての「default-keychain -s ...」または「unlock」コマンドを無視して、終了ステータスをゼロに戻し、コンソールに何も出力しませんでした。デフォルトまたはログインのキーチェーンを一覧表示しても何も得られず、キーチェーンの検索リストにはシステムキーチェーンのみが含まれていたため、入力した内容を変更できませんでした。
そのユーザーのデスクトップにログインしてKeychain Utilityを起動した後、作成されたキーチェーンが表示され、その後すべてが上の投稿で説明したように機能しました。
Lionでキーチェーンの初期動作の一部が変更されたのか、それとも何かが足りないのだろうか?
デーモンではなくOS XユーザーとしてJenkinsCIをインストールして起動することもできます。
http://127.0.0.1:8080
Sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
/Applications/Jenkins/jenkins.war
http://127.0.0.1:8080
この問題を解決するには、 http://appleid.Apple.com にログインして、セキュリティの質問を更新してください。
助けてくれました。
会社の秘密鍵と公開鍵をキーチェーンに追加しました。作成するプロダクションのプロビジョニングプロファイルを追加しました。
このユーザーにはアカウントがないため、自分のアカウントでdevcenterにログインしました。プロビジョニング証明書をダウンロードし、Xcodeにロードしました。
たとえば、ビルドロールアカウント専用の証明書を追加しませんでした。ジェンキンス。
これをビルドスクリプトに追加しました:security unlock-keychain -p mySecretPassword as above、but ...
ファイル〜/ .ssh/mypassを作成し、ファイルにパスワードを追加しました。
コマンドは次のようになります。security unlock-keychain -p cat ~/.ssh/mypass
ビルドはチャンピオンのように機能しています。 ipaファイルを取得し、app centralで読み込み、デバイスで動作します。