logo サブスレッド

ssh越しにfastlaneでiOSアプリのビルド

おひさしぶりです tama です!
なんと1年以上ぶりでしたorz

わたくし普段から実務を担当させてもらえない系の窓際なんですが、
このたび本社にある「ビルドマシン」と呼ばれる iMacの設定(というか動作確認)を頼まれまして。
ちょっとハマったので情報を共有しておきます。

What is ビルドマシン?

iOSアプリ、ビルド環境の影響を受けることが稀によくあります。
Xcodeのバージョンが違うとかプロビジョニングプロファイルがどうだとか。
リリース用のバイナリを普段と違う環境でビルドすると意図しない挙動の違い(≒バグ)を生むといけないので極力一定の環境下でリリース用バイナリを作りたい &
ビルドに時間がかかったりマシンパワーを持っていかれるのでリリース用バイナリはローカルマシン以外で作りたい、
みたいなニーズがあって、ビルド専用のmacを置くことになりました(というか以前から置いていました)。

具体的には本社(固定IP)に VPN して LAN内にある iMac に ssh し、以前むおおおお紹介してくれた fastlane を使ってリリース用の .ipa バイナリを作ります。
VNC接続してGUIを使うよりお手軽簡単なのです。

ssh経由で署名ができない

掲題の通りです。
Fastlane でビルドを進めていっても

 Generating 'hoge.app.dSYM'
** ARCHIVE FAILED **


The following build commands failed:
PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks /Users/subthread/Library/Developer/Xcode/DerivedData/
(1 failure)
[18:07:41]: Exit status: 65

みたいなエラーになってしまいます。

[18:07:41]: Maybe the error shown is caused by using the wrong version of Xcode
[18:07:41]: Found multiple versions of Xcode in '/Applications/'
[18:07:41]: Make sure you selected the right version for your project
[18:07:41]: This build process was executed using '/Applications/Xcode10.2.1.app'
[18:07:41]: If you want to update your Xcode path, either
[18:07:41]: 
[18:07:41]: - Specify the Xcode version in your Fastfile
[18:07:41]: ▸ xcversion(version: "8.1") # Selects Xcode 8.1.0
[18:07:41]: 
[18:07:41]: - Specify an absolute path to your Xcode installation in your Fastfile
[18:07:41]: ▸ xcode_select "/Applications/Xcode8.app"
[18:07:41]: 
[18:07:41]: - Manually update the path using
[18:07:41]: ▸ sudo xcode-select -s /Applications/Xcode.app

というアドバイスもありますが、やってみても結果は変わりません。
(/Applications/Xcode10.2.1.app を使っています)
もう少し下を見てみると

/usr/bin/codesign --force --sign xxxx  --preserve-metadata=identifier,entitlements '/Users/subthread/Library/Developer/Xcode/DerivedData/〜'
/Users/subthread/Library/Developer/Xcode/DerivedData/〜: errSecInternalComponent
Command PhaseScriptExecution failed with a nonzero exit code

と、/usr/bin/codesign が errSecInternalComponent しているのがわかります。

ちなみに VNC接続したビルドマシンのデスクトップ上でターミナルを起こして同じ手順で fastlaneでビルドした場合は問題なくビルドが完了します。
どうやらssh越しでは秘密鍵にアクセスできないようです。
(ビルドマシンのターミナル上でも fastlaneビルドが通らない場合はキーチェーンアクセスを開いて秘密鍵のアクセス制御に /usr/bin/codesign を加えてやる必要があります。参考

でかいけつ

こちらでかいけつ。
ssh したセッション上で security unlock-keychain login.keychain とコマンドして(管理者ユーザの?)パスワードを入力します。
正しいパスワードを入力できればしばらくキーチェーンアクセスの秘密鍵が使えるようになります!
脳内でスーパーマリオの無敵BGMを流しながら fastlane でビルドしてください。
一息ついたら Fastfile を調整してビルド開始時に unlock-keychain するようにしたらもう二度とハマらないかなと思います。

日本語情報が乏しかったので参考までに。

現在の位置:サブスレッド ホーム > 技術ブログ > ssh越しにfastlaneでiOSアプリのビルド