先日、Apple の証明書を更新したところ、CI で実行していたビルドが失敗するようになりました。
証明書とか provisioning profile をマシン上で更新するのに失敗したのかなと思ったのですが、そうでも無さそうで、しばらく悩んでいました。
実際に叩いているコマンドはこのような感じに、署名関係のパラメータをがっつり指定しています。
(この前段階で Unity のビルドが走っていて Xcode プロジェクトをはき出しますが、その後 Xcode のアーカイブ時には自動で探してくれるのでここで指定しなくても良いんじゃないか、という話もありますね)
% xcodebuild -project Unity-iPhone.xcodeproj\
clean\
archive\
-archivePath ./build/Unity-iPhone.xcarchive\
-scheme Unity-iPhone\
-configuration Release\
CODE_SIGN_IDENTITY='iPhone Distribution: XXXXXXX'\
PROVISIONING_PROFILE_SPECIFIER=xxxxxxxxxx\
DEVELOPMENT_TEAM=XXXXXXXXX
で、ここで、そんな証明書は見つかりませんよ、と言われてしまうわけです。
証明書の更新後にコードサイニングが通らないときに確認するのは、以下の2つかなと思います。
ついでなので少し触れると、
新旧の provisioning profile があると、古い方を使ってしまうことがあるので、 ~/Library/MobileDevice/Provisioning Profiles
の古い方を削除します。
個人的には全部削除して、全部登録し直すようにスクリプトを書いています。
CI でビルドが失敗して、実際にマシンを覗いてみると、パスワードのダイアログが出ていて入力待ち状態だったりします。
初回だけだと思ってうっかり手作業で 次回以降確認しない
にチェック入れて確認してしまうと、更新後にこういう事態に陥るのでやめたほうが良いですね。
ビルドスクリプトで、 security unlock-keychain -p <PASSWORD> /path/to/xxx.keychain
とやることが多いでしょうか。
あるいは、CI 専用のマシンに関しては、システムのキーチェーンに追加してアクセス制御をすべて許可してしまうという運用もあります。
手作業でもできますが、コマンドでセットアップするには、以下のような感じでできます。
sudo security import xxxxxxxxx.p12 -A -P <PASSWORD> -k /Library/Keychains/System.keychain
結局、上記の問題はなく、エラーの内容も特に目新しいものではなかったので、行き詰まってしまったのですが、ふと証明書のファイルを覗いてみると新旧で違いがあることに気が付きました。
新しい証明書(下の画像左)は iPhone Distribution: XXXXXXX
なのに対し、
古い証明書(下の画像右)は Apple Distribution: XXXXXXX
です。
ということなので、冒頭のコマンドの
CODE_SIGN_IDENTITY='iPhone Distribution: XXXXXXX'\
の部分を
CODE_SIGN_IDENTITY='Apple Distribution: XXXXXXX'\
と変更すれば良かったのでした。
なぜ変わったのというと、作成時に Apple Development
で作成していたからでした。
以前は Apple Development はなかったような気がするのですが、気のせいでしょうか。
Xcode 11 のリリースノートで「新しい証明書タイプをサポートした。前のバージョンは引き続き有効だけど、Xcode 11 で新しく作成すると新しい証明書タイプになるよ」と書いてあるので、このタイミングで Apple Development が作成できるようになったんでしょうか。
Xcode 11 supports the new Apple Development and Apple Distribution certificate types. These certificates support building, running, and distributing apps on any Apple platform. Preexisting iOS and macOS development and distribution certificates continue to work, however, new certificates you create in Xcode 11 use the new types. Previous versions of Xcode don’t support these certificates. (45527608)
証明書の更新は年に一度のことなので、原因にたどり着くまで時間がかかってしまいました。