概要
Dev/Stg/Prod で実行環境を分けている Unity プロジェクトで、git ブランチごとに実行環境を切り替えてクラウドビルドしたかったが、参考になりそうな記事が見つからなかったのでメモしておく。
Services - Cloud Build - Unity
環境
- Unity 2018.4.22f1
環境を分ける意味
Unity プロジェクトが外部サーバーと通信する際に、開発/検証/本番で API サーバ等のエンドポイントを切り替えることで開発を安全かつ迅速に行うことが出来るようになる。詳細はすでに多くの記事で解説されているので下記の記事等を参照。
ステージング環境とは?開発環境、検証環境との違いと役割 | WWWクリエイターズ
弊社では API サーバと Firebase のエンドポイント切替が対象で、下記のように手動で環境を切り替えていた。
// 実行環境の列挙
public enum EnvironmentType
{
Dev, // 開発環境
Stg, // 検証環境
Prod // 本番環境
}
// 実行環境の定義
public static class Environment
{
// TODO: これをビルドのたびに手動で切り替える
public static readonly EnvironmentType Type = EnvironmentType.Dev;
}
// APIのエンドポイント取得箇所(別クラス)
public static string Url()
{
switch (Enviroment.Type)
{
case EnviromentType.Dev:
return DevUrl;
case EnviromentType.Stg:
return StgUrl;
case EnviromentType.Prod:
return ProdUrl;
default:
Debug.Log("実行環境が未設定です");
return "";
}
}
この場合、ローカルで各種環境をビルドする際は問題にならないが、Unity CloudBuild を利用した場合は少し面倒になる。CloudBuild 用のブランチで毎回実行環境を変更してコミットしなければならないからだ。
可能であれば CloudBuild の設定から自動で切り替えが出来ればと思って調べていたが、有用な記事に出会えなかった。(CloudBuild の環境変数はビルド時にしか参照出来ないので、実行時に環境を切り替えるのには向かなかった)
しかし、Unity のドキュメントを見ていると下記の記事を見つけた。
カスタムスクリプト #define ディレクティブ - Unity マニュアル
環境ごとの #define
を予め CloudBuild のコンフィグに設定しておけば環境ごとの切り替えが出来そう?と思って最小プロジェクトで検証したところ無事に成功したので、この方針で実行環境切り替えを行うことにした。
CloudBuildで環境切り替え
Dev のビルドはローカルで行うので、今回は Stg と Prod 環境のみ作成。
下記のカスタム定義を CloudBuild -> Config -> Advanced Options からそれぞれ設定した。
#define ENV_STG
#define ENV_PROD
実際に作成した TARGET は下記の通り。PROD は production ブランチを参照し、STG は staging ブランチを参照している。(左が PROD, 右が STG)
環境自動切り替え用のコードは下記の通り。
public enum EnvironmentType
{
Dev, // 開発環境
Stg, // 検証環境
Prod // 本番環境
}
public static class Environment
{
#if ENV_STG
public static readonly EnvironmentType Type = EnvironmentType.Stg;
#elif ENV_PROD
public static readonly EnvironmentType Type = EnvironmentType.Prod;
#else
public static readonly EnvironmentType Type = EnvironmentType.Dev;
#endif
}
あとは STG と PROD でそれぞれ CloudBuild を走らせるだけ。
CloudBuild はローカルビルドより時間が掛かるので、Slack に通知を飛ばすと便利。
Unity Cloud Buildのビルド結果をSlackに通知するには - Qiita
ちなみに CloudBuild は Addressables にも対応しているのでとても良い。
Addressables1.8.3のアセットをUnityCloudBuildでビルドする - Qiita
まとめ
リリースのたびに毎回手元で全環境ビルドしていたのでリリースコストがかなり高く検証にも物凄く手間が掛かっていたが、本記事の対応でサポートしている全てのプラットフォームのSTG/PRODビルドがまとめて行えるようになったので、リリースのサイクルは大幅に改善出来るのではないかと思う。
同じように、API サーバ等の外部サービスを環境ごとに切り替える Unity プロジェクトを開発している人の力になれればと思う。(特に Unity CloudBuild の記事はあまり数が多くないので)