$30 off During Our Annual Pro Sale. View Details »

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

Matsuda Jumpei

October 20, 2021
Tweet

More Decks by Matsuda Jumpei

Other Decks in Programming

Transcript

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

    View Slide

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



    View Slide

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



    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  39. 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

    View Slide

  40. - 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

    View Slide

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

    View Slide

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

    View Slide

  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 番外編 - 今すぐ出来る改善

    View Slide

  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/[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 番外編 - 今すぐ出来る改善

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide