Share
Embed
プリンセスコネクト!Re:Dive運用事例 ~リリースの高頻度化と安定化を両立させるプリコネRの運用体制~
2019/09/06 CEDEC 2019
Cygames, Inc. PRO
September 06, 2019
Transcript
84 slides
-
2/84 概要 • 本講演では、安定したプレイ環境を保ちつつ高頻度リリースを達 成するために、プリンセスコネクト!Re:Dive (以後プリコネ R)で行った取り組みについて紹介します。 • 新機能やイベント公開時のメンテナンスはユーザーのプレイ体験 を著しく阻害します。メンテナンスフリー実現のためには、リ
ソースの下位互換を保つための仕組みと、複数ブランチに跨る大 量リソースの管理をサポートする体制が必要です。 • この体制を実現するためのアプリ設計手法、 CIを用いた大量の開 発ブランチの管理コスト改善事例について詳細に解説します。 -
3/84 Tomita Yasuyuki 冨田 康之 技術本部クライアントサイド ゲームエンジニア 大手コンシューマーゲーム開発会社を経て、 2014年より株式会社Cygamesに所属。 クライアントエンジニアとして
ネイティブアプリ開発部署に従事。 「プリンセスコネクト!Re:Dive」では 開発からリリース・運用まで携わり アプリ開発やビルドシステム環境構築を 担当している。 自己紹介 -
4/84 プリコネRの基本情報 • アニメRPGとして2018年2月15日リリース • iOS / Android / PC
の3プラットフォームにて好評配信中 -
5/84 プリコネRの開発情報 • UnityとGit(GitHubEnterprise)による開発と運用 • バイナリやリソースのビルドやデプロイはJenkinsによるCI • アプリのアップデートタイミングはおよそ1ヵ月に1~2回 • サーバーやリソースのみのリリースは週に平均2回ほど。
月合計でいうと1カ月あたり8回、繁忙期では1か月あたり10回を超える計画 リリースが存在 -
8/84 3プラットフォーム リリースを どう安定させるか 大量の 開発ブランチを どう管理するか リリース時の アプリ互換性を どう維持するか
リリース時のアプリ互換性を保つための設計 複数ブランチに跨る大量リソースの管理を サポート 3プラットフォーム向けリリースの安定化 -
11/84 リリース時のアプリ互換性を保つための設計 • プリコネRでは通常の機能追加やアプリ更新ではメンテナンスに入 らないということもリリース前から決めていた。 • アプリ更新でメンテナンスに入らないということは、既にリリー ス済みのアプリバージョンやサーバー処理 / リソースと、互換性
を持ちながら新しいアプリバージョンを公開する必要がある。 リリース時の アプリ互換性を どう維持するか -
• アプリはユーザーが任意のタイミングでアップデートするため複 数のバージョンが併存する期間が必ず存在する。 • 並存期間中は新アプリは既にリリースされているリソースでも動 く必要がある 16/84 機能を先入れする際に立ちはだかる壁 アプリVer 1
公開期間 公開済み リソース更新(併存期間リソース) 8/15更新 アプリVer 2 公開期間 8/17公開 併存期間 併存期間のリソースは 互換性を保つ必要がある -
18/84 アプリのバージョン境界問題 • リソースデータはアプリのソースコードの影響を受けないデータ を開発段階から選別してダウンロードリソース化 アプリVer 1 併存期間リソース アプリVer 2
併存期間 併存リソースデータ群 ◆画像 ◆パラメータ ◆アニメーションデータ ◆ムービー ◆サウンド etc... -
• 開発フェーズではアプリに依存しないデータとみなしていた • アプリバージョンを跨ぐ際に互換性を維持できなくなる問題 23/84 Prefabのダウンロードリソース化(開発) アプリVer 1 併存期間リソース アプリVer
2 併存期間 併存リソースデータ群 ▪Prefab【危険】 ◆画像 ◆パラメータ ◆アニメーションデータ ◆ムービー etc... -
• 従来のURLとは別にPrefabリソース専用のURLをアプリバー ジョン毎に用意 24/84 Prefab アプリ リソース Prefabのダウンロードリソース化(運用) アプリVer 1
アプリVer 2 併存期間リソース用URL Ver1用Prefab URL https://priconne/Ver1/~ Ver2用Prefab URL https://priconne/Ver2/~ -
• イベント前日に見つかったPrefab起因の不具合にも対応でき、ス トア申請によるスケジュールの変更リスクの軽減に貢献できた。 25/84 Prefab アプリ リソース Prefabのダウンロードリソース化(運用) アプリVer 1
アプリVer 2 併存期間リソース用URL Ver1用Prefab URL https://priconne/Ver1/~ Ver2用Prefab URL https://priconne/Ver2/~ -
• 併存用のリソースもアップデート前後で互換性がなくなっていた ためアプリごとにURLを分けてダウンロードすることで対応。 26/84 Prefab アプリ リソース Unityアップデート時の対応 Unity2017 Ver
Unity2018 Ver Unity2017 Prefab https://priconne/App2017/~ Unity2018用Prefab https://priconne/App2018/~ Unity2017用リソース https://priconne/Res2017/~ Unity2018用リソース https://priconne/Res2018/~ 2バージョン運用は管理が大変 -
• Git-Flowをベースにした開発手法を採用 • develop … 開発の起点になるブランチ • feature … 個々の機能の開発ブランチ(devチェック)
• release … リリース直前のブランチ(stagingチェック) • master … リリースされユーザーの手元に届いた相当の状態(本番部分) • hotfix … リリースデータ修正のためのブランチ(本番修正) 30/84 feature release develop master hotfix プリコネRでのGit運用 -
32/84 feature/2019_09_04 feature/2019_09_06 release/2019_09_04 release/2019_09_06 リリース直前にGit-Flowに準じた形へ • 運用後、よりGit-Flowに準じたフローへ移行 • 本講演では例としてリリースする日付をブランチ名として採用
– feature/2019_09_04 → release/2019_09_04 – feature/2019_09_06 → release/2019_09_06 develop master -
35/84 ブランチの数が爆発的に増加 • 1カ月の間、リリース用に用意するブランチ数はおよそ 10ブランチ × 5リポジトリ分 = 50ブランチ •
開発中の依存関係を減らすべくリポジトリを分けたが、管理コス トが増大した リソース サウンド サーバー ムービー パラメータ -
プリコネR ブランチルールの例 ◼ masterにマージできるのは 「release」か「hotfix」のみ (それ以外はエラー) ◼ 数字が小さいものから大きいもの へのプルリクエストのみ許容 42/84
• ブランチ命名規則から「マージNG」な伝播をシステムで弾く • ジョブ、プルリクエストhookでルールに沿っているかチェック ブランチ伝播の簡略化・事故防止 -
45/84 リソースをビルドするためのコスト • 日々の更新リソースは各プラットフォームで確認するためのリ ソースビルドが必要。 しかしリソースのビルドには時間がかかる。 1ブランチ当たり1~2時間 × 10ブランチ分 =
最大20時間 • 複数のビルドマシンを用意して並列にビルドさせているが限界は ある。そのため、誰もいない夜間に時間のかかるビルドを動かし、 朝出社した時点で最新の状況を確認できるようにしておきたい。 -
47/84 • 構成を見直し、1つあたりの実行数を可変にするジョブを作成 • パラメータの変更で実行数を変更できるようにする ジョブ構成の見直し Windows iOS Android 3プラットフォーム
ビルド(量産しない) 3プラットフォームビルドジョブ (このジョブが量産されていた) Windows iOS Android ジョブ実行数 可変ジョブ After Before -
48/84 • Jenkinsの各ジョブはJenkinsfileというGroovyスクリプトで詳細 に処理を組み立てることができる • 独自のセパレータ[-- ] (ハイフン二つ)を決めJenkinsfile内の処 理でJenkinsに指定するパラメータを分割 •
分割した各パラメータを下流のジョブに流す Jenkinsfileを用いてパラメータを工夫 -
53/84 • 各開発環境へはブランチ名とデプロイ先のパラメータをJenkins実 行時に指定する。この情報を流用したい。 • デプロイはJenkinsが必須なため情報がジョブ内に集約されている サーバーへのデプロイジョブの情報を利用 2019/09/04 リリース向け対応 開発サーバー
2019/09/06 リリース向け対応 デプロイ パラメータ ・ブランチ名 ・デプロイ先 デプロイ デプロイ -
58/84 3プラットフォーム向けリリースの安定化 • プリコネRはiOS / Android / PC の3プラットフォームで運用され ているが、1カ月で更新するファイル数は合計5000ファイルを超
える。この数になると、正しいファイルかのチェックにも時間が かかり高頻度リリースの妨げになるため効率化を図る必要がある。 • ビルドにかかる時間や不具合特定にかかる時間などは、本来の ゲーム開発にかけられる工数を圧迫し、運用の安定化を妨げる恐 れがあるため時間削減をしたい。 3プラットフォーム リリースを どう安定させるか -
62/84 • 変更が予めわかっていればカテゴリ指定の方がはるかに速いため、 データをカテゴリ分けしてビルドする仕組みを作っていた。 • 運用によりファイルが増え、カテゴリ別でのビルドでさえ時間が かかるようになった。変更がないファイルも毎回ビルドして時間 がかかっていたので変更分だけをビルドしたい。 カテゴリ毎に分割してビルド パラメータデータ
キャラクターデータ パラメーターのみ変更したのであれば パラメータカテゴリのみビルドすればよい -
63/84 • AssetBundleをビルドするとキャッシュ情報として 「.manifest」というファイルも同時に出力される。 • .manifestファイルは毎回消していたので再利用するように – 作成したAssetBundleの出力パスと同パスに「. manifest」ファイルを配置 –
Unityが差分を見てビルドの必要があるかを自動判断して対象ファイルを選別 .manifestキャッシュファイルの再利用 XXXX.unity3d XXXX.unity3d.manifest (このファイルを再利用) ビルドマシンでリソースXXXXをビルド -
64/84 • ビルドマシンに消さずに残したまま次回ビルドに利用 – 前回ビルドの影響を大きく受けビルド時間が安定しない可能性があるので却下 • Gitで管理して再利用 – サイズが大きく社内のGitHubEnterpriseサーバーを圧迫するので却下 .manifestファイルの管理問題
ビルドマシンに残す 前のビルド結果に左右される XX.unity3d XX.unity3d.manifest Gitによる差分管理 GHEサーバーを圧迫 XX.unity3d XX.unity3d.manifest -
65/84 • 各リリース単位でフォルダ分けしてサーバーにアップロード – リソースビルド後、「.unity3d」と一緒に「.unity3d.manifest」もアップロード – 次回ビルド時に両ファイルをrsyncで全てダウンロード • 全ファイル1.3GBのダウンロードにかかる時間は約3分 –
通信帯域によって時間は増減 リソースサーバーへアップロードして管理 2019/09/04 リリース用リソースフォルダ リソースサーバー 2019/09/06 リリース用リソースフォルダ ビルドマシン アップロード ダウンロード -
66/84 • 1時間超のビルドがダウンロード時間を含め30分程度にまで短縮 – 前回のビルド結果からの差分が多いとビルド時間は増加 – 初回ビルドは時間がかかるが既存のリソースをコピーすれば時間は大幅に短縮 – リソースをコピーするだけのジョブも作成 .manifestファイルの管理問題
2019/09/04 リリース用リソースフォルダ リソースサーバー 2019/09/06 不具合修正用リソース (9/6分からコピー) 2019/09/06 リリース用リソースフォルダ ジョブによる リソースフォルダコピー -
69/84 • 基本は各リポジトリに対するGitによるdiffを用いたチェックを行 うが、1ヶ月に8回~10回行われるリリースで更新されるファ イルの合計は3プラットフォームで5000個を超える。 • 月中・月末などのイベント更新は、1回のリリースで1000個以上 のファイルを更新することもある。更新ファイルが非常に多いた め、チェックにかける工数は少しでも削減したい。 •
リソースリポジトリ内の画像ファイルに関しては 画像ファイルのみを抽出してdiffを出し確認するように ファイルのチェック工数問題 -
70/84 • ブランチ同士を比較して差分を出すだけのジョブを作成 • パラメータと画像のみの差分をまとめて出せるように • 毎朝自動でまとめて差分をチェックし、 botで社内SNSに通知 – 毎日どういう差分が出ているか確認
– 自動ビルドのJenkinsfileを応用して1ジョブで全リリースの通知設定が完結 差分確認に集中できるジョブを作成 -
74/84 • ルールは決めているが、どうしてもルールを破ったファイルが コミットされてしまうことがある。 – ファイルエクスプローラー上でコピー&ペーストしただけで、 Unity上でインポートせずにそのままプルリクエストを投げられてしまう – ファイル名にスペースが入ってしまう •
プルリクエストの人力レビューではこれらを検知するのは難しく、 一度プルリクエストを通ってしまうと発見が遅れてしまい、対応 が難しくなってしまうことがある。 不正なmetaデータのコミット -
75/84 • 独自のチェックスクリプトを作成し、プルリクエストにひっかけ てmetaファイルをチェック。 • Unityのアセットファイルは一般的なyml形式ファイルで記述され ているため、yml形式ファイルをロードできるスクリプトを用い れば簡単な解析は可能(プリコネRではpythonを使用) metaファイルに対するバリデーションを強化 データ作成
コミット プルリクエスト マージ ビルド デバッグ 本番 不正なファイルはここで食い止めたい -
76/84 • metaの存在チェック – コミット忘れ、消し忘れがないか • ファイル名チェック – 空白文字の有無 •
metaのguid重複チェック – コピペで作成すると重複する • Materialファイル名とm_Nameプロパティが一致しているか – アセットバンドルのビルド結果が不定になる スクリプトで行っているチェックの詳細