logo サブスレッド

fastlaneを使ってみる

むおおおお!

今日はfastlaneのDocumentationを軽く読んでみたので、それに関してちょっとまとめた話を書きます!

アプリが一旦完成してから、リリースするまでの間のタスク

iOS/Androidアプリに限った話ではないかもしれませんが、プログラムは一旦書き終えた後も、テストして修正したり、hotfixを適用したり、少しずつ仕様を変えたりしながら、何度も何度もビルドを行います。

具体的にはこんな感じの目的でビルドを行うと思います:

  • 社内でテストするため、開発サーバ向けのビルドを行う
  • 納品や受け入れテストのために、ステージングビルドを行う
  • AppStore/Google Play Storeにアップロードするためにリリースビルドを行う

また、このビルドを行う際は、同時に他のこともいろいろ行うことがあります:

  • バージョン番号を上げる
  • (テストを書いているなら)CIでテストするためにCIへアップロードしビルドをトリガーする
  • ビルドしたアプリの実行ファイルを特定の名前へリネームする (例: myproject-ver1.2.3_build20180101.apk など)

そして何より、こういったタスクをまとめておくことで、 設定の間違いによるヒューマンエラーが起きにくいようにする ことが可能です。各IDEにはGUIツールでapkを生成する機能がついていますが、設定を一通り確認するのは非常に面倒で、さらにヒューマンエラーも起きやすくなるので、個人的には 最初以外は使いたくない と思っています。

今まではシェルスクリプトを書いていたんですが、これも面倒になってきたので、ちょっと巷で有名なfastlaneを触ってみることにしました。という記事を書きます。


What is fastlane?

Android/iOS/macOSのアプリをビルドするためのツールです。

  • macOSでのみ動作
  • Rubyで書かれている

できることは、Actionsにまとめられています。これを見ると、めちゃいろいろなことができることが分かります。

Documentationを見ると、主なfeaturesはこれらのようです。

  • テストの実行
  • Beta配布用のサービスへ、アプリをアップロード
  • TestFlight/Google PlayへのBetaテスト用配布
  • アプリのスクリーンショットの撮影
    • ストアに出ているものと、最新版の見た目が違う、を防げる
    • ローカライズしたときの、各言語ごとのスクショを取るのを自動化
    • 各解像度ごとのスクショを撮れる
  • AppStore/Google Playへのファイルアップロード

この記事では、アプリをビルドしてipaを作成するところまでをゴールとします。

Getting Started for iOS

Setup fastlane

# 最新のXcode command line toolsをインストール
$ xcode-select --install

# 初期化
$ cd /path/to/your-project

# Gemfile作成
$ vim Gemfile
# fastlaneをプロジェクトへインストール
$ bundle update
# fastlaneの初期化コマンドを実行
$ bundle exec fastlane init

Gemfileの中身はこんな感じです:

source "https://rubygems.org"

gem "fastlane"

Gemfileを作るのは、プロジェクトごとにfastlaneを入れるためです。ほとんどの場合、ビルドツールもバージョンは固定したいですよね。

fastlaneはどのようにツールを使われているかを計測して、サーバに送信しているようです。これをオプトアウトする場合はFASTLANE_OPT_OUT_USAGE=trueなんかを環境変数としてセットしてあげるか、Fastfileの先頭にopt_out_usageをつければ良いようです。

fastlane init swiftというオプションもあるようで、これはswiftで書かれたFastfileを生成するオプションのようです。Betaなのでまだ問題あるかもですね。iOSの場合はRuby無しで動くようにするの目指しているのかも。Android側とは書式変えなければならなくなることに関してどう考えているんだろうか。

