Fabric Beta によるテストアプリの配信

[Classi Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/classi) 6日目です。

Classi ネイティブアプリ担当の @kitaharamikiya です。

今回は、Twitter社が提供しているFabricの機能の一つ、
 [Crashlytics Beta Distribution](http://try.crashlytics.com/beta/) によるテストアプリ配信で行うようにした経緯を記します。


## 1.導入前の状況
- DeployGateによるテスト配信 + New Relicによるクラッシュレポート による運用

## 2.導入前の問題点 
2-1. 運用、管理するネイティブアプリが増えてきた。
2-2. 各サービスによるクラッシュレポートの管理の二重管理
2-3. 各サービスのSDKを導入することにより、アプリ容量が大きくなる
2-4. メールでの配信のみで、クラッシュについて誰も気にしていない(重症)
2-5. 使われていないのに、運用費が掛かっている


## 3.対応策
 [Fabric](https://get.fabric.io)を導入してみました
 

## 4.Fabric に決めた理由
### 4-1.`運用、管理するネイティブアプリが増えてきた`対策
- DeployGate ：グループ Businessプランに上げれば、20アプリまで登録できる
- Fabric Beta：無料(2016/12/06現在)

### 4-2.`各サービスによるクラッシュレポートの管理の二重管理`対策
- Fabric Crashlytics：いくつものレポートを見るより、まずCrashlyticsを覚える(学習コストの削減)

### 4-3.`各サービスのSDKを導入することにより、アプリ容量が大きくなる` 対策
- Fabric SDKを導入するのみでOK

### 4-4. `メールでの配信のみで、クラッシュについて誰も気にしていない`対策
- ツールよりも、人間の問題。。。アプリチームで話し合い、Fabricを採用。
- Slackによる通知も導入しました。(New RericもSlack連携できると思います。)

### 4-5. `使われていないのに、運用費が掛かる`対策
- Classiは、良いツールに対しては対価を払う意思はあります
- DeployGateや、New Rericも素晴らしいツールですが、使わないならもったいない(意識の問題)
- Fabric が無料なので、浮いたお金で社内改善ができる！(かも)


## 5. 導入方法
### 5-1 Fabric アカウント登録編
1. [Fabric ホーム](https://get.fabric.io/)にて、アカウントを登録する

### 5-2 Fabric 導入：Androidの場合
1. Android Studio メニュー => Preferences... => Plugins を開く
2. 検索窓に「Fabric」と入力する
3. `Fabric for Android Studio` をインストールする
4. Android Studio を再起動する
5. Fabricのアイコンが表示されます

### 5-3 Fabric 導入：iOSの場合
1. アカウントを登録後、IDEでXcodeを選択する
2. Fabric のMacアプリをダウンロードします

### 5-4.アプリ側の設定
※ 本題ではないので、ドキュメントを添付します。(コメント下さい)

- [iOS](https://fabric.io/kits/ios/crashlytics/summary)
- [Android](https://fabric.io/kits/android/crashlytics/summary)

### 5-5.Beta配信をする

1. テストチームをFabricに招待する
2. 配信するアプリをビルドする
 - iOS版
     1. Mac アプリを起動する
     2. Archive する
 - Android版
     1. プロジェクトを選択して、apkファイルを作成する
     2. Android Studio => Fabricを選択する
     3. 配信したいアプリを選択する
     4. Betaのアイコンをクリックする
     5. apkファイルをアップロードする
3. アプリを配信する
 1. Mac アプリ => 配信したいアプリ を選択
 2. 配信するバージョンのDistributeボタンを押下する
 3. 配信するメンバーを検索、選択する(事前にチームを作成するとラク)
 4. Release notesを記入する
 5. nextを押下すると、メール配信されます 

***
### ※ 番外編:Gradle コマンドでapkファイルを配信する
##### 1.ターミナルで、Androidアプリのプロジェクトルートに移動
##### 2.`./gradlew tasks`を実行：下記が表示される

```
 Incremental java compilation is an incubating feature.
:tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Android tasks
-------------
・・・
Other tasks
-----------
crashlyticsUploadDistributionDevDebug - Uploads an APK to Crashlytics for distribution.
crashlyticsUploadDistributionDevRelease - Uploads an APK to Crashlytics for distribution.
crashlyticsUploadDistributionProductDebug - Uploads an APK to Crashlytics for distribution.
crashlyticsUploadDistributionProductRelease - Uploads an APK to Crashlytics for distribution.
crashlyticsUploadDistributionStagingDebug - Uploads an APK to Crashlytics for distribution.
crashlyticsUploadDistributionStagingRelease - Uploads an APK to Crashlytics for distribution.
```     
※ crashlytics を追加すると、Other tasksが追加されます。
    
##### 3.app/build.config の buildTypes などに下記を追加する

```
buildTypes {
    debug {
        applicationIdSuffix ".debug"
        debuggable true
        //配信チームを設定
        ext.betaDistributionGroupAliases = "test_team"
        //リリースノートを記入
        ext.betaDistributionReleaseNotes = "Release Notes"
    }
　   release {
　    ・・・
　   }
}
```
※ この場合は、デバッグビルドのときのテストアプリ配信グループとリリースノートを登録する
・チームは、あらかじめFabricで作成しておく
※ リリースノートは、外部ファイルの読み込みや、コミットログを登録することもできます
    
##### 4.`./gradlew crashlyticsUploadDistributionStagingDebug`をターミナルで実行
※ このコマンドは、staging debug 版apkを生成し、Betaに配信する
***



## 6. 感想
- iOSアプリは、Archiveした時点で、Fabricに登録されるのはものすごいラク(Exportしなくていい)
- DeployGateによる配信を伝達して、やっと慣れたときに方法を変えてしまったので、<br>
テストやリリース判定を行う部署には、学習コストを増やしてしまい、少し申し訳ないと思う
- 情報が絞られているため、詳しくない人でも学習コストは低いと思う<br>
(New Redicは、情報がたくさんある分、テスト・企画チームには見て欲しいと言えなかった)


## 7. まとめ
- 使用するツールは、正直何でも良いと思いますが、使うことが大切
- チーム内でどのツールを使うのかを検討しあい、チームで決めたルールを尊守すること(重要)
- チームが一丸となって、使いやすいアプリを提供しようとする気持ちをもつ(超重要)


## 8. TODO
- Answersも使っているのでカスタムログを導入していきたい。(GAとの住み分けをどうするか)
- 配信等、出来る限り自動化する(Github + Circle CI + Fabric)
- クラッシュログを自動でチケット化する。(GitHub or Trello or JIRA)
- fastlane を導入してみる。

## 明日は
hachi_eiji による「buildersconで知ったkuba-awsを触ってみた」です！