Bitrise Xcode 8.1などのSierra製CIマシンとfastlaneの組み合わせでビルドが固まる問題が解決🎉

mono 
Swift・iOSコラム
5 min readNov 15, 2016

--

Sierraのキーチェーン周りに変更があり、初回ビルド時にパーミッション許可ダイアログが出て 通常Allowボタンを押さないと続行出来ないようになりました。その影響で、CI環境などコマンドラインベースの場合、そのタイミングでハング( Signing で固まる)するようになってしまいました。

Bitriseはさすがで、いち早くWorkflowをそれに対応していました。

ただ、個人的にはあまりCIサービスに依存することなく、ローカルでもほぼ同じ手順で解決出来るような状態を維持したいという思いもあり、Bitrise依存のWorkflowはほぼ使わず、fastlane で完結させるようにしていました。というわけで、fastlaneの対応を待っていました。

fastlaneも対応

バージョン1.108で対応したようです。ただ、それでもBitrise上でのビルドで固まる状態は解消せず、悩んでいました。
fastlaneのIssueで相談するか迷っていたら、2日前に同じく困っている方からコメントがあり今朝Issueも再オープンされました
自分と全く同じ症状で、また解決出来そうな対応案も書かれていたので試してみたら、無事に解決しました

Bitrise x fastlaneでの解決策

BitriseでXcode 8.1ビルドする場合、そのマシンはSierraとなっていて、Sierra上でビルドする際の問題を解決する必要がありました。

fastlaneでの証明書周りの管理は現状 match を利用するのが良いと判断していて、それを愛用しています。バージョン1.108では問題は対応されつつも、matchをこれまで通り利用するだけでは、同じ症状に陥ってしまうということが今回悩まされていた問題と分かりました。

具体的には、キーチェーンのパスワードを入力して許可する必要がありました。自分のマシンの場合はログインパスワードを入力すれば良いのですが、CIマシン上での場合は新しくキーチェーンを名前・パスワード付きで作成して、match実行時にそれを用いる、という手順が必要でした。

コードとしては、MATCH_KEYCHAIN_NAME・MATCH_KEYCHAIN_PASSWORDに適当な値を環境変数としてセットした上で、以下をmatchコマンド前に実行すれば解決しました。

private_lane :create_temporary_keychain do
create_keychain(
name: ENV["MATCH_KEYCHAIN_NAME"],
password: ENV["MATCH_KEYCHAIN_PASSWORD"],
timeout: 1800
)
end

以下がポイントです。

  • 任意の名前・パスワードでキーチェーンを作成しておくこと
  • matchでそのキーチェーンを用いること(MATCH_KEYCHAIN_NAME・MATCH_KEYCHAIN_PASSWORDが使われる)
  • timeoutをビルド所要時間以上に設定(上の例の場合余裕を持って30分)

CIサービス・fastlane不調時のリスクヘッジ

こういう外部環境・サービス・ライブラリに依存すると、それが壊れた時に開発が滞るのでは?という心配もありますが、個人的にはBitrise・fastlaneの組み合わせはあまり問題無い(個人で工夫するより得策)と思っています。

  • fastlane はスタンダードになりつつあり、問題が生じても解決が速い
  • fastlane はオープンソースなのでいざとなれば自分で直せる
  • Bitrise の最新版追従が早い
  • CI環境ならではの機能に依存しなければ、手元のマシンでfastlaneのレーンコマンドを実行すればしばらくしのげる(今回は2週間ほどこれでしのいでましたが、ちょっと不便・面倒程度で、大きなボトルネックにはならずでした)
  • そもそも、自前のシェルスクリプトなどで解決するにしても、Apple・iTunesConnectの変更に追従する手間などかかるので、それを統一的に解決しようとしているfastlaneに頼ったり一緒に育てていく感じが効率的に思っている

fastlane・Bitriseの組み合わせで最近ずっと安泰でしたが、久々にハマりつつも、解決してホッとしたという話でした。手元でfastlaneコマンド実行で何とかなるとはいえ、GitでPushしただけでビルド・配布してくれるのがやはり快適だなと、環境復活して改めて思いました( ´・‿・`)

--

--