Crashlytics利用時のFastlane設定方法（iOS編）


## インストール
```
$ gem install fastlane
```
もしくは、Gemfileに`gem "fastlane"`と記入し`bundle install`

## セットアップ
プロジェクトフォルダへ移動して以下のコマンドを打つ。

```
$ fastlane init
```

質問されるので適宜回答する。

> `Do you want to get started? This will move your Deliverfile and Snapfile (if they exist) (y/n) `   

使いはじめるか聞いてるので`y`を押す。

> `Do you have everything commited in version control? If not please do so! (y/n)`   

バージョンコントロール使ってる？使ってなかったら使って！
使ってる状態なら`y`、使ってなかったら`n`を押して、使い始めたら`y`にして先に進む。

> `App Identifier (com.krausefx.app):`  

fastlaneを使いはじめるアプリのBundle Identifierを入力する

> `Your Apple ID (fastlane@krausefx.com):`  

自分のAppleIDを入力する。プロビジョニングプロファイルとか作れるアカウントだと嬉しいけど、ダウンロード出来るアカウントなら大丈夫。

> `Do you want to setup 'deliver', which is used to upload app screenshots, app metadata and app updates to the App Store or Apple TestFlight? (y/n)`  

アプリをAppStoreとかTestflightに上げるか聞いてる。

## アクション
fastlaneが公式に用意している主なアクション（コマンドラインツール）は以下の通り。  
カスタムアクションを作ることも可能。

- [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で証明書とプロファイルをチーム管理

他にも**_cocoapods_**や**_slack_**など様々なアクションが用意されている。

## 設定例

`Fastfile`にレーンの定義を記述することで、下記のようにコマンドラインで実行が可能となる。

```
$ fastlane appstore
```

```ruby
lane :appstore do
  increment_build_number
  cocoapods
  xctool
  snapshot
  sigh
  deliver
  frameit
  sh "./customScript.sh"

  slack
end
```

レーンの実行前後の処理や、エラーハンドリングも可能。

```ruby
before_all do |lane|
  increment_build_number
  cocoapods
end
```
```ruby
after_all do |lane|
  clean_build_artifacts
  commit_version_bump
  add_git_tag
end
```
```ruby
error do |lane, exception|
  reset_git_repo
  slack({
    message: "An error occured"
  })
end
```

## 実用例

ビルドした際に自動でプロビジョニングファイルを生成し、
FabricのCrashlyticsでテスト配布を行う設定。

```
fastlane_version "1.97.2"

default_platform :ios

platform :ios do
  before_all do
    # Crashlyticsの設定
    ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."
    ENV["CRASHLYTICS_API_TOKEN"] = "..."
    ENV["CRASHLYTICS_BUILD_SECRET"] = "..."

    # pod install
    cocoapods
  end

  after_all do |lane|
    slack(
       message: "Successfully deployed new App Update."
     )
  end

  error do |lane, exception|
    slack(
      message: exception.message,
      success: false
     )
  end


  desc "Crashlyticsでグループに配布"
  lane :crashlytics do

    # CI環境で実行の場合のみimport_certificatesを実行
    import_certificates if Helper.is_ci?

    sigh(
      app_identifier: "...",
      development: true
    )

    gym(
      workspace: "<...>.xcworkspace",
      scheme: "...",
      configuration: 'Beta',
      clean: true
    )

    crashlytics(
      crashlytics_path: "./Pods/Crashlytics/iOS/Crashlytics.framework",
      notes: "Fastlaneによる配布",
      api_token: ENV["CRASHLYTICS_API_TOKEN"],
      build_secret: ENV["CRASHLYTICS_BUILD_SECRET"],
      ipa_path: "<APP>.ipa",
      groups: "developer"
    )
  end

  private_lane :import_certificates do

    ENV["KEYCHAIN_NAME"] = "ios-build.keychain"
    ENV["KEYCHAIN_PASSWORD"] = "..."
    ENV["CERT_PASSWORD"] = ENV["FASTLANE_PASSWORD"]

    # キーチェーンを作成する
    create_keychain(
      name: ENV["KEYCHAIN_NAME"],
      password: ENV["KEYCHAIN_PASSWORD"],
      default_keychain: true,
      unlock: true,
      timeout: 3600,
      lock_when_sleeps: true
    )

    # 証明書をimport。リポジトリのパスを指定
    import_certificate certificate_path: "./fastlane/certificate/AppleWWDRCA.cer"
    import_certificate certificate_path: "./fastlane/certificate/dist.p12", certificate_password: ENV["CERT_PASSWORD"]
  end
end
```

（`...`は各自設定）



## 参考
- http://sikmi.com/blog/ios/circleci-fastlane-fabric-2
- http://techblog.lclco.com/entry/2016/05/09/192230
- http://engineering.otobank.co.jp/entry/ios-deploy-use-fastlane-crashlytics
- http://tech.mercari.com/entry/2015/07/13/143000
- http://qiita.com/ariiyu/items/2b211dbe23b53443ecc6#_reference-0c51c0806b0a0086f7c7