以下は私のビルドスクリプトです(xcodebuildプラグインを使用していません)。
ロック解除コマンドが本当に成功しないように振る舞います。コマンドラインから経由でコードサインを実行しようとすると
codesign -f -s "iPhone Developer: mycert" -v sample.app/ --keychain /Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain
私は得る
CSSM_SignData returned: 000186AD
sample.app/: unknown error -2070=fffffffffffff7ea
ただし、コマンドラインから適切にエミュレートしているのかどうかはわかりませんが、
Sudo -u jenkins bash
xcodebuild ONLY_ACTIVE_Arch="NO" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" -scheme "MySchemeName" CONFIGURATION_BUILD_DIR="`pwd`"
security list-keychains -s /Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain
+ security default-keychain -d user -s /Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain
+ security unlock-keychain -p jenkins /Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain
+ security list-keychains
"/Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain"
"/Library/Keychains/System.keychain"
+ security default-keychain
"/Users/Shared/Jenkins/Library/Keychains/JenkinsCI.keychain"
+ codesign -f -s '$IDENTITY_GOES_HERE.' -v sample.app/
sample.app/: User interaction is not allowed.
どんな助けも大歓迎です。
Jenkinsは使用していませんが、ビルドオートメーションでこれを見たことがあります。解決方法は次のとおりです。
1)ビルドキーチェーンを作成します。これには、コード署名に使用される秘密鍵/証明書が含まれます。
security create-keychain -p [keychain_password] MyKeychain.keychain
Keychain_passwordはあなた次第です。後でこれを使用して、ビルド中にキーチェーンのロックを解除します。
2)CodeSign IDの秘密キー(* .p12)をインポートします。
security import MyPrivateKey.p12 -t agg -k MyKeychain.keychain -P [p12_Password] -A
ここで重要なのは「-A」フラグです。これにより、警告なしでキーチェーンにアクセスできます。これが、「ユーザーの操作は許可されていません」というエラーが表示される理由です。 Xcode UIを介してこのビルドを試みていた場合、これがキーチェーンへの「アクセスを許可」するように促すポイントです。
3)ただし、キーチェーンを保存している場合(例:ソース管理にチェックインしている場合)、ビルドユーザーが書き込みおよび実行可能であることを確認してください。
ビルドの準備ができたら、xcodebuildを実行する前に次を追加します。
# Switch keychain
security list-keychains -s "/path/to/MyKeyhain.keychain"
security default-keychain -s "/path/to/MyKeychain.keychain"
security unlock-keychain -p "[keychain_password]" "/path/to/MyKeychain.keychain"
ローカルで実行している場合は、ビルドスクリプトの最後に、ログインキーチェーン(〜/ Library/Keychains/login.keychain)に戻るものを追加することができます。例:
# Switch back to login keychain
security list-keychains -s "~/Library/Keychains/login.keychain"
security default-keychain -s "~/Library/Keychains/login.keychain"
試してみてください。使用するIDごとに個別のキーチェーンを作成します(お客様に代わって独自のビルドを作成します)。当社の場合、AppStoreとEnterpriseアカウントの両方があります。これにより、コード署名中に名前の競合が発生する可能性があります(例:両方のアカウントが「iPhone Distribution:ACME Corporation」に解決されます)。これらのIDを別々のキーチェーンに保持することにより、この競合を回避します。
証明書をシステムキーチェーンに移動し、それを参照することで問題が修正されました
「security unlock-keychain -p」に署名する前にキーチェーンのロックを解除する必要があります
この回答では、ログインキーチェーンを操作したり、デフォルトのキーチェーンを変更したりすることなく、iOS証明書を追加/削除します。
-T /usr/bin/codesign
を使用して証明書をインポートします一時的なキーチェーンを作成します。 PIDである$$
を追加しました。これは、複数の一時キーチェーンを同時に作成できるようにすることで、スクリプトを並列化できることを意味します。
# Create temp keychain
MY_KEYCHAIN="MyKeychain-$$.keychain"
MY_KEYCHAIN_PASSWORD="secret"
security create-keychain -p "$MY_KEYCHAIN_PASSWORD" "$MY_KEYCHAIN"
検索リストに一時的なキーチェーンを追加します。 security list-keychains -s
を使用してキーチェーンを追加するように注意してください。そうしないと、別のスレッドで実行されているビルドを上書きすることになります。
# Append keychain to the search list
security list-keychains -d user -s "$MY_KEYCHAIN" $(security list-keychains -d user | sed s/\"//g)
security list-keychains
自動再ロックタイムアウトなしで一時キーチェーンのロックを解除します(security set-keychain-settings
)。再ロックタイムアウトの修正を忘れた場合、デフォルトの再ロックタイムアウトよりも時間がかかるビルドはパスワードプロンプトをトリガーします。
# Unlock the keychain
security set-keychain-settings "$MY_KEYCHAIN"
security unlock-keychain -p "$MY_KEYCHAIN_PASSWORD" "$MY_KEYCHAIN"
IOS証明書をインポートし、パスワードプロンプトを要求せずに/usr/bin/codesign
アクセスを許可します。
# Import certificate
security import $CERT -k "$MY_KEYCHAIN" -P "$CERT_PASSWORD" -T "/usr/bin/codesign"
一時的なキーチェーンを使用し、証明書が1つしか含まれていないことがわかっているため、プログラムでIOS_IDENTITYを導出できます(ビルドステップへの入力として必要)。
# Detect the iOS identity
IOS_IDENTITY=$(security find-identity -v -p codesigning "$MY_KEYCHAIN" | head -1 | grep '"' | sed -e 's/[^"]*"//' -e 's/".*//')
IOS_UUID=$(security find-identity -v -p codesigning "$MY_KEYCHAIN" | head -1 | grep '"' | awk '{print $2}')
# New requirement for MacOS 10.12
security set-key-partition-list -S Apple-tool:,Apple: -s -k $MY_KEYCHAIN_PASSWORD $MY_KEYCHAIN
今すぐビルドしてください
# Insert your custom build steps
一時キーチェーンを削除します。これを行うと、検索リストから自動的にポップされることに注意してください。つまり、他のすべてのキーチェーンは残ります。
# Delete the temp keychain
security list-keychains
security delete-keychain "$MY_KEYCHAIN"
security list-keychains
すべての証明書/秘密キーを新しいキーチェーンにコピーしました(アイテムを右クリックして、コピーして貼り付けるだけです)。新しいキーチェーンで、各プライベートキーを右クリックし、[情報の取得]-> [アクセス制御]を選択して、すべてのアプリでキーを使用できるようにします。
重要なのは、キーチェーンアプリの左上にキーチェーンのリストがあることです。新しいキーチェーンがリストの最初になるようにそれらを並べ替えます。
私が見つけた別の答えは、ビルド中にこのキーチェーンのロックを解除するビルドステップを与えました:
KEYCHAIN=/Users/<you>/Library/Keychains/codesign.keychain
# the -s option adds $KEYCHAIN to the search scope, while the -d option adds $KEYCHAIN to the system domain; both are needed
security -v list-keychains -d system -s $KEYCHAIN
security -v unlock-keychain -p <keychain password> $KEYCHAIN
FWIW ...これの別の考えられる理由を捨てさせてください。重複する証明書が散らばっていて、codesign
がどの証明書を使用するかわからない場合があります。 Jenkinsスレーブからこのコマンドを実行すると、重複した有効な証明書が表示されますか?このようなもの:
$ security find-identity -v -p codesigning
1) AAAAE00066DED2FE77DF43012573AD5B6188AAAA "iPhone Developer: JOHN SMITH (XAAAAFSUSJ)"
2) AAAAE00066DED2FE77DF43012573AD5B6188AAAA "iPhone Developer: JOHN SMITH (XAAAAFSUSJ)"
3) BBBB5B03DB566209964247982908D3DD74D1BBBB "iPhone Distribution: Example, Inc. (TBBBBH5HUE)"
4) BBBB5B03DB566209964247982908D3DD74D1BBBB "iPhone Distribution: Example, Inc. (TBBBBH5HUE)"
5) BBBB5B03DB566209964247982908D3DD74D1BBBB "iPhone Distribution: Example, Inc. (TBBBBH5HUE)"
6) AAAAE00066DED2FE77DF43012573AD5B6188AAAA "iPhone Developer: JOHN SMITH (XAAAAFSUSJ)"
7) AAAAE00066DED2FE77DF43012573AD5B6188AAAA "iPhone Developer: JOHN SMITH (XAAAAFSUSJ)"
8) BBBB5B03DB566209964247982908D3DD74D1BBBB "iPhone Distribution: Example, Inc. (TBBBBH5HUE)"
8 valid identities found
もしそうなら、私は次のことを行い、署名証明書のベースラインセットに戻ることが有用であることがわかりました。
0 identifies
を実行して$ security find-identity -v -p codesigning
もう一度。MyApp.keychain
2つの有効な証明書が含まれています。重複をすべて削除してください。codesign
プロセスがnlockMyApp.keychain
をデフォルトとして設定します。これにより、codesign
で利用可能な証明書が公開されます。$ security find-identity -v -p codesigning
表示されるonlyにバンドルした証明書MyApp.keychain
およびシステムに他の署名IDがないこと。これを行った後でも重複が見られる場合、Jenkinsスレーブがこれらの証明書を認識している他の場所があります。これはコード署名エラーです。xcodebuildコマンドは、証明書がSSHでJenkinsのスレーブを介して実行されているため、証明書の秘密キーにアクセスできません。
アクセスを許可するためにxcodebuildを実行する前に、シェルスクリプトで次の行を実行します。
security set-key-partition-list -S Apple-tool:,Apple: -s -k <ROOT-PASSWORD> /Users/<YOUR USER NAME>/Library/Keychains/login.keychain-db
お役に立てば幸いです!
これは、キーチェーンのデフォルトのタイムアウトが原因の場合もあります。
Codesignを使用してOSXアプリに署名しようとする 「ユーザーインタラクションは許可されていません」に対する回答をご覧ください
ここで私のために働いたもの:
KEYCHAIN=/Users/<user>/Library/Keychains/jenkins_ios.keychain
security -v list-keychains -s $KEYCHAIN
security -v unlock-keychain -p <password> $KEYCHAIN
security set-keychain-settings -t 3600 -l $KEYCHAIN
デフォルトのロック解除タイムアウトはプロジェクトを適切にビルドするのに十分な長さではない可能性があるため、最後のステップは非常に重要です(これはプロジェクトで正確に発生しました。コードサインに必要でした)。
キーチェーン(ログインとシステム)から重複キーを削除し、機能し始めました。証明書は1つしかありませんでしたが、多くのキーがあったため、キーをフィルタリングして適切に表示する必要がありました。