Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

DeployGateで開発中アプリの配布をスッキリさせたはなし。

みなさまはじめまして! Sansan事業部プロダクト開発部Androidエンジニアの原田です。
今回は導入から1年半くらいが経つDeployGateというサービスについて、私のチームがどのように利用しているかご紹介いたします。

背景

突然ですがみなさんは、開発中のアプリをテスターさんに渡すときや、エライ人たちから開発中のアプリがどんなものか触ってみたいって言われたとき、どうしていますか?
私達は1年半ほど前まではUSBケーブルを繋いで1台1台ビルドしたアプリを配布していました。

エライ人がちょっと来たときならそれでも良いのですが、テストで複数台の端末への配布となるととても手間でした。

当時はエンジニアの数も少なく一大プロジェクトの真っ只中であったため、CI/CD周りの整備はやや後回し気味でした。が、テストでの配布にかかる負荷がだんだん無視できないものになってきたため改善を試みました。

f:id:petohtalrayn:20200309080301p:plain
1台1台USBケーブルで配布するのは面倒

DeployGate とは

iOS / Android向けに展開されている「開発版のアプリを端末に展開する」サービスです。
専用の管理アプリも用意されており、ワンボタンでかんたんに開発版をインストールできます。
また、CI環境にもかんたんに組み込めるようになっており、JenkinsやCircleCI、Bitriseへもプラグインを使ってサクッと導入できます。私のチームではBitriseを利用しているためBitrise用プラグインを利用しました。

チームでの使い方

私のチームでのDeployGateの使い方を紹介します。

PullRequestが作られたらDeployGateへ展開する

GithubでPullRequestが作られたとき、Bitriseを利用してLintとテストを行う仕組みはすでに存在していました。
そこへLintとテストの結果が問題なかったらDeployGateへ配信するフローを追加しました。

DeployGateでは単純なバージョンでの管理の他に、任意の名前をつけた「配布ページ」と呼ばれるページごとにアプリのバージョンを管理できます。
これを利用してPullRequestのブランチ名ごとに配布ページを作成し、各PullRequestごとにビルドしたアプリを管理できるようにしました。見やすいですし、別のブランチのビルドを誤ってインストールしてしまうことを防ぎやすくなります。

f:id:petohtalrayn:20200309080309p:plain
DeployGateを使って効率的な開発版の配布環境を実現

リリース前のリグレッションテスト時

リリース前にテスターさんにリグレッションテストをお願いしているのですが、データのマイグレーションなどバージョン間で互換性のない更新が起こることもあるため、一つ前のバージョンからアップデートしてテストをしています。
私のチームではリリースもBitriseを使ってPlayConsoleにアップロードしているのですが、その中でDeployGateにもリリースビルドのバイナリを配布するようにしています。
DeployGateにも過去のバージョンが蓄積するため、容易にバージョンアップのテストをすることができます。


DeployGate の便利な点

実際に使ってみて、当初の目的の配信環境の整備以外にも便利な点がありました。

リモートでlogcatが確認できる

クラッシュしたとき、または任意のタイミングでlogcatの確認ができます。デバッグするためにいちいちパソコンと接続する必要がありません。

f:id:petohtalrayn:20200309133219p:plain
任意タイミングでのlogcat
f:id:petohtalrayn:20200309132630p:plain
クラッシュ時のスタックトレースの遠隔取得
特にクラッシュしたときはSlackに通知させることもできるので、テスターさんにテストしてもらっているときでもすぐに対応できます。
f:id:petohtalrayn:20200309132647p:plain
クラッシュ時にはSlackに通知させることもできる

どの端末にどのバージョンがインストールされたか通知を受け取れる

Slack連携をしておくと、アプリがインストールや起動されたタイミングで通知を送ることができます。
どの端末にどのバージョンがインストールされたかひと目で分かるので、間違ったバージョンをインストールしたりしてないかチェックしやすくなります。

f:id:petohtalrayn:20200309132707p:plain
アプリのインストールや起動を通知させることもできる

ちょっと困ったところ

ブランチごとに配布ページを作るのは良いのですが、PullRequestがマージされた後も配布ページが残り続けてしまう問題がありました。
現在生きているブランチと、DeployGate上の配布ページ名の一覧を突合して、もう存在しないブランチの配布ページは削除するような仕組みを作ろうとしましたが、DeployGateのAPIには配布ページの一覧を取得するものはありませんでした。

幸いにも配布ページを削除するAPIは存在していたので、GitHub Actionsを使いPullRequestのクローズ時に配布ページの削除APIを叩くようにしました。

Actionの内容は以下のような感じです。secretにDeployGateのAPIキーを格納しています。

name: Cleanup

on: 
  pull_request:
    types: [closed]
    branches:
      - (対象にしたいブランチ)

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Delete Deploygate Distribution Page
      run: |
       curl \
        -X DELETE \
        -F 'token=${{ secrets.DEPLOYGATE_APIKEY }}' \
        -F 'distribution_name=${{ github.head_ref }}' \
        https://deploygate.com/api/users/(owner名)/platforms/android/apps/(アプリ名)/distributions


使い始めておよそ1年半程ですが、DeployGateを使ってとても効率的な開発ができるようになりました。
今回の記事は主にAndroid側の運用の話ですがiOSでも同様にDeployGateを利用しており、ほぼ同じようなフローで日々の開発を実施しているため、OSごとに配布の方法が異なってテスターさんが混乱することもありません。
今後もDeployGateをうまく使いながら、更に開発効率を高めていきたいですね。

f:id:petohtalrayn:20200309080305p:plain
ではまた。



buildersbox.corp-sansan.com
buildersbox.corp-sansan.com
buildersbox.corp-sansan.com

© Sansan, Inc.