Slide 1

Slide 1 text

A Practical Guide to Building Mobile App Distribution Workflows Jumpei Matsuda

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

アプリ配信ワークフローの概念図 テスター 配信環境 e.g. CI/CD サービス ビルド環境 e.g. アプリ配信サービス タイミングは? 何を? 何をしたい? いつ? 誰に? どうして? 1/4 アプリ配信ワークフローとよくある問題点

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

開発プロセス内の細粒度のチェックポイント コードレビュー プロトタイプのお触り会 プレリリースバージョンの発行されたとき Alpha/Beta/Release Candidate オンデマンド or 先んじて 営業のデモ、サーバーインフラ変更時、API変更時 etc. A - いつ配信準備をするのか 2/4 アプリ配信機構の理解を深める - 01 最低限の検討項目 忘れられがち 忘れられがち

Slide 16

Slide 16 text

B - 何を配信するのか 機能差を意識した種別 プラットフォーム別 (AndroidOS, AndroidTV, WatchWearOS, FireOS etc.) Variant (本番相当のビルド、QAツール入り、デバッグビルド etc.) 安定度や時間を意識した種別 マイルストーン (開発中のバージョン、プレリリースバージョン etc.) 2/4 アプリ配信機構の理解を深める - 01 最低限の検討項目

Slide 17

Slide 17 text

C - 誰が配信されたものをいつ使うのか 内部関係者・委託先 - ある程度、インストールタイミングが予測可能 QA担当者 開発に関わるAndroidアプリ開発者 それ以外の開発者・デザイナー・ディレクター・営業 外部 - すぐインストールするとは限らない Closed Test のテスター Open Test のテスター 2/4 アプリ配信機構の理解を深める - 01 最低限の検討項目

Slide 18

Slide 18 text

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 最低限の検討項目

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

管理対象ごとに分け、かつ分けられる方法を選ぶ 2/4 アプリ配信機構の理解を深める - 02 保守運用に関する責務の所在 アプリ開発者が担当するべき管理対象 配信アプリの管理 目的に応じた適切な Variant などの選択 配信の準備タイミングの管理 目的から適切なタイミングを選定・維持 配信対象側が担当するべき管理対象 配信対象のグループ管理 QAチームの管理はQAチーム内部の人間が、公募やお触り会は PdM が

Slide 21

Slide 21 text

管理対象ごとに分け、かつ分けられる方法を選ぶ アプリ開発者が担当するべき管理対象 配信物の管理 目的に応じた適切な Variant などの選択 配信の準備タイミングの管理 目的から適切なタイミングを選定・維持 配信対象側が担当するべき管理対象 配信対象のグループ管理 QAチームの管理はQAチーム内部の人間が、公募やお触り会は PdM が 共有ストレージだと Access Control が難しい 2/4 アプリ配信機構の理解を深める - 02 保守運用に関する責務の所在

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

業務・目的の代表例 2/4 アプリ配信機構の理解を深める - 04 複数の事例とその目的を知る コードレビュー プロトタイプお触り会 リリース前QA ドッグフーディング いつ 都度(高頻度) やや突発的 計画的(リリーススケ ジュールに準拠) 自由(いつでも) 何を 開発中のブランチ 上の成果物 特定の機能を含んだ版 プレリリース版 過去のQA済み版(本番) QA済みRC版 誰に 開発者 (特にレビュワー) チーム関係者 QA担当者 チーム関係者 全社内関係者 どうやって 開発者が用意、ま たはCI/CDによる自 動化 e.g. 配信サービス や共有ストレージ 開発者が用意する e.g. 配信サービスや共 有ストレージ、物理アク セスも可 配信サービスを経由し、 自発的に取得またはリ アルタイム通知にて受 け取る 配信対象者が自発的 に取得出来る e.g. 配信サービスや共 有ストレージ

Slide 26

Slide 26 text

業務・目的の代表例 (時間の都合で資料のみ) Hot Fix デザインレビュー 営業デモ Open/Closed テスト いつ 突発的 計画的 or 突発的(チー ムに依存) 突発的 計画的 or 突発的(チー ムに依存) 何を 修正ブランチ上の 成果物 RC版(QA済みかは業務 フローに依存) QA済みRC版 プロトタイプ版 QA済みRC版 誰に 開発者 (特にレビュワー) チームのデザイナー 社内非開発者 公募テスター 社内テスター どうやって 開発者が用意、ま たは自動化による e.g. CI/CD デザイナーが自発的に 取得出来る or 開発者が 用意する e.g. 配信サービスや共 有ストレージ 配信サービスを経由 し、自発的に取得また はリアルタイム通知に て受け取る 開発者(または企画者)が 配信サービスを利用して 配布する 2/4 アプリ配信機構の理解を深める - 04 複数の事例とその目的を知る

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

CI 3/4 実践 Showcases - 実装例の紹介 - A コードレビュー ざっくりとしたイメージ and more URLなどの導線が 発行出来るもの 通知先

Slide 31

Slide 31 text

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/[email protected] 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 コードレビュー

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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 プロトタイプお触り会

Slide 36

Slide 36 text

お触り会グループへの 招待リンクが便利 Firebase App Distribution + GitHub Actions での実装例 3/4 実践 Showcases - 実装例の紹介 - B プロトタイプお触り会

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

CI ざっくりとしたイメージ and more プレリリースの発行 3/4 実践 Showcases - 実装例の紹介 - C リリース前QA タグやマージ デグレなどを考慮し、 過去の版もインストール 可能であるべき 開発者が指定した版を QA するので 配信サービスがオススメ 複数のアプリを 担当していることも。 明示的な通知が良い

Slide 39

Slide 39 text

on: push: branches: - 'release/*' jobs: assemble-and-distribute: steps: - ... - id: upload uses: jmatsu/[email protected] 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

Slide 40

Slide 40 text

- id: upload uses: jmatsu/[email protected] ... - uses: slackapi/[email protected] 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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

欲しい成果物を特定出来るようにしておく ビルド環境のメタデータ 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 番外編 - 今すぐ出来る改善

Slide 44

Slide 44 text

継続的でなくてもいいので、素早く配布出来るように 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/[email protected] 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 番外編 - 今すぐ出来る改善

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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