Slide 1

Slide 1 text

© 2024 Cookpad Inc. Androidアプリの One Experience リリース こやまカニ大好き

Slide 2

Slide 2 text

こやまカニ大好き 2015年入社 入社してからずっと Androidアプリの開発 One Experience プロジェクトでやったこと ● JPアプリの上書き系処理の設計・実装 ● JPアプリのリリース作業全般 ● イジンデン © 2024 Cookpad Inc. 2 自己紹介

Slide 3

Slide 3 text

● ダイソーから出ているTCG ● 構築済みデッキが110円で 購入できるので参入しやすい ● 長期プロジェクトの メンタルケアに最適 ● https://one-draw.jp/ijinden.html 未承諾広告※ イジンデンとは © 2024 Cookpad Inc. 3

Slide 4

Slide 4 text

今日話すこと © 2024 Cookpad Inc. 4

Slide 5

Slide 5 text

© 2024 Cookpad Inc. 5 このセッションでは技術的な話はあまりありません クックパッドのJPアプリを One Experience 版にアップデートしてリリースする上で、 私達がどのようにリスクを考え、 どういう部分をコントロールできるようにリリースしていったかを説明していきます。 もし今後同じような作業が必要になったとき、参考にしていただけると嬉しいです。 今日話すこと

Slide 6

Slide 6 text

© 2024 Cookpad Inc. 6 クックパッドではレシピサービスを67ヶ国、26言語で展開中 これまでは日本とそれ以外で独立した2つのサービスを運用していた One Experience は日本向けのクックパッドサービスを Global で運用されていたサービスに統一し、 全てのユーザーに同じ体験を提供するプロジェクト 詳しくはクックパッド開発者ブログを御覧ください。 https://techlife.cookpad.com/entry/2024/10/10/105832 One Experience プロジェクトについて

Slide 7

Slide 7 text

© 2024 Cookpad Inc. 7 JP アプリと Global アプリは完全に別のアプリ ● APIも別、データベースも別 ● クライアント側のコード共有率もほぼゼロ ● デザインも大きく異なる ● プロジェクト開始時点では日本語対応もない Android の JP アプリと Global アプリの違い

Slide 8

Slide 8 text

© 2024 Cookpad Inc. 8 Android の旧 JP アプリと Global ベースのアプリの違い 旧JP OneEx

Slide 9

Slide 9 text

© 2024 Cookpad Inc. 9 モバイルの One Experience プロジェクトでは、 JP版アプリを完全にコードベースが異なるアプリで上書きしつつ、 それまでのユーザーと同じ状態でログインしたまま、 アプリ内のデータも引き継いた状態で動かせるようにする。 モバイルの One Experience プロジェクト

Slide 10

Slide 10 text

© 2024 Cookpad Inc. 10 ある日ユーザーが起きるとアプリが全然別物になっているが、 ユーザーさんに「デザインリニューアルしたんだな」 程度に思ってもらえるように極力頑張る。 モバイルの One Experience プロジェクト

Slide 11

Slide 11 text

アプリ側の修正 © 2024 Cookpad Inc. 11

Slide 12

Slide 12 text

© 2024 Cookpad Inc. 12 JP版アプリとしてリリースするため、以下のような設定が必要 ● 日本版アプリのビルド設定 ○ ApplicationId ○ アプリバージョン ○ 証明書などなど ● Firebase プロジェクト ● データの引き継ぎ ○ 認証情報(AccountManager) ○ ローカルデータ(Room) ● ストア情報 アプリ側の修正

Slide 13

Slide 13 text

© 2024 Cookpad Inc. 13 ● JP版アプリのビルド設定は、 flavor で切り替え ● この作業は後続の作業をブロックするので、最初期に行う必要がある ● 具体的な手法については開発者ブログを参照 ● Android では flavor dimension という仕組みを使った柔軟なビルド設定が可能で、ドキュ メントも充実している ○ https://developer.android.com/build/build-variants Gradle Composite Build を用いたビルドロジックの共通化について https://techlife.cookpad.com/entry/2024/11/20/130000 JP版アプリのビルド設定

Slide 14

Slide 14 text

© 2024 Cookpad Inc. 14 ● JP版とGlobal版はバージョニングルールにも違いがあった ● Global版はセマンティックバージョニング ○ major.minor.patch.build ○ 毎週リリースのたびに minor を繰り上がる ○ hotfix では build が繰り上がる ● JP版は yy.ww.bb.bb ○ ww はリリース日の週番号 ○ bb はビルド番号(最大4桁) ○ 毎週リリースのたびに ww が繰り上がる ○ hotfix では bb が繰り上がる ● 今後も週次リリース予定なので、JP版のルールで統一することに アプリバージョン

