Google Cloud Buildを利用してUnity ML-AgentsのDockerイメージを作成する(v0.5.0対応)

## 追記

v0.9.1で動作させる方法をまとめました。

Google Cloud Buildを利用してUnity ML-AgentsのDockerイメージを作成する(v0.9.1対応) - Qiita
https://qiita.com/kai_kou/items/5eabbaa2b564527e0b4e


## 概要

Unity ML-AgentsをDockerで実行するのにイメージをBuildする必要がありますが、Google Cloud Buildを利用するようにしてみました。

今回は、トリガーを利用せず、ローカルでコマンドを実行してビルドしてみました。

Google Cloud Buildについては以下をご参考ください。

Google Cloud Build
https://cloud.google.com/cloud-build/?hl=ja

Google Cloud Buildとは一体何者なのか
https://swet.dena.com/entry/2018/08/20/170836


## 手順

GCPのプロジェクトと```gcloud``` コマンドが利用できる前提となります。

### cloudbuild.yamlの用意

Google Cloud BuildでDockerイメージが作成できるように`cloudbuild.yaml` ファイルを用意します。

```sh
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> touch cloudbuild.yaml
```

```yaml:cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/unity_ml_agents:0.5.0a', './ml-agents']
images: ['gcr.io/$PROJECT_ID/unity_ml_agents:0.5.0a']
```


Dockerイメージのタグ名を直接記述していますが、トリガー起動する場合には```$TAG_NAME``` を利用することもできるようです。

利用できる変数については下記をご参考ください。

Cloud Build 変数値の置換
https://cloud.google.com/cloud-build/docs/configuring-builds/substitute-variable-values

ビルドする際に、パスを```./ml-agents``` として、ML-Agentsのソースのみが含まれるようにしています。

```unity_ml_agents``` は任意の名称でOKです。


### Unity ML-Agentsの取得

サブモジュールとして取得します。
※ Google Cloud Buildのトリガーでビルドする場合、サブモジュールも取得してくれるのか未検証なので、トリガー機動する場合には```git clone``` で取得したほうが良いかもしれません。

```sh
> git submodule add https://github.com/Unity-Technologies/ml-agents.git
```

Unity ML-Agentsのバージョンを変更してビルドする場合は、以下のようにします。

```sh
> cd ml-agents
> git tag
(略)
0.3.1b
0.4.0
0.4.0a
0.4.0b
0.5.0
0.5.0a
v0.1
> git checkout 0.5.0
```

### ビルド実行

準備ができたので、Google Cloud Buildにジョブ開始のコマンドを実行します。

```sh
> cd 任意のディレクトリ
> gcloud builds submit --config=cloudbuild.yaml .
(略)
DONE
-------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                      IMAGES                                                    STATUS
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  2018-10-02T05:15:41+00:00  6M38S     gs://GCPのプロジェクトID_cloudbuild/source/1538457217.11-48d929e28e27491aa8a3fa4fde554756.tgz  gcr.io/GCPのプロジェクトID/unity_ml_agents:0.5.0a  SUCCESS
```

GCP管理コンソールでもジョブの実行が確認できます。

<img width="1264" alt="スクリーンショット_2018-10-02_14_29_07-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/ad0308d1-b5a6-0ad3-187f-0408beb6ca5f.png">


Google Container RegistryにもイメージがPushされていることも確認できます。

<img width="653" alt="スクリーンショット_2018-10-02_14_34_00-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/415778d1-7d4f-e4d2-4f4f-78f3bdd68f2c.png">


これでローカルにDockerがインストールされていなくても、イメージ作成ができるようになりました。

作成したイメージの利用については下記をご参考ください。


DockerでUnity ML-Agentsを動作させる(v0.5.0対応)
https://qiita.com/kai_kou/items/df3f3518a5a27b66f617

Google Kubernetes EngineでUnity ML-Agentsを動かしてみる(V0.5.0対応)
https://qiita.com/kai_kou/items/3a4d860f8353ff1b3110



## 参考

Google Cloud Build
https://cloud.google.com/cloud-build/?hl=ja

Google Cloud Buildとは一体何者なのか
https://swet.dena.com/entry/2018/08/20/170836

Cloud Build 変数値の置換
https://cloud.google.com/cloud-build/docs/configuring-builds/substitute-variable-values

DockerでUnity ML-Agentsを動作させる(v0.5.0対応)
https://qiita.com/kai_kou/items/df3f3518a5a27b66f617

Google Kubernetes EngineでUnity ML-Agentsを動かしてみる(V0.5.0対応)
https://qiita.com/kai_kou/items/3a4d860f8353ff1b3110