Unity Build Server でライセンスを共有する

#Unity Build Server とは？

いつもいつの間にか新しいサービスがリリースされている Unity さん。
今回は [Unity Build Server](https://unity.com/ja/products/unity-build-server) なるものがリリースされていました。

名前から推測するに Unity プロジェクトのビルドのみを行うサーバーと思いきや『**ライセンスサーバーとして機能させるもの**』でした。

あまり頻繁にビルドしない端末にライセンスを割り当てるのはライセンス数が非常に勿体ないので、必要な時だけにライセンスを使えるフローティングライセンスは非常にありがたいです。更にいうと通常のライセンスよりも安く利用できるのでかなりお得です。

**※ただし、このライセンスは Pro または Enterprise のライセンスを事前に契約しておく必要があります。あくまでビルド端末用のライセンスとしてお考えください。**

Unity Build Server のメリット：

- **フローティングライセンスとして利用可能**
- **通常ライセンスよりも安い**

ということで、いつもの如く Azure でライセンスサーバーをホストしてみようかと思います。

##作業内容

1. ライセンスサーバーのセットアップ
1. ライセンスサーバーの登録
1. ライセンスのインポート
2. ライセンスサーバー起動
1. クライアントの接続

サーバーのセットアップは全て Aure VM 上で行っていますので以降のサーバー側のセットアップはリモートデスクトップ接続 (RDP) で行っています。

#ライセンスサーバーのセットアップ

##VM の起動

まずは Unity Build Server（以下ライセンスサーバー）として利用する VM を起動します。

VM の設定は以下のようにしました。

- リソースグループ：Unity_Build_Server
- イメージ：Windows Server 2016 Datacenter
- 仮想マシン名：UnityBuildServer
- サイズ：Standard_B2ms

ちなみに上記の VM 設定で年間契約で月間5千円ぐらいです。
VM のサイズは Standard_B1ms でもいけそうでその場合月間2千円ぐらいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/17ff93fd-99de-bd39-6d4b-8d7ea93189e4.png)

今回はリモートデスクトップで接続してライセンスサーバーをインストールする必要があるので HTTP (80) と RDP (3389) の受信ポートを開いておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/dbf269b4-e000-f71a-0c74-9a3b38e8a97f.png)

##ライセンスサーバー用のライセンスの準備

ライセンスサーバーのライセンスは [Unity の管理ページ](https://id.unity.com/) のサイドバーにある『License servers』から確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/475d9cf1-18e4-ba99-460f-f6f62ec4c247.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/c6bd7136-b43c-82ba-d749-c891bf75014c.png)

ライセンスサーバーのライセンスがある場合は上記の画像のような状態になっていると思います。
今回は Azure には Windows Server の VM を立ち上げますので『Unity License Server Windows v1.8.0』を選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/85f6ade5-f457-e977-0c40-ccb53bc9ac28.png)

ダウンロードした zip ファイルのフォルダ名を`UnityLicensingServer`とリネームし、C ドライブ直下に配置します。

```
C:\UnityLicensingServer
```

次はコマンドプロンプトで上記のフォルダに移動してサーバーのセットアップを行います。

```
.\Unity.Licensing.Server.exe setup
```

構成に必要な項目は以下の通り

- サーバー名
- HTTPS の利用有無
- 使用する NIC とポートの設定
- 管理者の IP アドレス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/84b8f807-ad4c-c258-bc5b-5e64a1f3372e.png)

上記の設定後にセットアップが完了すると、先程のフォルダ直下に`server-registration-request.xml`というファイルが出力されます。これは後ほどのサーバー登録必要なファイルです。

今回は以下のような設定にしました。

- サーバー名：UnityBuildServer
- HTTPS の利用の有無：利用しない
- 使用する NIC とポートの設定：NIC はデフォルト、ポートもデフォルトの 80
- 管理者の IP アドレス：設定なし

#ライセンスサーバーの登録

ライセンスサーバーのセットアップが完了したら次は Unity 側にサーバーの登録を行います。
『License servers > Upload license server registration』で先程の登録用のファイル`server-registration-request.xml`をアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/27d2321c-6810-e1ab-992e-e52fb876d259.png)
アップロードが完了すると『License servers』の画面が上記のように変化します。

これでライセンスサーバーとして登録されています。

#ライセンスのインポート