Slide 15

Slide 15 text

© 2024 Cookpad Inc. 15 One Experience の段階リリース中は アプリバージョンのルールを一部変更していた ブランチ運用やバージョニングを簡略化することで Global アプリの週次リリースへの影響を抑えるため ● 100%になるまではJPアプリを v24.27.xx.xx で固定 ● xx.xx の部分はリポジトリで管理せず、 Google Play のバージョンを見て自動で繰り上げ アプリバージョン(段階リリース中)

Slide 16

Slide 16 text

© 2024 Cookpad Inc. 16 JPアプリとGlobalアプリは Firebase プロジェクトも別だった 今回のプロジェクトにあたり、以下の2つの方針のどちらを取るか悩んだ。 ● Global/JPアプリで同一の Firebase プロジェクトを利用する ○ Google Analytics や Crashlytics の情報の継続性が失われる ● JPアプリではこれまで利用していた Firebase プロジェクトを維持する ○ 主にプッシュ通知まわりでバックエンドの追加開発が必要 プッシュ通知のような重要な仕組みを壊さない事を優先し、 JPアプリの Firebase プロジェクトを切り替えることにした。 Firebase プロジェクト

Slide 17

Slide 17 text

© 2024 Cookpad Inc. 17 旧JPアプリ内のローカルデータを OneExperience版で扱うためには、 データのマイグレーション処理が必要になる。 クックパッドではほとんどのデータをサーバ側にもたせているが、 以下の2種類のデータはマイグレーションが必要だった ● 認証情報のマイグレーション ○ AccountManager に保存されていた ○ 旧JPアプリのトークンとGlobalユーザーのトークンを交換することでログイン状態を 継続できる ● 検索履歴のマイグレーション ○ 検索履歴はローカルDBに保存されていた ローカルデータのマイグレーション

Slide 18

Slide 18 text

© 2024 Cookpad Inc. 18 ● 旧JPアプリでは AccountManager という仕組みで認証情報を保存 ● Global アプリでは AccountManager を利用していなかった ● 以下のような実装を追加した ○ 旧JP版と互換性のある AccountManager 定義を Global 版に追加 ○ アプリ起動時にマイグレーション済みでなければ AccountManager から認証情報を 取得し、ログインを行う処理を追加 ○ 新しい認証情報の保存先は AccountManager ではないので、将来的には AccountManager の設定は削除予定 認証情報のマイグレーション

Slide 19

Slide 19 text

© 2024 Cookpad Inc. 19 ● マイグレーション処理の手順、APIの仕様はRFCと呼ばれる社内向けの Markdown 仕様 書で管理 ○ RFCは Pull Request で提出され、関係者のレビューを経由して最終仕様としてマー ジされる ○ 内容に変更があれば追加のPRで修正する ○ テストを書く際や仕様の確認に非常に便利 認証情報のマイグレーション

Slide 20

Slide 20 text

© 2024 Cookpad Inc. 20 ● 検索履歴は JP, Global の両方で Room に保存していた ● たまたまDatabase名が違っていたため、JPのスキーマ定義を移植し、 Globalアプリ側のDBにマイグレーション処理を仕込むことができた ● もしDB名、テーブル名が被っていたら検索履歴のマイグレーションはうまくいかなかった かもしれない ● 通常のアップデートではあり得ないDB名・マイグレーション処理の衝突が起きるので注意 が必要 検索履歴のマイグレーション

Slide 21

Slide 21 text

リリース作業 © 2024 Cookpad Inc. 21

Slide 22

Slide 22 text

© 2024 Cookpad Inc. 22 OneExperienceのリリースをしていく上で、 以下のようなルールをあらかじめ決めていた。 ● 段階的な公開機能を利用してリリースを行う ● 段階リリースを開始したらロールバックはしない ● 100% リリースされるまでは Global 版と独立したリリースとして扱い、 すべてのリリースを別ブランチから配信する リリース作業

Slide 23

Slide 23 text

© 2024 Cookpad Inc. 23 今回のプロジェクトでは、アプリのロールバックが非常に難しい ● OneEx -> JP -> OneEx の順にアップデートしたとき 認証マイグレーションを適切に行えない ○ 最初の時点で OneEx版にログイン済みの場合があるため ● JP -> OneEx -> JP -> OneEx の順にアップデートしたとき 2回目の OneExアップデートで認証マイグレーションを適切に行えない ○ 1回目のアップデート時点で OneEx版にログイン済みの場合があるため ● 旧JP版とOneEx版の2つのプロジェクトの バージョン番号をあわせて更新していく必要がある ● などなど ロールバックについて

