1. ホーム
  2. macos

[解決済み] OS X上のJenkins: xcodebuildでCode Signエラーが発生する

2022-11-22 05:32:55

質問

概要

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プロンプトを表示させることができます。

  1. sudo su jenkins
  2. cd ~/Library
  3. mkdir Keychains
  4. cd Keychains
  5. security create-keychain <keychain-name>.keychain
  6. security default-keychain -s <keychain-name>.keychain

OK、素晴らしい。これでデフォルトのキーチェーンができたので、次に進みましょう。しかし、まず、なぜわざわざデフォルトのキーチェーンを作ったのでしょうか?

私が調査中に読んだほとんどすべての回答、提案、または会話は、コード署名証明書とキーをシステムのキーチェーンにチャックすることを示唆していました。もし、あなたが security list-keychains を Jenkins のフリースタイルプロジェクトとして実行すると、利用可能なキーチェーンはシステムキーチェーンだけであることがわかります。しかし、これは非常に悪いアイディアのように思えます。 を開くには、パスワード付きのプレーンテキスト スクリプトを作成する必要があります。 .

問題2:コードサイニング証明書と秘密鍵の追加

ここが本当に不安になり始めるところです。Jenkinsで使用するために、新しい公開鍵/秘密鍵を作成する必要があると直感的に感じています。私の思考プロセスは、jenkins デーモンが侵害された場合、Apple の Provisioning Portal で証明書を簡単に失効させ、別の公開鍵/秘密鍵を生成することができます。もし私が自分のユーザーアカウントとJenkinsに同じキーと証明書を使うなら、jenkinsサービスが攻撃された場合、より多くの手間(損害?

ポインティング サイモン・アーバネク氏の回答 は、プレーンテキストのパスワードでスクリプトからキーチェーンのロックを解除することになります。jenkinsデーモンのキーチェーンに使い捨ての証明書と鍵以外を保持するのは無責任だと思います。

私は、反対の議論に非常に興味があります。私は過度に慎重なのでしょうか?

ターミナルでjenkinsデーモンとして新しいCSRを作成するために、私は次のようにしました...

  1. sudo su jenkins
  2. certtool r CertificateSigningRequest.certSigningRequest 次のようなプロンプトが表示されます (これらのほとんどは、私が経験的に正しい答えを推測したものですが、あなたはもっと良い洞察をお持ちですか?共有してください)...
    • キーと証明書のラベルを入力します。
    • アルゴリズムを選択します。 r (RSAの場合)
    • 鍵のサイズをビット数で入力します。 2048
    • 署名アルゴリズムを選択します。 5 (MD5の場合)
    • チャレンジ文字列を入力します。
    • 次に、RDNへの質問の数々
  3. 生成された CSR ファイル (CertificateSigningRequest.certSigningRequest) を新しい Apple ID で Apple の Provisioning Portal に提出します。
  4. 要求を承認し、.cer ファイルをダウンロードする
  5. security unlock-keychain
  6. security add-certificate ios_development.cer

これで一歩近づいた...。

問題 3: プロビジョニング プロファイルとキーチェーンのロック解除

何か悪いことが起こったときに少しでも影響が小さくなるようにと、CI で使用するためだけに特別なプロビジョニング プロファイルを Provisioning Portal で作成しました。ベスト プラクティスですか、それとも慎重すぎますか?

  1. sudo su jenkins
  2. mkdir ~/Library/MobileDevice
  3. mkdir ~/Library/MobileDevice/Provisioning\ Profiles
  4. Provisioning Portal で設定したプロビジョニングプロファイルを、この新しいフォルダーに移動します。 これで、コマンドラインから jenkins として xcodebuild を実行できるようになるまであと2歩です。つまり、Jenkins CI でビルドを実行できるようになるのもあと少しです。
  5. security unlock-keychain -p <keychain password>
  6. 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 に影響しますが、他のプロセスにも影響します)。