クラウド分散ビルド

#はじめに

コンシューマー系の開発を行う上で、気を使う一つとしてビルド時間があります。

異様に長いビルド…。
異様に長いパッケージング…。

これ結構ストレスですよね。

とは言え、最近はビルドをするにも分散ビルドが主流ですので、どこの会社も [SN-DBS](https://www.snsystems.com/ja/tech-blog/2014/02/27/building-with-the-network/) や [IncrediBuild](https://www.incredibuild.co.jp/) などを使うことが多いと思います。

ただ、分散するにしても、ローカルに分散するようの端末を用意しないといけませんが、ほとんどの会社では開発端末を分散先の Agent として利用していると思います。
別にこれが悪いわけではないのですが、開発チームのみんながビルドし始めると、台数が足りず上手く分散出来なことがあります。

台数不足を解消するにはそれだけ端末を用意すればいいだけの話ですが、分散のためだけに端末を購入するのも馬鹿らしいので、ビルドの時のみ必要な環境があればいいので、そうなるとクラウドの出番というわけです。

今回はその中でも [IncrediBuild](https://www.incredibuild.co.jp/) を使って Azure 上で分散ビルドを行う方法を解説したいと思います。


#ゴール

今回のゴールは以下のような感じです。

- Coordinator はローカル環境に設置
- Agent はローカル環境とクラウド環境のハイブリッド


#環境

IncrediBuild：ver.9.4.5

**※注意が必要なのはクラウドビルドを行う場合でもビルドをする側分のライセンスは必要になりますので、ローカル環境用のライセンスは事前に準備しておく必要があります。**

例）10人のスタッフがビルドを行う場合
ローカル環境ライセンス：10個
クラウド環境ライセンス：後で追加などの変更可能（費用は別途かかります）


##アクティベート

アクティベートとはクラウド上の Agent を利用可能な状態にすることです。

今回は Coordinator はローカル環境に配置しますので、IncrediBuild Coordinator 上から全て行うことが可能です。

まず、IncrediBuild Coordinator を起動して右上にある『Add Cloud Cores』を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/69358ba5-1012-659d-463f-6bf160cc4f66.png)

ブラウザが立ち上がり以下の画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/4a627bed-8336-2b68-b38c-14ae5c195e16.png)

『SCALE TO CLOUD NOW』を選択すると AWS か Azure かの選択画面になりますので、Azure を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/47657da5-77e9-2cec-1e41-399ef9aa0c15.png)

そのまま『Yes, I Do.』を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/e72e35b4-2880-aa1d-9871-d97e1b1507fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/55388ad8-eb96-6aa1-05d9-d1382153880e.png)

そうすると IncrediBuild Cloud Settings の画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/3d43aa47-521b-1271-af25-6ef6a2d70b58.png)


##IncreadiBuild Cloud Settings

IncrediBuild のクラウド側の設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/0fa604b5-3fe2-05e8-c090-3c400e5d35d0.png)

###①General

ここ設定では管理者設定を行います。

|設定項目|説明|
|:--|:--|
|First Name/Last Name|管理者名|
|Email|管理者のメールアドレス|
|Company Nama|会社名|

管理者名と会社名は何に利用するのか分かりませんが、メールアドレスはクラウド上の Agent のアクティベート、ディアクティベートのタイミングでメール通知されます。

###②Resource Management

Azure 側のリソース管理の設定を行います。

|設定項目|説明|
|:--|:--|
|Tenant ID|テナント ID|
|Subscription|サブスクリプション ID|
|Cloud Region|クラウドの配置地域|
|Resource Group Name|作成するリソースグループ名|
|Tags|検索用タグ|

リソースグループ名で指定されたリソースグループに IncrediBuild に必要なリソースがすべて配置されます。
今回は『IncrediBuild』と設定しました。


###③VMs

Azure 側の VM の設定を行います。

|設定項目|説明|
|:--|:--|
|VM Type|使用する VM のスペック|
|VM Idle Timeout (seconds)|VM がビルドタスクを実行完了した後、自動的に非アクティブ化されるまでの秒数|
|Total Cores Limit|ビルドタスクの実行に割り当てるクラウド上のコア数の最大値|
|No. of VMs in Pool|Agent として作成する VM の台数|

VM Type はデフォルトで十分だと思いますが、より早く、メモリが多いスペックも選択可能です。

VM Idle Timeout で設定した秒数経過しても Agent が利用されない場合は自動的に VM も削除されますのですごく経済的だと思います。

Total Cores Limit は VM Type で指定した『VM のコア数 × No. of VMs in Pool の台数』から算出されるコア数の合計のうち、どれだけビルドタスクに使用するのかを指定します。

**※ IncrediBuild はローカル環境の Agent を優先的に利用して、残りの足りない部分をクラウド側で利用するように最適化されています。**

上記の設定が完了すれば右下にある『Save』を行うことでアクティベーション画面が表示されますので承認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/d38d3088-5510-a3a9-7490-449235048380.png)

しばらく待機。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/46e4c3a5-ed0a-8d56-94e4-4405e20f8a14.png)

アクティベーションが完了すると以下の画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/95c62caa-3d12-b973-b856-c07ab166267c.png)

これでクラウド側の設定は完了です。

上記までの設定を完了すると IncrediBuild Coordinator の『Add Cloud Cores』が『Creating Pool』に変わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/94a25074-198e-8754-30ad-a17a03005256.png)

まだこの段階ではクラウド上の Agent は起動途中です。
起動が完了すると『Creating Pool』から『Cloud Enabled』に変わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/120c7ddd-12f7-a48d-bbec-fb62c3934cda.png)

しばらくすると徐々に Agent が立ち上げってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/1f1167c9-4b97-0e62-3491-6e8bdfd30253.png)

クラウド側で設定した VM の台数分、起動していることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/3a689530-93db-8dd6-a08a-64270acfb836.png)

すべて起動するまで5～10分程度です。

**※ここで注意しないといけないのは VM は一度は起動するのですが、IncrediBuild のバージョンが互換性のないバージョンで起動しますので、すぐにアップデートが走ります。この時点ではまだ Agent は利用できません。意外とこのアップデートが長いです。**

アップデート中は『Downloading version update file』『Installing version update』『Offline, Unsubscribed』と遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/9c33544b-e850-bdd9-aa53-e3a5da341b2e.png)

アップデートが完了すると一度オフラインになり、そこから再起動します。
このタイミングで設定したメールアドレス宛に利用可能な状態になったことが通知されます。

これでセットアップは完了でローカル環境の Agent と同じようにビルドが分散されるようになります。

##非アクティベート

アクティベートが完了した後は VM が起動したままですので不要になった場合には非アクティベートすることでクラウドリソースを削除することが可能です。

**※クラウドで設定したアイドル時間が経過することで自動的に VM は落ちますが、あくまで VM だけでリソースは明示的に非アクティベートする必要があります。**

手動で非アクティベートするには IncrediBuild Coordinator の『Cloud Enabled』から可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/39513da9-d6db-0a69-6c27-a74be2e62a0c.png)

上記の Deactivate Cloud を選択すると、起動した VM の削除、リソースグループの削除が行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/0fdc7149-5a4f-a339-4cd3-5435eb71be78.png)

非アクティベート中は『Deactivating』となり、クラウド上のリソースが順次削除されます。
非アクティベートが完了するとクラウドのリソースグループも削除されます。

#おわりに

個人的には Coordinator はローカル環境ではなくクラウド上に配置するほうが良いんじゃないかと思っていますが、設定が上手くできず今回はローカルに配置したもので紹介していますが、今後、それができれば紹介したいと思います。