概要:
OS XでのJenkinsの設定は、最新のインストーラー(1.449-2012年3月9日現在)で大幅に簡単になりましたが、コード署名のプロセスの管理は非常に難しく、簡単な答えはありません。
動機:
OS Xでサービスを実行するための一般的なベストプラクティスに準拠したヘッドレスCIサーバーを実行します(その一部は平文で説明されています)。
バックグラウンド:
- 2009年10月12日-HudsonでiPhoneアプリのビルドを自動化する方法
- 2011年6月15日-Mac OS X上のJenkins。git w / ssh公開鍵
- 2011年6月23日-JenkinsとTestFlightによるiOSアプリの継続的な展開
- 2011年7月26日-iOSおよびMac開発の継続的インテグレーションとしてJenkins / Hudsonを使用しているときに、キーチェーンに証明書とキーがない
- 2011年8月30日-XcodeプロビジョニングファイルがJenkinsで見つかりません
- 2011年9月20日-MacでJenkins CIをセットアップする方法
- 2011年9月14日-MacでJenkinsを実行する
- 2011年11月12日- ハウツー:OS XにJenkinsをインストールしてMacのものをビルドする
- 2012年1月23日- 今後のJenkins OSXインストーラーの変更
- 2012年3月7日-OSXインストーラーをご利用いただきありがとうございます
処理する:
OS X インストーラパッケージを介してJenkins CIをインストールします。「Installation Type」のステップで、「Customize」ボタンをクリックし、「Start at boot as '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
...「デフォルトのキーチェーンが見つかりませんでした」と表示されます
以下でIvo Dancetが指摘しているように、jenkinsデーモンのUserShellはデフォルトで/ 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
わかりました。これでデフォルトのキーチェーンができました。右に進みましょうか?しかし、最初になぜデフォルトのキーチェーンを作成する必要があったのでしょうか?
調査中に読んだほぼすべての回答、提案、または会話は、コード署名証明書とキーをシステムのキーチェーンに組み込むだけでよいことを示唆しています。security list-keychains
Jenkinsでフリースタイルのプロジェクトとして実行すると、使用可能な唯一のキーチェーンがシステムキーチェーンであることがわかります。ほとんどの人が証明書と鍵をそこに置くというアイデアを思いついたのは、そこだと思います。ただし、これは非常に悪い考えのように思えます。特に、キーチェーンを開くためにパスワードを使用してプレーンテキストのスクリプトを作成する必要がある場合を考えます。
問題2:コード署名証明書と秘密鍵を追加する
これは私が本当にきしむようになり始めるところです。Jenkinsで使用するための一意の新しい公開鍵/秘密鍵を作成する必要があると直感しています。私の思考プロセスは、jenkinsデーモンが危険にさらされている場合、Appleのプロビジョニングポータルで証明書を簡単に失効させ、別の公開鍵/秘密鍵を生成することです。ユーザーアカウントとJenkinsに同じキーと証明書を使用すると、jenkinsサービスが攻撃された場合に面倒(ダメージ?)になります。
指しているサイモンUrbanekの答えあなたはプレーンテキストのパスワードを使用してスクリプトからキーチェーンのロックを解除することがあります。jenkinsデーモンのキーチェーンに「使い捨て」の証明書とキー以外のものを保持することは無責任だと思われます。
私はそれとは反対の議論に非常に興味があります。私は過度に注意していますか?
ターミナルでjenkinsデーモンとして新しいCSRを作成するには、次のようにしました...
sudo su jenkins
certtool r CertificateSigningRequest.certSigningRequest
以下の入力を求められます(これらのほとんどは、正しい答えで知識に基づいた推測をしました。より深い洞察がありますか?共有してください。)...- キーと証明書ラベルを入力してください:
- アルゴリズムを選択:
r
(RSAの場合) - 鍵のサイズをビットで入力してください:
2048
- 署名アルゴリズムを選択:
5
(MD5の場合) - チャレンジ文字列を入力してください:
- 次に、RDNに関するたくさんの質問
- 生成されたCSRファイル(CertificateSigningRequest.certSigningRequest)を新しいApple IDでAppleのプロビジョニングポータルに送信します。
- リクエストを承認し、.cerファイルをダウンロードします
security unlock-keychain
security add-certificate ios_development.cer
これにより、一歩近づきます...
問題3:プロビジョニングプロファイルとキーチェーンのロック解除
CIで使用するためにプロビジョニングポータルで特別なプロビジョニングプロファイルを作成しました。何か問題が発生した場合の影響を少し小さくしたいと考えています。ベストプラクティスまたは過度に慎重ですか?
sudo su jenkins
mkdir ~/Library/MobileDevice
mkdir ~/Library/MobileDevice/Provisioning\ Profiles
- プロビジョニングポータルで設定したプロビジョニングプロファイルをこの新しいフォルダーに移動します。コマンドラインからxcodebuildをjenkinsとして実行できるようになるまで、もう2ステップです。つまり、Jenkins CIでビルドを実行できるようになります。
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ページも読むことをお勧めします-ターミナルでここまでたどり着きましたね?
この設定は完璧ではなく、アドバイスや洞察は大歓迎です。
私が問題を解決するために使用するようになったのは、ほぼすべての人の入力のコレクションであったため、「正しい」答えを選択するのに苦労しました。私は全員に少なくとも賛成票を投じようとしましたが、サイモンは元の質問にほとんど答えたので、サイモンに回答を与えました。さらに、Sami Tikkaは、JenkinsをAppleScriptを介してプレーンなOS Xアプリとして動作させる彼の努力に多大な貢献をしました。Jenkinsを起動してユーザーセッション内ですばやく移動することだけに関心がある場合(つまり、ヘッドレスサーバーとしてではない場合)、彼のソリューションはMacに非常に似ています。
私の努力がさらなる議論の火付け役となり、週末にiOSプロジェクトのJenkins CIセットアップを手に入れられると思っている次の貧しい人々が、それについて聞いたすべての素晴らしいことを助けてくれることを願っています。
更新:2013年8月9日
非常に多くの賛成投票とお気に入りがあり、18か月後、いくつかの簡単な教訓を得て、これに戻ると思いました。
レッスン1:ジェンキンスを公共のインターネットに公開しないでください
2012 WWDCで、私はこの質問をXcodeおよびOS X Serverエンジニアに尋ねました。「やめろ!」というカコフォニーを受け取った。私が尋ねた人から。彼らは全員、自動化されたビルドプロセスは優れているが、サーバーはローカルネットワーク上でのみアクセス可能である必要があることに同意しました。OS X Serverエンジニアは、VPN経由のリモートアクセスを許可することを提案しました。
レッスン2:新しいインストールオプションが追加されました
私は最近、CocoaHeadsに私のJenkinsの体験について話しました。そして驚いたことに、いくつかの新しいインストール方法を見つけました-HomebrewとBitnami Mac App Storeバージョンです。これらは間違いなくチェックアウトする価値があります。Jonathan Wrightが、Homebrew Jenkinsを機能させるための詳細を説明しています。
レッスン3:いいえ、真剣に、ビルドボックスをインターネットに公開しないでください
私がシステム管理者でもセキュリティの専門家でもないことは、元の投稿からかなり明らかです。private-yのもの(キーチェーン、資格情報、証明書など)についての常識は、私がJenkinsボックスをインターネットに置くことについてかなり不安を感じさせました。この記事では、Neglected PotentialのNick Arnottが私の嫌悪感をかなり簡単に確認できました。
TL; DR
ビルドプロセスを自動化しようとしている他の人への私の推奨は、過去1年半で変わりました。Jenkinsマシンがファイアウォールの背後にあることを確認してください。インストーラー、Bitnami Mac App Storeバージョン、Sami TikkaのAppleScriptなどを使用して、JenkinsをインストールしてJenkins専用ユーザーとして設定します。これにより、上記で詳述した頭痛のほとんどが解決されます。リモートアクセスが必要な場合は、OS X ServerでのVPNサービスのセットアップに10分かかります。私はこのセットアップを1年以上使用しており、非常に満足しています。幸運を!