話題を戻します。bundle exec fastlaneを実行した時、いろんなことを聞かれます。Enterキーを押してで進めて行きましょう。ざっくりとこんな感じのことでした:

  • 匿名でanalyticsデータを送ってる。これはFastfileの先頭にopt_out_usageを追加すれば無効にできる
  • ./fastlaneフォルダ作ったよ
  • What would you like to use fastlane for? (fastlaneをどのようにお使いになられますか?)
    • 僕は 4. Manual setup - manually setup your project to automate your tasks を選択しました。
  • ./fastlane/Fastfile 作った
  • ./fastlane/Appfile 作った
  • Fastfleの中に、各lanesがある。各laneには違う自動化のためのタスクがある。例えばスクショとったり、署名したり、新規リリースをアップロードしたり。
    • Fastfileをカスタマイズするには、テキストエディタでそのファイルを開く。そしてそれをあなたに合った形でlanesやactionsを編集できる。
    • すべてのアクションは、Actionsを見て欲しい

実際にはもうちょっと書かれてますが、かいつまみました。

Edit your Fastfile

./fastlane/Fastfileは、最初こんな感じになってます。

# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:ios)

platform :ios do
  desc "Description of what the lane does"
  lane :custom_lane do
    # add actions here: https://docs.fastlane.tools/actions
  end
end

これを、Building your appを見ながら、例えば下記のように修正します:

platform :ios do
    desc "My first build"
    lane :build_debug do
        get_certificates(
            development: true,
            username: "my.apple.developer@example.com"
        )
        get_provisioning_profile(
            development: true,
            app_identifier: "*",
            skip_install: true,
            readonly: true,
            skip_certificate_verification: true,
            username: "my.apple.developer@example.com"
        )
        build_app(
            scheme: "MyApp",
            workspace: "MyApp.xcworkspace",
            export_method: "development",
            include_bitcode: true)
    end
end

これはDeveloperアカウント(Distributionではない)で、開発ビルド(adhoc/appstoreビルドではない)したときのプロパティです。

  • username, workspace, scheme などは、適宜変更が必要です。
  • 各アクションの説明とプロパティに関しては、必ず一度Documentationに目を通してください。(僕もちょっとハマりそうになりました)
  • ビルドのたびに、usernameに対するパスワードを聞かれます。これはfastlane-credentialsを使ってパスワードを保存しておけば問題なく通るようになります。
    • ちなみにパスワードはmacOS Keychainへ保存されるとのこと

続けて bundle exec fastlane build_debug を実行すれば、しばらくした後にipaがカレントディレクトリに生成されます。

僕は途中一つハマったんですが、もしUnable to locate Xcode. Please make sure to have Xcode installed on your machineというエラーが出るようであれば、issueがあるのでこちらを参考に、Xcodeでオプションを有効にしてあげてください。


Fastfileの書式の簡単な解説

ここまでiOSのビルドの設定について解説してみましたが、さらっと流したので、用語の解説等をしておきます。

fastlaneツール自体はRakefileの亜種?タスクランナー?みたいなもので、例えばmy_buildtaskっていうタスクを定義しておいて、fastlane my_buildtaskといったコマンドでコマンドラインで叩くと、my_buildtaskの中に記述された処理が順番に実行されていきます。このタスクのことをfastlaneではlaneと呼びます。

で、my_buildtaskが実行されたときに順番に実行する処理をactionって呼んでおり、そのactionとして「iOSアプリをビルドする」「Crashlytics BetaなんかのWebサービスにアプリを送信してβ配布する」といったことが可能です。

例えば、こんな風に書いた時:

platform :ios do
    desc "My first build"
    lane :my_buildtask do
        get_certificates
        get_provisioning_profile
        build_app
    end
end

lanemy_buildtaskactionは、get_certificates, get_provisioning_profile, build_app となります。

fastlaneが優秀なのは、このactionがめっちゃ豊富にあることです。これは前述のactionsのドキュメントをご覧ください。

おつかれさまでした!

追記: Fastfileの書式の簡単な解説を追加

現在の位置:サブスレッド ホーム > 技術ブログ > fastlaneを使ってみる