Save 37% off PRO during our Black Friday Sale! »

DroidKaigi 2021 - A Practical Guide to Building Mobile App Distribution Workflows

DroidKaigi 2021 - A Practical Guide to Building Mobile App Distribution Workflows

DroidKaigi 2021 Day2 で発表したアプリ配信フローを構築するための話です。

https://droidkaigi.jp/2021/timetable/276963/?day=2
https://github.com/jmatsu/droidkaigi2021-appendix
https://www.youtube.com/watch?v=DA2ziL4qgZk

D4133d8efb46ae872d7a563b619bfc83?s=128

Matsuda Jumpei

October 20, 2021
Tweet

Transcript

  1. A Practical Guide to Building Mobile App Distribution Workflows Jumpei

    Matsuda
  2. この発表の”アプリ配信”の想定(✅)・想定範囲外(❌) 組織内配布、オープン/クローズテストでのSideloading 本番ストアやMDMストアへの配布 OSS での配布 ✅ ❌ ❌

  3. この発表を通して知ってほしいこと アプリ配信ワークフローの考え方 開発プロセス中に出てくる配信目的の多様性 アプリ配信手法天下一武道会 ✅ ✅ ❌

  4. アプリ配信ワークフローとよくある問題点 アプリ配信の理解を深める 実践 Showcases まとめ Agenda 01 02 03 04

  5. 01 02 03 04 Agenda アプリ配信ワークフローとよくある問題点 アプリ配信の理解を深める 実践 Showcases まとめ

  6. アプリ配信ワークフローの概念図 テスター 配信環境 e.g. CI/CD サービス ビルド環境 e.g. アプリ配信サービス 1/4

    アプリ配信ワークフローとよくある問題点
  7. アプリ配信ワークフローの概念図 テスター 配信環境 e.g. CI/CD サービス ビルド環境 e.g. アプリ配信サービス タイミングは?

    何を? 何をしたい? いつ? 誰に? どうして? 1/4 アプリ配信ワークフローとよくある問題点
  8. アプリ配信を伴う業務フローって何だろう? 開発ブランチ・プロトタイプの挙動確認 リリース前QA (内部・外部) インハウス配信 E2Eテスト 新機能のデモといった営業利用 1/4 アプリ配信ワークフローとよくある問題点

  9. 運用中のアプリ配信機構によくある問題点 誰も高い理解度を持っていない 長いこと使っていて便利だと思ってるけど、ゼロから構築出来ない なぜその構成になっているか知らない 保守運用に関する問題 継続的な修正はほぼなく、アドホックな対応が求められる 担当者はおらず、失敗(貧乏くじ)を引いた人が直す 運用者(e.g. QA担当者)とは異なった人が保守しないといけない 1/4

    アプリ配信ワークフローとよくある問題点
  10. 運用中のアプリ配信機構によくある問題点 誰も高い理解度を持っていない 長いこと使っていて便利だと思ってるけど、ゼロから構築出来ない なぜその構成になっているか知らない 保守運用に関する問題 継続的な修正はほぼなく、アドホックに対応する 担当者はおらず、失敗(貧乏くじ)を引いた人が直 運用者(e.g. QA担当者)とは異なった人が保守しないといけない 理解するしかない

    運用方針を決めるしかない 1/4 アプリ配信ワークフローとよくある問題点
  11. 01 02 03 04 Agenda アプリ配信ワークフローとよくある問題点 アプリ配信の理解を深める 実践 Showcases まとめ

  12. 段階的にアプリ配信機構を理解する 最低限の検討項目 保守運用に関する責務の所在 アプリ配信サービスとは 複数の事例とその目的を知る 01 02 03 04 2/4

    アプリ配信機構の理解を深める
  13. 01 02 03 04 段階的にアプリ配信機構を理解する 最低限の検討項目 保守運用に関する責務の所在 アプリ配信サービスとは 複数の事例とその目的を知る 2/4

    アプリ配信機構の理解を深める
  14. 01 - 最低限の検討項目 いつ配信準備をするのか 何を配信するのか 配信されたものを誰がいつ使うのか どうやって配信するのか A B C

    D 2/4 アプリ配信機構の理解を深める
  15. 開発プロセス内の細粒度のチェックポイント コードレビュー プロトタイプのお触り会 プレリリースバージョンの発行されたとき Alpha/Beta/Release Candidate オンデマンド or 先んじて 営業のデモ、サーバーインフラ変更時、API変更時

    etc. A - いつ配信準備をするのか 2/4 アプリ配信機構の理解を深める - 01 最低限の検討項目 忘れられがち 忘れられがち
  16. B - 何を配信するのか 機能差を意識した種別 プラットフォーム別 (AndroidOS, AndroidTV, WatchWearOS, FireOS etc.)

    Variant (本番相当のビルド、QAツール入り、デバッグビルド etc.) 安定度や時間を意識した種別 マイルストーン (開発中のバージョン、プレリリースバージョン etc.) 2/4 アプリ配信機構の理解を深める - 01 最低限の検討項目
  17. C - 誰が配信されたものをいつ使うのか 内部関係者・委託先 - ある程度、インストールタイミングが予測可能 QA担当者 開発に関わるAndroidアプリ開発者 それ以外の開発者・デザイナー・ディレクター・営業 外部

    - すぐインストールするとは限らない Closed Test のテスター Open Test のテスター 2/4 アプリ配信機構の理解を深める - 01 最低限の検討項目
  18. D - どうやって配信するのか 物理アクセス ADB (USB ケーブル、同ネットワーク上での over tcp) ストレージ

    (USB flash storage etc.) ファイルシェア (Android Beam, NearBy Share, Files by Google etc.) インターネット経由の Over the Air アプリ配信サービス (Firebase App Distribution, DeployGate, Bitrise etc.) 共有ストレージ (Google Drive, S3, Cloud Storage, GitHub Releases etc.) 2/4 アプリ配信機構の理解を深める - 01 最低限の検討項目
  19. 段階的にアプリ配信機構を理解する 最低限の検討項目 保守運用に関する責務の所在 アプリ配信サービスとは 複数の事例とその目的を知る 01 02 03 04 2/4

    アプリ配信機構の理解を深める
  20. 管理対象ごとに分け、かつ分けられる方法を選ぶ 2/4 アプリ配信機構の理解を深める - 02 保守運用に関する責務の所在 アプリ開発者が担当するべき管理対象 配信アプリの管理 目的に応じた適切な Variant

    などの選択 配信の準備タイミングの管理 目的から適切なタイミングを選定・維持 配信対象側が担当するべき管理対象 配信対象のグループ管理 QAチームの管理はQAチーム内部の人間が、公募やお触り会は PdM が
  21. 管理対象ごとに分け、かつ分けられる方法を選ぶ アプリ開発者が担当するべき管理対象 配信物の管理 目的に応じた適切な Variant などの選択 配信の準備タイミングの管理 目的から適切なタイミングを選定・維持 配信対象側が担当するべき管理対象 配信対象のグループ管理

    QAチームの管理はQAチーム内部の人間が、公募やお触り会は PdM が 共有ストレージだと Access Control が難しい 2/4 アプリ配信機構の理解を深める - 02 保守運用に関する責務の所在
  22. 01 02 03 04 段階的にアプリ配信機構を理解する 最低限の検討項目 保守運用に関する責務の所在 アプリ配信サービスとは 複数の事例とその目的を知る 2/4

    アプリ配信機構の理解を深める
  23. アプリ専用のストレージサービスとは言えない インストールに関する支援が主な機能 OTA機能; サービスを介してアプリのアップロードとダウンロードができる 配信対象管理; 配信対象者の許容リスト、配信対象のグループ化 ビルド成果物の管理ストレージではない メモ機能程度しかなく、「適切なビルド」は開発者でないと判別が困難 ライフサイクルはサービスに依存し、殆どが時間か数で削除される 2/4

    アプリ配信機構の理解を深める - 03 アプリ配信サービスとは
  24. 01 02 03 04 段階的にアプリ配信機構を理解する 最低限の検討項目 保守運用に関する責務の所在 アプリ配信サービスとは 複数の事例とその目的を知る 2/4

    アプリ配信機構の理解を深める
  25. 業務・目的の代表例 2/4 アプリ配信機構の理解を深める - 04 複数の事例とその目的を知る コードレビュー プロトタイプお触り会 リリース前QA ドッグフーディング

    いつ 都度(高頻度) やや突発的 計画的(リリーススケ ジュールに準拠) 自由(いつでも) 何を 開発中のブランチ 上の成果物 特定の機能を含んだ版 プレリリース版 過去のQA済み版(本番) QA済みRC版 誰に 開発者 (特にレビュワー) チーム関係者 QA担当者 チーム関係者 全社内関係者 どうやって 開発者が用意、ま たはCI/CDによる自 動化 e.g. 配信サービス や共有ストレージ 開発者が用意する e.g. 配信サービスや共 有ストレージ、物理アク セスも可 配信サービスを経由し、 自発的に取得またはリ アルタイム通知にて受 け取る 配信対象者が自発的 に取得出来る e.g. 配信サービスや共 有ストレージ
  26. 業務・目的の代表例 (時間の都合で資料のみ) Hot Fix デザインレビュー 営業デモ Open/Closed テスト いつ 突発的

    計画的 or 突発的(チー ムに依存) 突発的 計画的 or 突発的(チー ムに依存) 何を 修正ブランチ上の 成果物 RC版(QA済みかは業務 フローに依存) QA済みRC版 プロトタイプ版 QA済みRC版 誰に 開発者 (特にレビュワー) チームのデザイナー 社内非開発者 公募テスター 社内テスター どうやって 開発者が用意、ま たは自動化による e.g. CI/CD デザイナーが自発的に 取得出来る or 開発者が 用意する e.g. 配信サービスや共 有ストレージ 配信サービスを経由 し、自発的に取得また はリアルタイム通知に て受け取る 開発者(または企画者)が 配信サービスを利用して 配布する 2/4 アプリ配信機構の理解を深める - 04 複数の事例とその目的を知る
  27. 01 02 03 04 Agenda アプリ配信ワークフローとよくある問題点 アプリ配信の理解を深める 実践 Showcases まとめ

  28. 実装例の紹介 コードレビュー プロトタイプお触り会 リリース前QA 番外編 - 今すぐできる改善 A B C

    D 3/4 実践 Showcases
  29. A B C D コードレビュー プロトタイプお触り会 リリース前QA 番外編 - 今すぐできる改善

    実装例の紹介 3/4 実践 Showcases
  30. CI 3/4 実践 Showcases - 実装例の紹介 - A コードレビュー ざっくりとしたイメージ

    and more URLなどの導線が 発行出来るもの 通知先
  31. on: pull_request: types: [labeled, ... ] jobs: assemble-and-distribute-app-to-review: if: >

    github.event.action != 'labeled' || github.event.label.name == 'instant-deployment' steps: - // checkout the code and build an aab - id: upload uses: jmatsu/dg-upload-app-action@v0.2 with: // several required params are omitted due to no space. message: | Ran ./gradlew assembleDebug on ${{ github.ref }} / ${{ github.sha }} Built by GitHub Actions for code-review distribution_find_by: name distribution_id: "codereview/${{ github.ref }}" - // comment ${{ steps.upload.outputs.distribution_url }} to the pr 特定ラベル付与 or それ以外のPRイベントで発火 Rev., Variant, 目的 を明示的に付与 branch 名ごとに固有の URLを発行させる DeployGate + GitHub Actions での実装例 3/4 実践 Showcases - 実装例の紹介 - A コードレビュー
  32. A B C D コードレビュー プロトタイプお触り会 リリース前QA 番外編 - 今すぐできる改善

    実装例の紹介 3/4 実践 Showcases
  33. CI ざっくりとしたイメージ 共有ストレージ 配信サービス 参加者がアクセス できれば何でも良い お触り会中に修正するなら配 信サービスが良い 手動 3/4

    実践 Showcases - 実装例の紹介 - B プロトタイプお触り会
  34. お触り会用にグループを作る Firebase App Distribution + GitHub Actions での実装例 3/4 実践

    Showcases - 実装例の紹介 - B プロトタイプお触り会
  35. on: pull_request jobs: assemble-and-distribute-prototype: if: > contains(github.event.pull_request.head.ref, 'prototype') && contains(github.event.pull_request.labels.*.name,

    'continuous-deployment') steps: - ... // build an apk or aab - uses: wzieba/Firebase-Distribution-Github-Action@v1 with: appId: ... // app id token: ... // auth token via secrets (or use service account) groups: ${{ github.event.pull_request.head.ref }} // == 20211020-droidkaigi-day2-prototype file: ... // app path releaseNotes: | Ran ./gradlew assembleDebug on ${{ github.ref }} / ${{ github.sha }} Built by GitHub Actions for prototype behavior check branch名の規則性 + 特定ラベルがついている branch 名を 配信グループ名と 一致させる Rev., Variant, 目的を 明示的に表現 Firebase App Distribution + GitHub Actions での実装例 3/4 実践 Showcases - 実装例の紹介 - B プロトタイプお触り会
  36. お触り会グループへの 招待リンクが便利 Firebase App Distribution + GitHub Actions での実装例 3/4

    実践 Showcases - 実装例の紹介 - B プロトタイプお触り会
  37. A B C D コードレビュー プロトタイプお触り会 リリース前QA 番外編 - 今すぐできる改善

    実装例の紹介 3/4 実践 Showcases
  38. CI ざっくりとしたイメージ and more プレリリースの発行 3/4 実践 Showcases - 実装例の紹介

    - C リリース前QA タグやマージ デグレなどを考慮し、 過去の版もインストール 可能であるべき 開発者が指定した版を QA するので 配信サービスがオススメ 複数のアプリを 担当していることも。 明示的な通知が良い
  39. on: push: branches: - 'release/*' jobs: assemble-and-distribute: steps: - ...

    - id: upload uses: jmatsu/dg-upload-app-action@v0.2 with: message: | Ran ./gradlew bundleRelease on ${{ github.ref }} / ${{ github.sha }} ${{ github.event.head_commit.message }} Built by ${{ github.event.pusher.name }} through Actions for RC distribution distribution_find_by: name distribution_id: pre-release-qa 特定のブランチでの push Commit Message を リリースノートとして扱う QA用に固定された 共有リンクを使う DeployGate + GitHub Actions での実装例 3/4 実践 Showcases - 実装例の紹介 - C リリース前QA
  40. - id: upload uses: jmatsu/dg-upload-app-action@v0.2 ... - uses: slackapi/slack-github-action@v1.14.0 with:

    slack-message: | <@qa_ug_id> new RC of ${{ steps.upload.outputs.package_name }} is available. `${{ github.event.head_commit.message }}` Rev. #$(cat ${{ steps.upload.outputs.response_json_path }} | jq -r '.results.revision') Install via ${{ steps.upload.outputs.distribution_url }} QA陣へ能動的に 修正内容を伝える 配信サービス上で 特定出来る情報を含める DeployGate + GitHub Actions での実装例 3/4 実践 Showcases - 実装例の紹介 - リリース前QA
  41. A B C D コードレビュー プロトタイプお触り会 リリース前QA 番外編 - 今すぐできる改善

    実装例の紹介 3/4 実践 Showcases
  42. 日々の細かい時間の無駄遣いを減らす 有意義な情報をアップロードする 手動で配布出来るようにしておく A B 3/4 実践 Showcases - 実装例の紹介

    - D 番外編 - 今すぐ出来る改善
  43. 欲しい成果物を特定出来るようにしておく ビルド環境のメタデータ e.g. Commit SHA1、ブランチ名 Variant を表現する文字列 トリガー(理由)を含める とりあえず詰め込む大量の git

    log 意味のない文字列 e.g. 空文字、固定文字列 (“new update” など) ✅ ✅ ✅ ❌ ❌ message: | Ran ./gradlew assembleDebug on ${{ github.ref }} / ${{ github.sha }} Built by GitHub Actions for prototype behavior check 3/4 実践 Showcases - 実装例の紹介 - D 番外編 - 今すぐ出来る改善
  44. 継続的でなくてもいいので、素早く配布出来るように on: workflow_dispatch: inputs: ref: required: true variant: required: true

    track-name: required: true jobs: assemble-and-distribute: steps: - // checkout at ${{ github.event.inputs.ref }} - id: build // setup-java, generate ${{ github.event.inputs.variant }} aab uses: ./.github/actions/bundle_aab - uses: jmatsu/dg-upload-app-action@v0.2 with: message: | ${{ steps.build.outputs.build-metadata }} Built by GitHub Actions for manual distribution distribution_find_by: name distribution_id: ${{ github.event.inputs.track-name }} // or - uses: wzieba/Firebase-Distribution-Github-Action@v1 with: groups: ${{ github.event.inputs.track-name }} releaseNotes: | ${{ steps.build.outputs.build-metadata }} Built by GitHub Actions for manual distribution 3/4 実践 Showcases - 実装例の紹介 - D 番外編 - 今すぐ出来る改善
  45. 01 02 03 04 Agenda アプリ配信ワークフローとよくある問題点 アプリ配信の理解を深める 実践 Showcases まとめ

  46. まとめ アプリ配信機構の目的と実際の業務をしっかりと結びつけましょう 「いつ、誰が使い、何を、どうやって配信するか」に分解しましょう アプリ配信には色々な目的と発案者属性があることを意識しましょう 修正頻度が少ないのは仕方がないので、式年遷宮をしてみましょう

  47. Appendix - DeployGate - https://deploygate.com - Firebase App Distribution -

    https://firebase.google.com/docs/app-distribution - GitHub - http://github.com/ - GitHub Actions - https://github.com/features/actions - Bitrise - https://www.bitrise.io/ - いらすとや - http://www.irasutoya.com/ - サンプル置き場 - https://github.com/jmatsu/droidkaigi2021-appendix