[解決済み] OS X上のJenkins: xcodebuildでCode Signエラーが発生する
質問
概要
OS X での Jenkins のセットアップは、最新のインストーラー ( 1.449時点 - 2012年3月9日 )、しかし、コード署名のプロセスを管理することは、まだ非常に難しく、簡単な答えはありません。
動機
OS X上でサービスを実行するための一般的なベストプラクティスに従ったヘッドレスCIサーバーを実行する ( そのうちのいくつかは、ここで平易に説明されています ).
背景
- 2009 年 10 月 12 日-。 HudsonでiPhoneアプリのビルドを自動化する方法
- 2011年6月15日 - Mac OS X での Jenkins。git と ssh 公開鍵。
- 2011年6月23日 - JenkinsとTestFlightによるiOSアプリの継続的デプロイメント
- 2011年7月26日 - iOS および Mac 開発の Continuous Integration として Jenkins/Hudson を使用しているときに、キーチェーンに証明書と鍵が見つからない。
- 2011 年 8 月 30 日-。 Jenkins で Xcode プロビジョニング ファイルが見つかりません。
- 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をインストールする インストーラパッケージ . インストールタイプは、「カスタマイズ」ボタンをクリックし、「起動時に'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
OK、素晴らしい。これでデフォルトのキーチェーンができたので、次に進みましょう。しかし、まず、なぜわざわざデフォルトのキーチェーンを作ったのでしょうか?
私が調査中に読んだほとんどすべての回答、提案、または会話は、コード署名証明書とキーをシステムのキーチェーンにチャックすることを示唆していました。もし、あなたが
security list-keychains
を Jenkins のフリースタイルプロジェクトとして実行すると、利用可能なキーチェーンはシステムキーチェーンだけであることがわかります。しかし、これは非常に悪いアイディアのように思えます。
を開くには、パスワード付きのプレーンテキスト スクリプトを作成する必要があります。
.
問題2:コードサイニング証明書と秘密鍵の追加
ここが本当に不安になり始めるところです。Jenkinsで使用するために、新しい公開鍵/秘密鍵を作成する必要があると直感的に感じています。私の思考プロセスは、jenkins デーモンが侵害された場合、Apple の Provisioning Portal で証明書を簡単に失効させ、別の公開鍵/秘密鍵を生成することができます。もし私が自分のユーザーアカウントとJenkinsに同じキーと証明書を使うなら、jenkinsサービスが攻撃された場合、より多くの手間(損害?
ポインティング サイモン・アーバネク氏の回答 は、プレーンテキストのパスワードでスクリプトからキーチェーンのロックを解除することになります。jenkinsデーモンのキーチェーンに使い捨ての証明書と鍵以外を保持するのは無責任だと思います。
私は、反対の議論に非常に興味があります。私は過度に慎重なのでしょうか?
ターミナルでjenkinsデーモンとして新しいCSRを作成するために、私は次のようにしました...
-
sudo su jenkins
-
certtool r CertificateSigningRequest.certSigningRequest
次のようなプロンプトが表示されます (これらのほとんどは、私が経験的に正しい答えを推測したものですが、あなたはもっと良い洞察をお持ちですか?共有してください)...- キーと証明書のラベルを入力します。
-
アルゴリズムを選択します。
r
(RSAの場合) -
鍵のサイズをビット数で入力します。
2048
-
署名アルゴリズムを選択します。
5
(MD5の場合) - チャレンジ文字列を入力します。
- 次に、RDNへの質問の数々
- 生成された CSR ファイル (CertificateSigningRequest.certSigningRequest) を新しい Apple ID で Apple の Provisioning Portal に提出します。
- 要求を承認し、.cer ファイルをダウンロードする
-
security unlock-keychain
-
security add-certificate ios_development.cer
これで一歩近づいた...。
問題 3: プロビジョニング プロファイルとキーチェーンのロック解除
何か悪いことが起こったときに少しでも影響が小さくなるようにと、CI で使用するためだけに特別なプロビジョニング プロファイルを Provisioning Portal で作成しました。ベスト プラクティスですか、それとも慎重すぎますか?
-
sudo su jenkins
-
mkdir ~/Library/MobileDevice
-
mkdir ~/Library/MobileDevice/Provisioning\ Profiles
- Provisioning Portal で設定したプロビジョニングプロファイルを、この新しいフォルダーに移動します。 これで、コマンドラインから jenkins として xcodebuild を実行できるようになるまであと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: デフォルトのキーチェーンがまだ利用できない!
( EDIT: 私の質問の編集を投稿し、私の解決策が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 ページを読むこともお勧めします - ここまで端末で行ったのですから、そうですよね?
このセットアップは完璧ではありません。どんなアドバイスや洞察も大いに結構です。
私が問題を解決するために使用するようになったのは、ほぼ全員の意見を集めたものだったので、正しい答えを選択するのに苦労しました。私は、少なくとも全員に一票を投じようとしましたが、Simon が元の質問にほとんど答えてくれたので、Simon に答えを渡しました。さらに Sami ティッカ は、JenkinsをAppleScriptを通してOS Xアプリとして動作させるという彼の努力に対して、多くの賞賛を受けるに値すると思います。もしあなたがユーザー セッション内で Jenkins を素早く立ち上げることだけに興味があるなら (つまりヘッドレス サーバーとしてではなく)、彼のソリューションはより Mac に近いものです。
私の取り組みがさらなる議論を呼び起こし、iOSプロジェクトのためにJenkins CIを週末にセットアップできると考えている次の貧しい人たちの助けになることを願っています。
更新日: 2013年8月9日
多くのアップヴォートとお気に入りをいただいたので、1年半後にこの記事に戻ってきて、いくつかの簡単な教訓を述べようと思います。
教訓 1: Jenkins を公共のインターネットに公開してはならない
2012 年の WWDC で、私はこの質問を Xcode と OS X Server のエンジニアに投げかけました。私が尋ねた誰からも、「そんなことはするな!」という声が上がりました。彼らは皆、自動ビルドプロセスは素晴らしいが、サーバーはローカルネットワーク上でのみアクセス可能であるべきだという点で意見が一致しました。OS X Server のエンジニアは、VPN を介してリモート アクセスを許可することを提案しました。
教訓 2: 今では新しいインストール オプションがある
私は最近、CocoaHeadsで私のJenkinsの経験について講演しましたが、驚いたことに、いくつかの新しいインストール方法を見つけました - Homebrewと、さらにその中の一つである Bitnami Mac App Store バージョンもあります。これらは間違いなくチェックアウトする価値があります。 ジョナサン・ライト を手に入れるための詳細な要点があります。 自作Jenkinsの動作 .
教訓3: いや、マジで、ビルドボックスをインターネットに晒してはいけない
元の投稿から明らかなように、私はシステム管理者でもセキュリティの専門家でもありません。プライベートなもの (キーチェーン、クレデンシャル、証明書など) についての常識は、私の Jenkins ボックスをインターネット上に置くことについてかなり不安な気持ちにさせました。 ニック・アーノット のNick Arnottは、私のヒヤヒヤをかなり簡単に確認することができました。 この記事 .
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
に影響しますが、他のプロセスにも影響します)。
関連
-
[解決済み] macOSアップデート後、Gitが動作しない(xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)
-
[解決済み] Jenkinsを手動で再起動する方法は?
-
ffiのコンパイルに失敗しました *** extconf.rbに失敗しました *** 解決策
-
[解決済み】macOSでDockerデーモンに接続できない。
-
[解決済み] OSXアプリにcodesignで署名しようとすると、"User interaction is not allowed "と表示される。
-
[解決済み] Xcode 5: コード署名のエンタイトルメントエラー
-
[解決済み] MacVimをOS Xにインストールするにはどうしたらいいですか?
-
[解決済み] OS X で $PATH 変数の現在の値を見るにはどうしたらいいですか?
-
[解決済み] Mac OS X での Vim Insert Mode
-
[解決済み] Mac OSXでJDK 7を使用するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
BlackApple-Minisforum u820 opencore0.6.9 config.plist
-
[解決済み] nginx の "ssl" ディレクティブは非推奨、"listen ... ssl" を使用すること。
-
[解決済み] Macターミナルのポップアップやアラートを出すには?アップルスクリプト?
-
[解決済み] MacでMonoDevelopを複数起動するにはどうしたらいいですか?
-
[解決済み] docker-machineのメモリを増やす方法 Mac
-
[解決済み] grep -P が効かなくなりました。どうすれば検索を書き換えることができますか?
-
[解決済み] Visual Studio Codeで隠しファイルを表示する方法
-
[解決済み] YosemiteとValgrind
-
[解決済み] pkgファイルを解凍・梱包する方法を教えてください。
-
[解決済み] Terminalでビープ音を無効にしたい - Mac OSX [終了しました]。