iOS アプリのビルドから ad hoc 公開まで自動化しようとした過程で躓いたので、
備忘録を兼ねてここに記します。
#要約
xcodebuild のパラメタの
CODE_SIGN_IDENTITY は "iPhone Distribution: XXXXXX XXXXXX (XXXXXXXXXX)" を
PROVISIONING_PROFILE はすべて小文字で表記された UUID を正確にコピペしていることを確認したうえで、
launchctl に読み込ませている plist に以下のプロパティを設定する。
- UserName : iPhone Distribution の証明書をインストールしたユーザーのアカウント名 (not 表示名)
- GroupName : UserName で指定したユーザーが所属するグループ名 (基本的には staff だと思う。)
- SessionCreate : true にする。 (公式のドキュメントは見つからなかったが、どうも環境設定やデフォルト参照する keychain の初期化を行うかのフラグらしい。)
もう少し具体的に plist の中身を示すとこんな感じ。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>(サービスを区別するために使用する識別子)</string>
<key>UserName</key>
<string>hogehoge</string>
<key>GroupName</key>
<string>staff</string>
<key>SessionCreate</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/path/to/start_jenkins.sh</string>
</array>
</dict>
</plist>
(追記)
上記の設定をした上で /path/to/start_jenkins.sh にて jenkins を起動する直前に
security unlock-keychain -p <password>
を実行する必要がありました。
#経緯
当初、とりあえず El Capitan な macbook air 1 台に nginx をフロントに立たせて jenkins を jar から起動して環境構築を行っていました。
いろいろと試行錯誤しながらもとりあえずビルドが通る様になったので、
jenkins も jar を直接立ち上げるのではなく、
launchd で起動時に勝手に立ち上がるように (root 直下の) /Library/LaunchDaemons/ に plist を追加して、いざ launchctl load
をしてみた。
…起動はうまく行った。
しかし、この修正を行った途端に xcodebuild の終盤、署名を行うタイミングでコケるように。
先ほどはビルドは通ったとは言え、間違えていじってしまったかと思い xcodebuild に渡していたパラメータをチェックするも、
CODE_SIGN_IDENTITY や PROVISIONING_PROFILE に指定ミスは無かったので、
いろいろと原因を探っていましたが、
ふと前に手動で mac の端末移行のためのバックアップをした時に ~/Library/Keychains/login.keychain ファイルをコピーしたことを思い出し、
おもむろに jenkins のタスク内で security list-keychains
をしてみた。
すると
+ security list-keychains
"/Library/Keychains/System.keychain"
"/Library/Keychains/System.keychain"
と、証明書の鍵が入っているであろう ~/Library/Keychains/login.keychain は読み込まれていないことが発覚。
そこでこれを頼りにいろいろ調べてみると、security default-keychain
と security unlock-keychain
コマンドを jenkins の起動直前に叩くようにする方法が見つかるも、
unlock-keychain するためには平文でパスワードをパラメタとして渡さなければいけないので、なるべく避けたい。
より検索の深みに嵌っていったところで、SessionCreate の情報を掴み試してみたところこれがビンゴ。
その結果、上の要約に書いた設定に落ち着きました。
めでたしめでたし。 (だといいなぁ…。)
(追記)
結局、security unlock-keychain -p <password>
を jenkins を起動する直前に実行しないと署名が正しく完了しませんでした。