Timers Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

#FirebaseAppDistribution x #Bitrise x #fastlane で簡単アプリ配信 #potatotips

こんにちは。Androidエンジニアのakatsuki(@akatsuki174)です。

先日、弊社では全社合宿を行いました。私は「Firebase App Distributionで簡単にアプリを配信できるようにするぞ!」という目標を立て、無事合宿中に対応が完了しました。ということでFirebase App Distributionを使ってAndroidアプリを配信する方法について書こうと思います。
※以降、書くのが面倒なのでFirebase App DistributionをFADと略します。
※この記事はpotatotips #67の登壇補足資料でもあります。

想定読者

  • アプリ配信を簡単に実現したい人
  • FADがどんなものなのか知りたい人

Firebase App Distributionとは

Firebaseが提供している、テスターにアプリを配布する仕組みです。比較的最近パブリックベータになりました。

フロー全体像

f:id:akatsuki174:20191111092920j:plain:w800

弊社では PR提出→LGTMをもらう→QAさんにテストしてもらう→developマージ という流れで開発しているので、PRが提出された時、及びPRが修正されたタイミングでアプリが自動配布されるのが望ましいと考えました。なので従来のfamm-pr-assistというワークフローに新しく_firebase-distributionというワークフローを繋げる流れにしています。

また、任意のタイミングでワークフローを実行したくなった時にBitriseにログインしなくても済むよう、SlackからSlash Commandsを使ってワークフローを実行できるようにもしました。

下準備

テスターグループの作成

FAD用のテスターグループを作成します(すでに存在するグループを使っても大丈夫です)。この時、グループ名をメモしておいてください。これはコマンドラインツール等でグループを指定する時に使うものです。

f:id:akatsuki174:20191108092335p:plain:w600

Firebase App IDの把握

設定(歯車アイコン)→プロジェクトの設定→アプリ IDをメモしておきます。

f:id:akatsuki174:20191111093947p:plain:w600

fastlane導入

まだプロジェクトに導入してなかったのでbundler経由で入れました。

加えてFADのプラグインも入れました。

$ bundle exec fastlane add_plugin firebase_app_distribution

Firebase tokenの設定

BitriseでFirebaseを利用できるようにtokenを取得します。

$ firebase login:ci

tokenをコピーしたらBitriseのWorkflow EditorからEnv Varsタブを開き、該当のワークフローの環境変数に貼り付けます。

f:id:akatsuki174:20191111101048p:plain:w800

lane作成

以下の記述を追加します。アプリIDは「Firebase App IDの把握」の工程で、テスターグループ名は「テスターグループの作成」の工程でメモったものを記入します。

platform :android do
    desc "distribute famm app"
    lane :distribute do
      gradle(
        task: "assemble",
        flavor: "[フレーバー名]",
        build_type: "[タイプ名]"
      )
      firebase_app_distribution(
        app: "[アプリID]",
        groups: "[テスターグループ名]",
        release_notes: last_git_commit[:message],
        firebase_cli_path: "./node_modules/.bin/firebase"
      )
    end
end

Bitriseワークフロー作成

最終的にこのようなステップを組み合わせました。

f:id:akatsuki174:20191111093608p:plain:w350 f:id:akatsuki174:20191111093612p:plain:w350

famm-pr-assistの方でGit cloneなどをやっているので、_firebase-distributionの方はかなり少ないステップ数になっています。

ここからは、それぞれのステップでやっていることを説明します。

Scriptステップ

Firebase CLIが使えるよう、Script contentに以下の記述を追加します。

## firebase tools DL
npm install firebase-tools

fastlaneステップ

fastlane laneにlane名を入力します。

android [lane名]

Send a Slack messageステップ

Slackの新規アプリ作成画面から、新しくアプリを作成します。

その後Incoming Webhooks をクリックして、

f:id:akatsuki174:20191110203035p:plain:w600

一番下にあるWebhook URLをコピーします。

f:id:akatsuki174:20191110203230p:plain:w500

Bitriseに戻り、SecretsタブでWebhook URL用の環境変数を追加します。

f:id:akatsuki174:20191111095255p:plain:w800

これをSend a Slack messageステップのSlack Webhook URL (Webhook or API token is required) に設定します。

f:id:akatsuki174:20191111095433p:plain:w800

f:id:akatsuki174:20191216152403p:plain:w450

ここまででBitriseの一連のフローが完成しました👏

Slackからコマンド実行

おまけとして、Slackから直接ワークフローを実行できるようにしてみます。
Workflow Editorから抜け、Codeタブから、INCOMING WEBHOOKSSETUP MANUALYSlackを選択します。この時、Webhook URLをメモっておきます。

f:id:akatsuki174:20191111100127p:plain:w550

SlackのManage→App DirectoryからSlash Commandsを検索、追加します。

f:id:akatsuki174:20191110193015p:plain:w400

今回は以下の設定をしてコマンドを追加しました。

Command: /bitrise_android
URL: [先程メモったWebhook URL]
Autocomplete help text - Usage hint: [branch:ブランチ名|workflow:ワークフロー名]

実行結果

上記全ての設定を踏まえSlackからコマンドを実行してみます。

f:id:akatsuki174:20191111100250p:plain:w600

しばらく経つと結果が通知されます。

f:id:akatsuki174:20191111100333p:plain:w600

アプリを受け取るには

ここまでで配布する仕組みは整えたので、今度は受け取るための設定をします。

テストメンバーを招待する

テスターを追加する方法は、

  1. 招待リンクを発行して、踏んでもらう
  2. メールアドレスを教えてもらって個別に招待する

の2つの方法があります。とはいえ1の手法をとった場合も2と同じように招待メールが届くので、大きな差はありません。

メールを受け取った側は招待と規約をAcceptすることでダウンロードできるようになります。これでテストアプリが使えるようになります。

f:id:akatsuki174:20191110204629p:plain:w250

下に出ているFirebase App Testerは、配布済みアプリを一覧で表示してくれるアプリです。入れておくと便利なのでその説明もします。

Firebase App Tester

先程のスクショの下に出ていた「Try the app」をタップします。app-tester-vX-XX.apkが「ファイル」アプリに保存されるので展開します。きっとホーム画面にこんなアイコンが追加されているはず。

f:id:akatsuki174:20191111101810p:plain:w100

このアプリを開くと配布済みアプリの一覧を見ることができます。管理しやすくなりましたね。

f:id:akatsuki174:20191111101917p:plain:w250 f:id:akatsuki174:20191111101940p:plain:w250

導入してみた感想

FADに限りませんが、何もせずとも自動で配布できるのはいいなと思いました。

QAさんにも感想を聞いたところ、

  • 😄アプリのダウンロード時間が早い
  • 😄招待リンクさえもらえればあとはQAチーム側で初期設定が完了するので楽
  • 🤔どれがどのアプリなのか判別しづらい
    • タイトルがかなり省略される
    • 同タイトルの最新版を探しづらい
    • 設定の仕方で改善できる部分もあるけど、できない部分もある
  • 🤔招待される以前のバージョンが見えない
  • 🤔古いバージョンだと見つからないことがある

といった具合でした。

ちなみに「このバージョンはダウンロードできません」という表示が出てきてことごとくダウンロードできないときがありましたが、一度トップに戻って再度バージョン一覧に遷移したらダウンロードできるようになりました。

総じてメリットデメリットありますが選択肢の一つとして覚えておいて損はない手段だと思いました。ので、自動配布環境を作るときはこの記事を思い出してみてください。

P.S.

子育て家族アプリFammを運営するTimers inc.では、現在エンジニアを積極採用中!
急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください!
採用HP: http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる