デベロッパ・市場規模のせいか、iOSアプリのCI(継続的インテグレーション)に関する情報は簡単に見つかるが、macOSアプリやtvOSアプリのCIに関する情報はなかなか見つけにくい。長いこと苦戦してきたが、macOSアプリに関しては、ようやく良さげな解決策を見つけるところまで至ったので、ここに共有しておく。
やりたいことの確認
やりたいことは基本的に、一般的なiOSアプリのCIとほとんど変わらない。ソースコードに変更があったら自動的にテストを実行したり、App Storeへの申請用のビルドを作ってiTunes Connectにアップロードしたりする。なおiOSでは、実機テスト用に最新ビルドをTestFlightに上げ続けるような運用をしたりするが、macOSにはTestFlightはない。
CIを導入するメリットや目的も、iOSのそれと基本的には同じ。テストによる早期の不具合発見、テスト・申請用ビルドにかかるマシンパワーの節約・並列化による効率化、誰でもどこからでも申請用のビルドを作れるようにする、など。
使うツールやサービス
macOSのCI環境を整えるのに使うツールやサービスも、基本的にはiOSのそれと変わらない。ビルドやテストの実行にはxcodebuildコマンドを使い、iTunes Connectへのバイナリのアップロードにはfastlaneのdeliver等を使う。一連のフローの管理には、Jenkinsを使っても良いし、BitriseなどのCIサービスを使っても良い。ただし、慣れないうちはまずローカルでTerminalで動かしてみて、仕組みを理解した上でCIサービスを使わないと苦しむことになる。
なにが厄介なのか
当然ながら、細かい部分ではiOSとmacOSで違いが出てくる。例えば、iOSでCI環境下でテストを動かす場合にはシミュレータを使うが、macOSにはそのような機構はない。iOSの申請用のバイナリーファイルはipaだが、macOSの場合はpkgファイルをアップロードする。
これらの違いにより、ツールを叩くときのコマンドや設定が微妙に異なってくるのだが、ここに厄介な理由がある。
- ツールやサービスに関するほとんどの情報がiOS用に書かれており、macOS用の情報を見つけるのが難しい。
- ものによっては、macOS対応してなかったり、ちゃんとメンテされてなかったりする。あるいは、一見するとわからないような設定が追加で必要だったりする。
- macOSのビルド環境は変化が大きく、古い情報の通りには使えなかったりする。
上記の理由で、今までなかなか快適なmacOSアプリのCI環境を作れずにいたのだが、Xcode8のリリースなどもあり、ようやく快適な環境を作れるようになった。
というわけで、次のポスト以降で詳しい仕組みと、具体的な手順について説明していく。