gitのブランチごとに別のバージョンのアプリをDeployGateで並行して配信する

# はじめに
AndroidやiOSのアプリを複数人で共同開発したり、同じアプリに関して複数のプロジェクトが並列して走っているような場合、互いに干渉なく**gitのfeatureブランチごと**に別のバージョンのアプリを[DeployGate](https://deploygate.com/)で**同時並行して配信**したいという場合があります。

このような場合、`curl`で[DeployGate Upload API](https://docs.deploygate.com/reference)を呼び出す際に、DeployGateの**配布ページ**を指定するオプションを追加することで、それぞれのブランチごとに別のバージョンのアプリをDeployGate経由で同時配信することができます。



# 配布ページとは？
配布ページとはDeployGate上にアップロードされた**特定のバージョン**のアプリ(DeployGateではアップロードごとに**リビジョン**という通し番号が付与されます)を目的別に分けて配信するための機能です。この機能を使うと、たとえばQAテストやβテストを行っているリビジョンを固定して提供しつつ、並行してエンジニア向けに常に最新版を配信すると行った使い方ができます。

<img width="945" alt="distributionpage.png" src="https://qiita-image-store.s3.amazonaws.com/0/956/f467526c-dec8-3bb0-742f-fe0112aa2017.png">

配布ページはEvernoteやDropboxの共有リンクみたいなもので、わざわざアカウントを招待しなくても、配信対象者に配布ページのURLをSlackやメールで共有するだけでアプリを配ることができます。また、インストールする側はDeployGateへの**サインアップを行う必要がありません。**もし配布ページへのアクセスを限定したい場合は、配布ページにパスワードを設定することもできます。


配布ページに対して新しい（または古い）リビジョンのアプリを配信した場合でも、通常のDeployGateと同じように配布ページ経由でインストールしたユーザに通知が届くので、アップデートの配信に関しても心配不要です。

<img width="1152" alt="Screen Shot 2018-01-31 at 6.58.36 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/956/08d33e0d-ed3f-5321-95f2-b2460fa910ef.png">
(例) [DroidKaigi2017公式アプリ（開発版）の配布ページ](https://deploygate.com/distributions/55e453187e765b251bf485d2e81d7bd22aa6aca9#install)


# gitのブランチごとに配信ページを自動作成
あまり知られていないのですが、実はこのDeployGateの配信ページ機能はグループ機能を使っている場合は**作成上限数が無制限**です。なので極端な話をすれば**「gitの全てのbranchごとに配布ページを作る」**みたいなワイルドな使い方も可能です。

とはいえ、gitのブランチを切るたびにブラウザ上から配布ページを作成する操作を行うのは大変面倒です。そこでUpload APIを呼び出す時にオプションを指定して、アプリのアップロードと同時に配布ページを自動作成すると便利です。

実際にアプリをアップロードするには、コマンドラインで以下のようにして[DeployGate Upload API](https://docs.deploygate.com/reference)を呼び出します。

```shell

$ curl \
-F "token=[DeployGateのAPIトークン]" \
-F "file=@app-debug.apk" \
-F "message=git-hash:`git rev-parse --short HEAD`" \
-F "distribution_name=`git rev-parse --abbrev-ref HEAD`" \
https://deploygate.com/api/users/[DeployGateのユーザ名]/apps

```

APIトークンは[DeployGateのアカウント設定](https://deploygate.com/settings)から確認することができます。アップロード先のURLには自身のユーザ名を使用してください。

ここで配布ページを自動生成＆配布設定するために必要なのは`distribution_name`パラメータです。今回はgitのブランチ名を取得して指定しましたが、任意の名前にすることができます。`message`は任意ですが、混乱しないようにハッシュやコミットログを付けると良いでしょう。その他のオプション指定もあるので、詳しくは[APIのリファレンス](https://docs.deploygate.com/reference#upload)を参考にしてみてください。

このようにしてアプリをアップロードすると、DeployGate上では次のように表示されます。

<img width="1112" alt="Screen Shot 2018-02-15 at 5.45.50 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/956/2e2217f3-8138-4b4d-2185-15959ee364e6.png">


ページの右サイドにある「アプリの配布ページ」という項目に、ブランチ名の配布ページが現れます。もし`distribution_name`で指定したのと同じ名称の配布ページが既にある場合は、そこで配信されるアプリをアップロードしたものに更新＆変更することができます。

試しに、ブランチをmasterに切り替えて**同じコマンドを実行**すると、次のようになります。
![899c05a8135ce4fbd3914b774d835675.png](https://qiita-image-store.s3.amazonaws.com/0/956/a37969b5-bd0d-50eb-2f71-b81906dd172e.png)

プロジェクトの最新リビジョンは**#6**にアップデートされ、新しく`master`という配布ページが作られて**#6**が配布されますが、先程アップロードした`features/project01`の方では引き続きリビジョン**#5**のアプリが配信されています。

この仕組みを使い、QAエンジニアやプロジェクトチームのメンバーへの**アプリ共有を配布ページ経由**で行っておくと、開発プロジェクトの同時進行やスケジュールに影響や干渉を受けること無く、複数のバージョンのアプリをgitのブランチに連動して任意の対象に対して切り分けて配信することができます。

特定のコマンドを実行するだけなので**CIとの相性もとて抜群です**。
CIを導入されているプロジェクトの方は、ぜひテスト実行スクリプトの最後にブランチ別の配布ページ指定つきDeployGate Upload APIの呼び出しコマンドを追加してみてください。

メンバーへのアプリ配信の完全自動化で、グループ開発が結構捗りますよ！