次にライセンスサーバーに利用可能なライセンスを割り当てる必要があります。
先程の画面にあった『Manage seats』でこのライセンスサーバーに割り当てるライセンスを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/94e78854-c0e4-19a0-4a30-585d8a76c3cc.png)
**※注意：一度ライセンスサーバーにライセンスを割り当てるとシートを減らす事や再割り当てができなくなるらしいです。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/e874dde9-7a1d-cc0a-8a1b-96136843ad5b.png)
割り当てが完了すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/59a280aa-7f9c-ee51-648f-2ab6b0cbf9a4.png)
この時点でライセンスサーバーが利用可能な状態になりますが、実際に利用可能なライセンスはライセンスサーバーに対してインポートをする必要があります。

```
.\Unity.Licensing.Server.exe import [license archive path]
```

インポートするライセンスは管理ページの『Download licenses』を行うことで、ライセンスを含んだファイルがダウンロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/9d721935-7bf3-a647-189b-75f888c5a249.png)

#ライセンスサーバーの起動

##ライセンスサーバーのテスト

```
.\Unity.Licensing.Server.exe
```

実際にはサービスとして実行しますので、今回はライセンスサーバーが正常に動作するのかテストで起動します。
起動に成功すれば以下のようなオールグリーン状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/4dcb9d77-7d74-4d60-284a-f8b41e4a8403.png)
この状態でライセンスサーバーに対して

```
http://<Server IP>/v1/status
```

を実行することで json ファイルが取得できれば正常にライセンスサーバーが起動しています。
このあとはサービスとして登録しますので、サーバーは終了しておいて問題ありません。

##ライセンスサーバーのサービス起動

ライセンスサーバーのサービス起動は以下のコマンドです。

```
.\Unity.Licensing.Server.exe create-service
```

一度、これを実行しておけば次回からはサーバー再起動時にも自動的にライセンスサーバーが起動します。
正常にサービスが起動すれば以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/c8a10f99-a164-d9bb-3487-cac789c75519.png)

ちなみにサービスの停止・削除は以下のコマンドでいけます。

```
sc stop Unity.Licensing.Server
sc delete Unity.Licensing.Server
```

##VM の Windows Firewall の設定

これまではライセンスサーバー側の設定でしたが、Azure VM 側の設定も必要になります。
IIS 等の場合、自動的に Windows Firewall の設定を行ってくれますが、今回は自前で設定する必要があります。
具体的にはライセンスサーバーが使用する 80 ポートを開けます。

受信ルール (Inbound Rules) を追加します。新しいルールで選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/79a84c52-b908-e1c6-f48e-af2059457637.png)

ルールのタイプは『ポート』を選択します。
デフォルトでは『プログラム』になっているので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/09487fd9-e0bb-461c-c55f-57beab6d50f3.png)

次にプロトコルとポートは『TCP』と『80』を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/2beca8d4-5934-4ee1-9bb0-76e8cfe2ee33.png)

このポートに対するアクセス権は『Allow the connection（接続許可）』を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/da5b856b-da70-18ec-4946-31858e8f3068.png)

このルールを適用するタイミングには全てチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/ebcaa786-1704-16d1-8517-387ec056eb87.png)

最後にこのルールの名前は『HTTP』としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/c84d6733-f5ed-3b35-6630-da48f767c25d.png)

#クライアントの接続

次はクライアント側の設定ですが先程のライセンスサーバーを配置したフォルダにある`services-config.json`がライセンスサーバーに接続するために設定ファイルとなっており、サーバーセットアップ時に自動生成され、内容は以下のように事前に設定されています。

```json
{
  "licensingServiceBaseUrl": "http://10.0.0.4:80",
  "enableEntitlementLicensing": true,
  "enableFloatingApi": true,
  "clientConnectTimeoutSec": 5,
  "clientHandshakeTimeoutSec": 10
}
```
`licensingServiceBaseUrl` がライセンスサーバーの URL となりますが、今回は Azure 上に配置しますので VM のプライベート IP が指定されていますのでパブリック IP に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/fb2c82d4-cffd-2ac2-eeff-8c43c10260a7.png)

このファイルを macOS であれば`/Library/Application Support/Unity/config`に配置します。
デフォルトでは`config`がありませんので新しくディレクトリを作成します。

**※ただし、この時に注意しておかないといけないのが Unity 側で Personal ライセンスでいいのでライセンスを認識させておく必要があります。ライセンスがない状態で上記の設定を行うと Unity が起動しませんでした。**

`services-config.json`が正常に認識されるとサイドバーにある『ライセンス管理』の項目がなくなります。

認識前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/f8410686-c85a-4048-e97b-25b2f82843ee.png)
認識後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/b02444f7-cf45-63d7-857c-4e141899ddb8.png)

上記の状態で Unity プロジェクトを開くとフローティングライセンスを利用した状態になり Unity Build Server の設置が完了となります。

最後にはじめに Azure 側に設定した RDP は不要になりますので、設定で RDP は外しておきましょう。