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

 

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

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

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

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

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


# セットアップ方法
[公式のガイド](https://github.com/fastlane/fastlane/blob/master/docs/Guide.md#setting-up-fastlane) の手順通りに進めると、すんなりインストールすることができました。
以下のコマンド以降は対話形式となっており、最低限の設定は迷わずに終わります。
``` $ fastlane init ```

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

- Crashlyticsでステージング版を配布  
```$ fastlane crashlytics ```
- iTunes Connectへリリース版をアップロード  
```$ fastlane appstore```
    
※今回は配布先に応じて、Info.plistの内容を書き換えてみます
   


  
``` Ruby: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](https://github.com/fastlane/examples)  
実際のサービスで使われている例。Fastfileの書き方が参考になります。
- [Fitbay Fastfile](https://github.com/fastlane/examples/blob/master/Fitbay/Fastfile)  
上記のサンプルのうち、Fabric (Crashlytics) が使われているもの。

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

# 参考
- [iOSアプリのリリースフロー自動化ツールfastlaneのmeetupに通訳で参加しました](http://tech.mercari.com/entry/2015/07/13/143000)
- [iOSアプリの継続的デリバリーに便利なfastlaneのご紹介](http://qiita.com/gin0606/items/162d756dfda7b84e97d4
 )
- [fastlane、Crashlyticsを使ったiOSアプリのリリースプロセス自動化に挑む](http://engineering.otobank.co.jp/entry/ios-deploy-use-fastlane-crashlytics
 )
- [fastlaneを使ってiOS開発を楽しくする、しかも応援してもらえる](http://qiita.com/jumbOS5/items/098c8caaacf778c9a3fc)