DroidKaigi 2021 Day2 で発表したアプリ配信フローを構築するための話です。
https://droidkaigi.jp/2021/timetable/276963/?day=2 https://github.com/jmatsu/droidkaigi2021-appendix https://www.youtube.com/watch?v=DA2ziL4qgZk
A Practical Guide to BuildingMobile App Distribution WorkflowsJumpei Matsuda
View Slide
この発表の”アプリ配信”の想定(✅)・想定範囲外(❌)組織内配布、オープン/クローズテストでのSideloading本番ストアやMDMストアへの配布OSS での配布✅❌❌
この発表を通して知ってほしいことアプリ配信ワークフローの考え方開発プロセス中に出てくる配信目的の多様性アプリ配信手法天下一武道会✅✅❌
アプリ配信ワークフローとよくある問題点アプリ配信の理解を深める実践 ShowcasesまとめAgenda01020304
01020304Agendaアプリ配信ワークフローとよくある問題点アプリ配信の理解を深める実践 Showcasesまとめ
アプリ配信ワークフローの概念図テスター配信環境e.g. CI/CD サービスビルド環境e.g. アプリ配信サービス1/4 アプリ配信ワークフローとよくある問題点
アプリ配信ワークフローの概念図テスター配信環境e.g. CI/CD サービスビルド環境e.g. アプリ配信サービスタイミングは?何を?何をしたい?いつ? 誰に?どうして?1/4 アプリ配信ワークフローとよくある問題点
アプリ配信を伴う業務フローって何だろう?開発ブランチ・プロトタイプの挙動確認リリース前QA (内部・外部)インハウス配信E2Eテスト新機能のデモといった営業利用1/4 アプリ配信ワークフローとよくある問題点
運用中のアプリ配信機構によくある問題点誰も高い理解度を持っていない長いこと使っていて便利だと思ってるけど、ゼロから構築出来ないなぜその構成になっているか知らない保守運用に関する問題継続的な修正はほぼなく、アドホックな対応が求められる担当者はおらず、失敗(貧乏くじ)を引いた人が直す運用者(e.g. QA担当者)とは異なった人が保守しないといけない1/4 アプリ配信ワークフローとよくある問題点
運用中のアプリ配信機構によくある問題点誰も高い理解度を持っていない長いこと使っていて便利だと思ってるけど、ゼロから構築出来ないなぜその構成になっているか知らない保守運用に関する問題継続的な修正はほぼなく、アドホックに対応する担当者はおらず、失敗(貧乏くじ)を引いた人が直運用者(e.g. QA担当者)とは異なった人が保守しないといけない理解するしかない運用方針を決めるしかない1/4 アプリ配信ワークフローとよくある問題点
段階的にアプリ配信機構を理解する最低限の検討項目保守運用に関する責務の所在アプリ配信サービスとは複数の事例とその目的を知る010203042/4 アプリ配信機構の理解を深める
01020304段階的にアプリ配信機構を理解する最低限の検討項目保守運用に関する責務の所在アプリ配信サービスとは複数の事例とその目的を知る2/4 アプリ配信機構の理解を深める
01 - 最低限の検討項目いつ配信準備をするのか何を配信するのか配信されたものを誰がいつ使うのかどうやって配信するのかABCD2/4 アプリ配信機構の理解を深める
開発プロセス内の細粒度のチェックポイントコードレビュープロトタイプのお触り会プレリリースバージョンの発行されたときAlpha/Beta/Release Candidateオンデマンド or 先んじて営業のデモ、サーバーインフラ変更時、API変更時 etc.A - いつ配信準備をするのか2/4 アプリ配信機構の理解を深める - 01 最低限の検討項目忘れられがち忘れられがち
B - 何を配信するのか機能差を意識した種別プラットフォーム別 (AndroidOS, AndroidTV, WatchWearOS, FireOS etc.)Variant (本番相当のビルド、QAツール入り、デバッグビルド etc.)安定度や時間を意識した種別マイルストーン (開発中のバージョン、プレリリースバージョン etc.)2/4 アプリ配信機構の理解を深める - 01 最低限の検討項目
C - 誰が配信されたものをいつ使うのか内部関係者・委託先 - ある程度、インストールタイミングが予測可能QA担当者開発に関わるAndroidアプリ開発者それ以外の開発者・デザイナー・ディレクター・営業外部 - すぐインストールするとは限らないClosed Test のテスターOpen Test のテスター2/4 アプリ配信機構の理解を深める - 01 最低限の検討項目
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 最低限の検討項目
管理対象ごとに分け、かつ分けられる方法を選ぶ2/4 アプリ配信機構の理解を深める - 02 保守運用に関する責務の所在アプリ開発者が担当するべき管理対象配信アプリの管理目的に応じた適切な Variant などの選択配信の準備タイミングの管理目的から適切なタイミングを選定・維持配信対象側が担当するべき管理対象配信対象のグループ管理QAチームの管理はQAチーム内部の人間が、公募やお触り会は PdM が
管理対象ごとに分け、かつ分けられる方法を選ぶアプリ開発者が担当するべき管理対象配信物の管理目的に応じた適切な Variant などの選択配信の準備タイミングの管理目的から適切なタイミングを選定・維持配信対象側が担当するべき管理対象配信対象のグループ管理QAチームの管理はQAチーム内部の人間が、公募やお触り会は PdM が共有ストレージだとAccess Control が難しい2/4 アプリ配信機構の理解を深める - 02 保守運用に関する責務の所在
アプリ専用のストレージサービスとは言えないインストールに関する支援が主な機能OTA機能; サービスを介してアプリのアップロードとダウンロードができる配信対象管理; 配信対象者の許容リスト、配信対象のグループ化ビルド成果物の管理ストレージではないメモ機能程度しかなく、「適切なビルド」は開発者でないと判別が困難ライフサイクルはサービスに依存し、殆どが時間か数で削除される2/4 アプリ配信機構の理解を深める - 03 アプリ配信サービスとは
業務・目的の代表例2/4 アプリ配信機構の理解を深める - 04 複数の事例とその目的を知るコードレビュー プロトタイプお触り会 リリース前QA ドッグフーディングいつ 都度(高頻度) やや突発的 計画的(リリーススケジュールに準拠)自由(いつでも)何を 開発中のブランチ上の成果物特定の機能を含んだ版 プレリリース版過去のQA済み版(本番)QA済みRC版誰に 開発者(特にレビュワー)チーム関係者 QA担当者 チーム関係者全社内関係者どうやって 開発者が用意、またはCI/CDによる自動化e.g. 配信サービスや共有ストレージ開発者が用意するe.g. 配信サービスや共有ストレージ、物理アクセスも可配信サービスを経由し、自発的に取得またはリアルタイム通知にて受け取る配信対象者が自発的に取得出来るe.g. 配信サービスや共有ストレージ
業務・目的の代表例 (時間の都合で資料のみ)Hot Fix デザインレビュー 営業デモ Open/Closed テストいつ 突発的 計画的 or 突発的(チームに依存)突発的 計画的 or 突発的(チームに依存)何を 修正ブランチ上の成果物RC版(QA済みかは業務フローに依存)QA済みRC版プロトタイプ版QA済みRC版誰に 開発者(特にレビュワー)チームのデザイナー 社内非開発者 公募テスター社内テスターどうやって 開発者が用意、または自動化によるe.g. CI/CDデザイナーが自発的に取得出来る or 開発者が用意するe.g. 配信サービスや共有ストレージ配信サービスを経由し、自発的に取得またはリアルタイム通知にて受け取る開発者(または企画者)が配信サービスを利用して配布する2/4 アプリ配信機構の理解を深める - 04 複数の事例とその目的を知る
実装例の紹介コードレビュープロトタイプお触り会リリース前QA番外編 - 今すぐできる改善ABCD3/4 実践 Showcases
ABCDコードレビュープロトタイプお触り会リリース前QA番外編 - 今すぐできる改善実装例の紹介3/4 実践 Showcases
CI3/4 実践 Showcases - 実装例の紹介 - A コードレビューざっくりとしたイメージand moreURLなどの導線が発行出来るもの通知先
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: uploaduses: 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-reviewdistribution_find_by: namedistribution_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 コードレビュー
CIざっくりとしたイメージ共有ストレージ配信サービス参加者がアクセスできれば何でも良いお触り会中に修正するなら配信サービスが良い手動3/4 実践 Showcases - 実装例の紹介 - B プロトタイプお触り会
お触り会用にグループを作るFirebase App Distribution + GitHub Actions での実装例3/4 実践 Showcases - 実装例の紹介 - B プロトタイプお触り会
on:pull_requestjobs: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@v1with:appId: ... // app idtoken: ... // auth token via secrets (or use service account)groups: ${{ github.event.pull_request.head.ref }} // == 20211020-droidkaigi-day2-prototypefile: ... // app pathreleaseNotes: |Ran ./gradlew assembleDebug on ${{ github.ref }} / ${{ github.sha }}Built by GitHub Actions for prototype behavior checkbranch名の規則性 +特定ラベルがついているbranch 名を配信グループ名と一致させるRev., Variant, 目的を明示的に表現Firebase App Distribution + GitHub Actions での実装例3/4 実践 Showcases - 実装例の紹介 - B プロトタイプお触り会
お触り会グループへの招待リンクが便利Firebase App Distribution + GitHub Actions での実装例3/4 実践 Showcases - 実装例の紹介 - B プロトタイプお触り会
CIざっくりとしたイメージand moreプレリリースの発行3/4 実践 Showcases - 実装例の紹介 - C リリース前QAタグやマージ デグレなどを考慮し、過去の版もインストール可能であるべき開発者が指定した版をQA するので配信サービスがオススメ複数のアプリを担当していることも。明示的な通知が良い
on:push:branches:- 'release/*'jobs:assemble-and-distribute:steps:- ...- id: uploaduses: 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 distributiondistribution_find_by: namedistribution_id: pre-release-qa特定のブランチでのpushCommit Message をリリースノートとして扱うQA用に固定された共有リンクを使うDeployGate + GitHub Actions での実装例3/4 実践 Showcases - 実装例の紹介 - C リリース前QA
- id: uploaduses: 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
日々の細かい時間の無駄遣いを減らす有意義な情報をアップロードする手動で配布出来るようにしておくAB3/4 実践 Showcases - 実装例の紹介 - D 番外編 - 今すぐ出来る改善
欲しい成果物を特定出来るようにしておくビルド環境のメタデータ 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 check3/4 実践 Showcases - 実装例の紹介 - D 番外編 - 今すぐ出来る改善
継続的でなくてもいいので、素早く配布出来るようにon:workflow_dispatch:inputs:ref:required: truevariant:required: truetrack-name:required: truejobs:assemble-and-distribute:steps:- // checkout at ${{ github.event.inputs.ref }}- id: build // setup-java, generate ${{ github.event.inputs.variant }} aabuses: ./.github/actions/bundle_aab- uses: jmatsu/[email protected]with:message: |${{ steps.build.outputs.build-metadata }}Built by GitHub Actions for manual distributiondistribution_find_by: namedistribution_id: ${{ github.event.inputs.track-name }}// or- uses: wzieba/Firebase-Distribution-Github-Action@v1with:groups: ${{ github.event.inputs.track-name }}releaseNotes: |${{ steps.build.outputs.build-metadata }}Built by GitHub Actions for manual distribution3/4 実践 Showcases - 実装例の紹介 - D 番外編 - 今すぐ出来る改善
まとめアプリ配信機構の目的と実際の業務をしっかりと結びつけましょう「いつ、誰が使い、何を、どうやって配信するか」に分解しましょうアプリ配信には色々な目的と発案者属性があることを意識しましょう修正頻度が少ないのは仕方がないので、式年遷宮をしてみましょう
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