Slide 24

Slide 24 text

© 2024 Cookpad Inc. 24 今回のプロジェクトでは、アプリのロールバックが非常に難しい ● OneEx(新規インストール) -> JP -> OneEx の順にアップデートしたとき ロールバックについて このとき最初の One Experience 版の データが読み込まれるため JP版の認証情報が反映されない One Ex One Ex JP

Slide 25

Slide 25 text

© 2024 Cookpad Inc. 25 今回のプロジェクトでは、アプリのロールバックが非常に難しい ● JP -> OneEx -> JP -> OneEx の順にアップデートしたとき ロールバックについて このとき旧JPのトークンがす でにないのでログアウト JP側でのログイン・ログア ウトが反映されない JP JP One Ex One Ex

Slide 26

Slide 26 text

© 2024 Cookpad Inc. 26 これらの問題から、プロジェクトのかなり初期の段階で アプリのロールバックは行わないことに決めていた ロールバックを行わない仕様にしたことで JP版アプリのメンテナンスをほぼ完全に停止できた targetSdkVersion の更新や Google Play Billing Library の更新など 細々した作業もなくなり OneExperience 版の作業に集中できた ロールバックについて

Slide 27

Slide 27 text

© 2024 Cookpad Inc. 27 Global 版の週次リリースフローを壊さないように、 JP版は以下の手順でリリースを行うことにした ● JPリリース用に jp-release ブランチを用意する ● JP向けの全ての修正は main ブランチにマージする ● リリースしたいタイミングで main ブランチを jp-release にマージし、 jp-release からリリースする リリース手順について

Slide 28

Slide 28 text

© 2024 Cookpad Inc. 28 リリース手順について(図) main release hotfix jp-release Global リリース Global リリース バックマージ バックマージ JP リリース JP リリース JP リリース JP リリース jp-release 固有の 差分がないので バックマージ不要

Slide 29

Slide 29 text

© 2024 Cookpad Inc. 29 main に常にJP向けの修正が含まれていることで 複数のリリースブランチから main にバックマージする必要がなくなり、 管理がシンプルになる。 jp-release に global 側の未検証のバグが入る可能性はあるが、 そこはJP版のリリース頻度を上げてカバーしている。 とにかく、JPアプリを高頻度、かつシンプルなフローでリリースできることに注力 リリース手順について

Slide 30

Slide 30 text

© 2024 Cookpad Inc. 30 JPアプリの別ブランチ管理について ● 良い面 ○ Global アプリ側の週次リリースフローに影響を及ぼすことなく、高頻度でリリースが 可能になった ○ 実際にリリース初期はかなり高頻度でリリースしていたので、有用だった ● 悪い面 ○ 特殊なリリースフローになってしまったので、リリースの自動化に関する部分が後回 しになった ○ Global とリリースフローが揃い、 changelog やストア情報も完全に同期されるように なったのは先月 リリースフローの反省点

Slide 31

Slide 31 text

© 2024 Cookpad Inc. 31 ● 段階リリース開始から 100% リリースするまで3週間くらい ● 期間中のAndroidアプリリリース回数は14回 ● 公開率5%で足踏みしていた期間が長く、 ユーザーの反応をみてバグを修正したりUIを変更したりしていた ● 旧JPアプリではOneExperience 後のURLから起動できなくなるため、 Webが100%リリースされるタイミングで全プラットフォームが 100% リリース ● 当時は毎日 Firebase の Release Monitoring を眺めて過ごしていた リリース期間

Slide 32

Slide 32 text

© 2024 Cookpad Inc. 32 リリース前に変化を監視するためのダッシュボードを作成したりしていたが、 運用してみるとログ内容が想定と違っていたりしてかなり苦労した ● Firebase プロジェクトが切り替わったことで、 Google Analytics 上での変化などを監視できなくなった ● 自前でログを取得していたので集計はできているが、 OneExperience 前後でログの内容もタイミングも変わってしまった ● そのため、ユーザー行動の監視には今でもかなり苦労している リリース後の監視

Slide 33

Slide 33 text

まとめ © 2024 Cookpad Inc. 33

Slide 34

Slide 34 text

© 2024 Cookpad Inc. 34 ● リリースだけでも考えることが多くて大変なプロジェクトだったが、 致命的な問題なくアプリを上書きすることができた ● ほとんどのユーザーにはUIリニューアルだと感じてもらえていそう ● 段階リリース中の変則的なリリースフローも解消され、 現在はJP/Global を同時に週次リリースしている ● 今後も効率的な開発フローで クックパッドアプリの改善を進めていきます まとめ

Slide 35

Slide 35 text

© 2024 Cookpad Inc. 35