ゲームデプロイの自動化

こんにちは

この前、ハバネロのゲームをデプロイする作業を
自動化するスクリプトを作成しましたので、
その内容をブログに記録しておきます。

  • ハバネロゲームの更新フロー

  • ハバネロのゲームページはこういう構造になっています。
    それで、ゲーム更新は下のプロセスを行います。

  • Unityビルドでゲームファイルを生成(js, html)
  • ビルドしたファイルをS3にアップロード
  • DBにStorage URLを更新


  • この中で、UnityのWebGLビルドは結構時間がかかるので
    デプロイ作業だけで、かなり時間が取られました。

    従って、ゲームのデプロイ作業の一連を順次で行う
    スクリプトを作りました。

  • Unityビルドでゲームファイルを生成
  • Unityはコマンドラインビルドをサポートしています。

    コマンドラインビルドのため、下のような
    static Classを用意します。

    public static class BuildScript
    {
        // 実行する関数(staticで定義)
        static void BuildWeb()
        {
            ...

            string outputPath = Application.dataPath + "/../../" + "output";
            BuildTarget buildTarget = BuildTarget.WebGL;
            BuildOptions buildOptions = BuildOptions.None;

            //ビルド実行
            var result = BuildPipeline.BuildPlayer(EditorBuildSettings.scenes, outputPath, buildTarget, buildOptions);

            ...
        }

        // ビルドが成功すると実行されます。
        [PostProcessBuild(1)]
        public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject)
        {
        ...
        }
    }

    ビルド前後の処理(バージョン設定、デバッグ環境変数の
    無効化など)も、このクラスで対応します。

    static 関数を定義し、コマンドラインで
    関数を呼び出します。

    ${UNITY_PATH} -quit -batchmode -projectPath ${LOCAL_GAME_PATH} -executeMethod BuildScript.BuildWeb -logFile

    ビルドが終わったら、指定したパスにバイナリーが
    生成されます。
    (WebGLの場合、jsファイルとhtmlファイル生成)

  • ビルドファイルをS3にアップロード
  • Google Cloud SDKのgsutil を使って
    Google Storageにアップロードします。

    echo "uploading to S3"
    gsutil cp ./index.html ${STORAGE_PATH}/index.html
    gsutil cp -r ${LOCAL_OUTPUT_PATH}/Build ${STORAGE_PATH}


    GCPコンソールで生成したBucketにゲームファイルを
    アップロードします。

    ストラージ住所:gs://Bucket名
    URL:https://storage.googleapis.com/Bucket名

    上記のコマンドを実行すると、Bucketにファイルが
    アップロードされます。


  • DBにStorage URLを更新
  • ハバネロポータルはWebでゲームを起動させるためのURLを
    Google Firestore DBから読み込みします。

    先ほどアップロードしたゲームファイルのURLを
    DBに更新します。

    ここは簡単なPythonスクリプトを使います。

    まずPython用Google Cloud SDKを設置します。

    > pip install --upgrade google-cloud-firestore

    Google SDKが使えるようになったら
    以下のスクリプトでDBを更新します。

    import sys
    from google.cloud import firestore

    ...

    db = firestore.Client()
    doc_ref = db.collection(u'games').document(sys.argv[1])
    doc_ref.update({u'client_url': url})


    スクリプトを実行すると、games DBの client_url が
    更新された事をGCPコンソールで確認できます。

    client_urlフィールドが更新されました。



    一連の作業が終わってハバネロに接続すると
    更新されたゲームが起動されます。

    ゲームが最新バージョンに変わりました。


    これで、コマンド実行で簡単にゲームデプロイが
    できるようになりました!


  • 問題点と課題
  • Unityコマンドビルドの問題は
    Unity起動中にコマンドビルドができない事です。

    つまり、デプロイ作業が行う時は必ず
    作業中のUnityを終了しないといけないです。

    (いつかUnityプランをアップグレードしたら
    Unity Cloud Buildを利用してみたいです。)

    他には、別途のビルドマシンを用意する方法もあります。

    コメント