PC,モバイル,VRに対応したマルチプラットフォームアプリのリリースフロー

この記事は [クラスター Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cluster) 8日目の記事です。
昨日は @UnlimitedBuildWorks さんの [私とEyePhoneの出会い](https://qiita.com/UnlimitedBuildWorks/items/0952ad190f0052d532bb) でした。
30年前からHMDが存在していたのに驚きですね！！

こんにちは！クラスター株式会社でSoftware Engineerをしているizumiです。
私は現在主にiOS/Unityの開発と、アプリのリリース担当をしています。

# clusterの対応プラットフォーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117503/6a1a6686-e1a9-0030-9a32-c53a5f979c43.png)

「cluster」は、VRからスマホまでどこからでも遊べるメタバースプラットフォームとして、現在では以下のプラットフォーム向けのクライアントアプリケーションを開発しています。

- Windows Desktop
- Windows VR
- macOS
- iOS
- Android
- Meta Quest2

また、クライアントアプリ以外にWebアプリケーションの開発も行っており、Webを含めた全てのプラットフォームに対して基本的に毎週リリースを行っています。

# clusterのリリースフロー
clusterのリリースフローを簡単にまとめると下記のようになります。
基本的にこのサイクルで毎週アプリのリリースを行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117503/2dafc83f-5f71-0c97-4277-50637275557f.png)


## branch cut ~ RC build
clusterではモノレポでの開発を行っており、一部のプラットフォームやコードを除いて基本的に1つのリポジトリで管理し、開発中の機能はFeatureFlagで分岐するようにしてmain branchへどんどんマージしています。
[※FeatureFlagや機能開発については弊社のtech blogでも解説しています](https://note.com/cluster_official/n/n88574072ac88)

毎週月曜日に現在のmain branchからRelease Candidate(RC) branchを作成(=branch cut)し、各プラットフォーム向けにビルドを行います。
RC branchの作成、buildはCIで行われ、この時に各Platformのバージョン番号も統一して割り当てています。
CIにはGitHub ActionsとJenkinsを採用しており、モバイルアプリのbuildや配信にはfastlaneを用いています。

ビルドした成果物は、iOSはTestFlight、AndroidはFirebase App Distribution、Meta QuestはQuest StoreのAlpha Channel、PC版はS3、といったように各プラットフォーム毎の配信方法で社内のQAチームへと配信されます。

図にすると以下のような構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117503/b29a0dee-3569-78ed-702f-2ed731c10a25.png)


## QA
火曜日から木曜日まではQAフェーズです。
branch cutで配信したビルドを用いてQAチームが新規機能のテストからリグレッションテストまでを行います。
(clusterのQAチームはいつも短期間で多くのプラットフォームのテストしていて非常に頼もしいです！！)

バグがあった場合には、バグの優先度がトリアージされ、リリース不可なバグと判断された場合にはRC branchへの修正のcherry-pickやバグがあった機能のFeatureFlagをOFFにしてリリースの見送りが判断されることもあります。

## 審査提出
QA完了後、App Store / Google Playへの審査提出を行います。
主にここからがリリース担当者である筆者の仕事になります。

審査に提出する際のリリースノートやストア情報の更新などはプロダクトマネージャーやマーケティングチームのメンバーと共同で作成します。
この時に例えば、VRに関する新機能はVR対応のプラットフォームにのみ記載するようにする、などプラットフォーム毎にリリースノートを最適化することもあります。

リリースノートが完成したあとは各プラットフォームの審査に提出し、審査が通るよう祈ります :pray: 

## リリース
審査通過後はいよいよリリースです。
自動リリースなどは行わずに、各種ストアでの公開やリリース用のCIを手動で実行しています。
基本的にはボタンをポチポチするだけの作業ですが、常に程よい緊張感を持ちながらリリースしています。

この作業によってPC、Mobile、VR、全てのプラットフォームの新しいバージョンが同時にユーザーへ届けられます。
(※厳密にはストア反映による多少のタイムラグがあります)

リリース内容は社内にも展開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117503/2c6567ac-c0c6-d12f-43ba-01aa1854e9e8.png)
リリース担当をすると沢山リアクションも貰えるので役得ですね。 

# おわりに

このようなフローでclusterでは全てのプラットフォームのリリースタイミングを揃えて定常的にリリースしています。

モバイルアプリなどではiOS/Android別々にリリースするケースもよくありますが、各プラットフォームのリリースを揃える事によってユーザーへの告知タイミングを揃えられる点や、強制アップデートやリリース時期の調整が必要になった場合にもリリース担当者が全プラットフォーム管理しているのでコミュニケーションパスが分かりやすくなることが利点かと思っています。
また、個人的に今まではApp Store Connectしか触っていなかったのですが、clusterでリリースを担当するようになってGoogle PlayやMeta Quest向けのダッシュボードも触るようになったことは新鮮でした。

ちなみに2022年は今日までに**47回のリリースを行いました！**
(※hotfixなどの緊急リリースは除く)

来年以降も定常的にアプリをリリースできる環境を保っていきたいですね。
リリースフローには改善の余地もまだまだあるので、改善したいエンジニアも[絶賛募集中です！](https://recruit.cluster.mu/engineer/)

さて、明日は @toyakun さんのクラフトアイテム制作Tips＆公式アイテムの話です。
今年リリースされたワールドクラフトのアイテム制作の話ということで非常に楽しみです！