Unity で iOS のアプリをビルドするとき、毎回手動 :hand: で実行するのは面倒くさい。 fastlane :rocket: を使って、Unity プロジェクトから XCode プロジェクトを書き出して ipa を作成するまでを自動化する。

前回 は、CLI で Unity から Xcode プロジェクトの書き出しおよび設定まで行った。 今回は、fastlane を使って、ipa の書き出しを自動化する。

概要

  • Unity を batchMode で起動する action を定義する
  • lane を定義する
  • lane を実行する

環境

  • Unity 5.3.4f1
  • fastnale 1.94.0

基本的なこと

Unity を batchMode で起動する action を定義する

前回「Builder.cs を CLI から実行する」でやったように、CLI から Unity を batchMode で起動すると、Unity の Editor スクリプトを実行することができる。 fastlane には sh action があるので、それを使ってコマンドを実行しても良いが、どうせなら action 化しておく方が lane の定義がすっきりするので、action 化する。

まずは、コマンドで雛形をつくる。

$ fastlane new_action

生成されたテンプレートを元に run メソッドや available_options メソッドを実装していく。

fastlane/actions/unity.rb

内容は、渡されたオプションに従ってコマンドを組み立て、sh action を使って実行しているだけ。 オプションはとりあえず今使う分しか用意していない。YAGNI。

:bulb: Jenkins から実行したときに、2 回に 1 回ぐらい NSDocumentController Info.plist warning で失敗したので、 -nographics オプションを付けた。

ただし、Unity マニュアルに

Please note -nographics will not allow you to bake GI on OSX, since Enlighten requires GPU acceleration.

とあるので、そこは注意する。

lane を定義する

用意した unity action を使って lane を実装していく。 せっかく unity action を作ったので、ビルド用 lane だけでなく、テストを実行する lane も定義してみる。

まずは、コマンドで雛形をつくる。

$ fastlane init

生成されたテンプレートを元に lane を実装していく。

fastlane/Fastfile

:bullettrain_side: beta lane

ipa をビルドして、DeployGate にアップロードする。

  1. unity で Xcode プロジェクトを書き出す
  2. sigh で Provisioning Profile をダウンロードする
  3. gym で ipa をビルドする
  4. changelog_from_git_commits で Git の commit メッセージ一覧を取得する
  5. deploygate で DeployGate に ipa をアップロードする

今回作ったのは unity action だけ。既存の action を使うことで、ビルドスクリプトが簡単に書ける。

:bulb: action の一覧はコマンドで。

$ fastlane actions

:bullettrain_side: test_unit lane

Unity Editor Test を実行する。unity action のオプションについては、:memo: Unity で ユニットテストをする を参照。

:bullettrain_side: test_integration lane

integration test を実行する。unity action のオプションについては、:memo: Unity で ユニットテストをする(非同期編) を参照。

lane を実行する

$ fastlane [<platform>] <lane>

で実行できる。

だいたいの action は環境変数からオプションを読んでくれる。 例えば deploygate action は環境変数からユーザー名や API トークンを渡すことができるので、そうする。

$ export DEPLOYGATE_USER=********
$ export DEPLOYGATE_API_TOKEN=********************************
$ fastlane beta

補足

別のマシンで実行するとき

fastlane init を実行したとき、実行したマシンのキーチェーンに Apple ID とパスワードのペアが追加される。 Jenkins のような CI でビルドを行う場合は、Jenkins Slave マシンのキーチェーンにも、そのペアを追加する必要がある。(provisioning profile を sigh で取得するために)

$ fastlane-credentials add --username you@example.com

Password: ************
Credential your@example.com:************ added to keychain.

まとめ・感想

  • fastlane new_action で生成される雛形をもとに、Unity を batchMode で起動する action を定義した
  • fastlane init で生成される雛形をもとに、lane を定義した
    • beta 版 ipa をビルドして DeployGate に配信する lane
    • Unity Editor テストを実行する lane
    • Unity Test Tools を使った integration test を実行する lane
  • CLI から lane を実行した
    • 環境変数は export Foo=bar で渡した

fastlane 良い :rocket:

既に用意されている action を使えば、これまでシェルスクリプトで xcodebuildcurl を叩いてビルドしていたのが、 より抽象度の高いスクリプトで記述できるようになり、可読性が高くなる。

また、ipa をビルドするときの一つ大きな問題である、Provisioning Profile が Member Center からさくっとダウンロードできて、ipa の署名までさくっとできるのが強い :muscle:

参考