fastlane導入〜コマンド一発でCrashlyticsベータアプリを配布

  • 56
    いいね
  • 1
    コメント

アプリ配布作業にまつわる問題

テスターへの配布やApp Storeリリース版アップロードなどのアプリ配布作業は煩雑で、地味に工数がかかったり、ビルドのミス(証明書の間違い等)の原因となったりします。
現在関わっているプロジェクトではまだCIツールを導入していないのですが、配布作業の一部を自動化できないかということで、今回fastlaneの利用を検討しました。
※以下、本記事ではCircleCIのようなツールとの連携については触れません

fastlane

fastlane (Github)はiOSアプリのリリースプロセスを自動化できるツールです。
以下のように、fastlaneを使うと様々な工程を自動化することができます。

fastlane Toolchain

※メモのため日本語に訳しました

  • deliver : スクリーンショット、メタデータ、アプリをApp Storeにアップロード
  • snapshot : アプリのスクリーンショット撮影を自動化
  • frameit : スクリーンショットを各デバイス画像にはめる
  • pem : プッシュ通知プロファイルの生成と更新
  • sigh : プロビジョニングプロファイルのダウンロード、更新、生成等
  • produce : iTunes Connectで新しいiOSアプリを作成
  • cert : code signing certificates の作成と管理
  • codes : プロモコードの作成 *deprecated
  • spaceship : iTunes ConnectやApple Dev Centerにアクセス
  • pilot : TestFlightテスターの管理
  • boarding : TestFlightテスターの招待
  • gym : アプリのビルド
  • match : Gitで証明書とプロファイルをチーム管理

今回は、deliver, sigh, gymを利用してみることにします。

セットアップ方法

公式のガイド の手順通りに進めると、すんなりインストールすることができました。
以下のコマンド以降は対話形式となっており、最低限の設定は迷わずに終わります。
$ fastlane init

サンプル

以下を行うためのFastfileのサンプルです。

  • Crashlyticsでステージング版を配布
    $ fastlane crashlytics
  • iTunes Connectへリリース版をアップロード
    $ fastlane appstore

※今回は配布先に応じて、Info.plistの内容を書き換えてみます

Fastfile
fastlane_version "1.57.0"

default_platform :ios

platform :ios do
  PLIST_PATH = "./YourApp/Info.plist"

  before_all do
    # Crashlyticsの設定
    ENV['CRASHLYTICS_API_TOKEN'] = "YOUR_API_TOKEN"
    ENV['CRASHLYTICS_BUILD_SECRET'] = "YOUR_BUILD_SECRET"
    # git statusのチェック
    ensure_git_status_clean
    # pod install
    cocoapods    
  end

  desc "Crashlyticsでグループに配布"
  lane :crashlytics do
    sigh(
      skip_install: true,
      app_identifier: "com.example.YourApp",
      development: true
    )

    # Bundle ID, Bundle display nameを変更してみる
    # ビルド後、Info.plistは変更前の状態に戻す
    backup_file(path: PLIST_PATH)
    update_info_plist(
      plist_path: PLIST_PATH,
      app_identifier: "com.example.YourApp.staging",
      display_name: "YourApp-STG"
    )
    gym(
      clean: true,
      scheme: "Staging of YourApp"
    )  
    restore_file(path: PLIST_PATH)

    crashlytics(
      crashlytics_path: "./Crashlytics.framework", # CocoaPodsでCrashlyticsをインストールした場合は"./Pods/Crashlytics/iOS/Crashlytics.framework"
      notes: "fastlaneによる配布", # リリースノート
      groups: ['your-group-alias'] # group名ではなくエイリアス
    )
  end

  desc "iTunes Connectにリリースビルドをアップロード"
  lane :appstore do
    sigh(
        skip_install: true,
        app_identifier: "com.example.YourApp",
        development: false
    )

    gym(
      clean: true,
      scheme: "Release of YourApp"
    ) 

    deliver(
      force: true,
      skip_screenshots: true,
      skip_metadata: true
    )
  end
end

アプリのビルド時やCrashlytics側でエラーとなった場合はコマンドラインにエラー内容が出力されるので、適宜対処します。
※実行完了時やエラー時にSlackに通知するといったことも可能です

今回はInfo.plistの書き換えのために、update_info_plist, backup_file, restore_file のアクションを使ってみました。アクションのリストは以下のコマンドで確認することができます(沢山のアクションがあります)。
$ fastlane actions

実用例(概要、Fastfileのサンプル)

  • fastlane Example Setups
    実際のサービスで使われている例。Fastfileの書き方が参考になります。
  • Fitbay Fastfile
    上記のサンプルのうち、Fabric (Crashlytics) が使われているもの。

所感

これで、コマンド一発でアプリを配布できるようになりました。OrganizerやFabricの操作を減らせて良さそうな感じがします(これまで手動だったので)。
fastlane toolsの組み合わせ次第で、細かな部分も自動化できそうです。

参考