見出し画像

Unityビルド環境をクラウド上に構築した際の記録を公開します。

こんにちは、ポケラボです。
ポケラボでは、定期的にポケロボMeetupというゲーム業界で働く方向けのイベントを様々なテーマで開催しています。

ポケロボMeetUp


去る10月23日のポケロボMeeup#9は、「\Unityビルド環境に関わる方必見/クラウドCI導入による業務改善メソッド大公開!」というテーマで開催。

本講演ではUnityのビルド環境を刷新してCIの導入と仕組みを構築し、ビルド環境に関わる工数/費用削減、リスクを排除させた事例をご紹介しました。

Unityをビルドするためにビルド環境の維持/管理にはエンジニアの大変な手数が必要となり、ビルドマシンのOS UP、セキュリティーバージョンUPに関わる影響対応、ビルドマシンの構築や特殊対応で属人化されてしまいます。
まして、ビルドマシンが壊れた際に業務が止まったり、審査が出せないといったリスクを含んでいます。

全てのプロジェクトでこれをすれば良いということではないと思いますが、ポケラボでは他社と共同で開発を進めた某プロジェクトでビルドマシンをクラウド化することにより、拡張性・保守性・安全性の3つの観点で良い効果を得ることが出来ました。

今回は、参加者アンケートでもご要望いただきまして、Unityのビルド環境をクラウド上に構築した際の記録を、登壇したエンジニアの鈴木がまとめた内容を公開いたします。

画像2

鈴木 隼人:2013年4月ポケラボ入社。エンジニアとして運用中プロダクトを担当。

はじめに

Unityのビルド環境をクラウド上に構築したときの記録です。
構築にあたって、AWSのEC2上にJenkinsを置きUnity Cloud Buildを利用します。

前提条件
AWSを利用
 Amazon EC2
  OS :Amazon Linux 2

===

環境作成-EC2作成-


インスタンス作成を押下します。

画像3

Amazon Linux 2 64ビット (x86)を選択します。

画像4

最初の構築時は、t2.microにしておきます。運用してスペック不足であればあげておきます。

画像5

企業によって違うので、必要に応じて設定変更しておきます。

画像6

ストレージは最初デフォルトの8Gにしています。Jenkinsインストールまでは全容量2G程度です。運用の状況に応じてEBSの拡張します。

画像7

企業によって違うので、適切なセキュリティグループを設定します。

画像8

設定情報確認してOKなら次へ押します。

画像9

インスタンスが作成されます。

画像10

インスタンス作成完了するまで数分程度待ちます。

画像11

EC2インスタンス作成時に割り当てたキーペアファイル(ここではxxx.pemとする)を使って、ユーザ名「ec2-user」でインスタンスにsshでログインします。

画像12

環境作成-Javaインストール-

yumを更新します。


$ sudo yum update -y

次に、インストール可能なjavaを検索します。

$ sudo yum search java
..省略..
java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.7.0-openjdk-accessibility.x86_64 : OpenJDK accessibility connector
java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.7.0-openjdk-headless.x86_64 : The OpenJDK runtime environment without audio and video support
java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment 8
java-1.8.0-openjdk-accessibility.x86_64 : OpenJDK accessibility connector
java-1.8.0-openjdk-accessibility-debug.x86_64 : OpenJDK 8 accessibility connector for packages with debug on
java-1.8.0-openjdk-debug.x86_64 : OpenJDK Runtime Environment 8 with full debug on
java-1.8.0-openjdk-demo.x86_64 : OpenJDK Demos 8
java-1.8.0-openjdk-demo-debug.x86_64 : OpenJDK Demos 8 with full debug on
java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel-debug.x86_64 : OpenJDK Development Environment 8 with full debug on
java-1.8.0-openjdk-headless.x86_64 : OpenJDK Headless Runtime Environment 8
java-1.8.0-openjdk-headless-debug.x86_64 : OpenJDK Runtime Environment with full debug on
java-1.8.0-openjdk-javadoc.noarch : OpenJDK 8 API documentation
java-1.8.0-openjdk-javadoc-debug.noarch : OpenJDK 8 API documentation for packages with debug on
java-1.8.0-openjdk-javadoc-zip.noarch : OpenJDK 8 API documentation compressed in a single archive
java-1.8.0-openjdk-javadoc-zip-debug.noarch : OpenJDK 8 API documentation compressed in a single archive for packages with debug on
java-1.8.0-openjdk-src.x86_64 : OpenJDK Source Bundle 8
..省略..

インストール可能なjava-1.8.0が最新のため、Java8のJDKをインストールします。

java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment 8

javaをインストールします。

$ sudo yum install -y java-1.8.0-openjdk-devel.x86_64
..省略..
インストール:
 java-1.8.0-openjdk-devel.x86_64 1:1.8.0.222.b10-0.amzn2.0.1

依存性関連をインストールしました:
..省略..
完了しました!

javaの使用設定 alternativesでJava 1.8にセットします。

$ sudo alternatives --config java

1 プログラムがあり 'java' を提供します。

選択   コマンド
-----------------------------------------------
*+ 1   java-1.8.0-openjdk.x86_64 
(/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-0.amzn2.0.1.x86_64/jre/bin/java)

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:
------------------------------------------------
Javaのバージョンを確認します。

$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)


環境作成-Jenkinsをインストール-

Jenkinsをローカルにダウンロードします。

$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo

パッケージ署名チェック用のキーをインポートします

$ sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key

Jenkinsをインストールします

$ sudo yum -y install jenkins

Jenkinsを起動します

$ sudo service jenkins start
Starting jenkins (via systemctl):                             [  OK  ]

ウェブブラウザでJenkinsにアクセスします。
「http://(IP address):8080」のURLにアクセスします。
接続できない場合、8080番ポートをオープンしておく必要があります。
セキュリティーグループに解放対象のポートになっているか確認します。
接続できたら、Jenkins のホームディレクトリに初期パスワードファイルが書き込まれているので、そのパスワードを入力します。

画像13

Jenkins-Pluginのインストールです。「Select plugins to install」でデフォルトお勧め設定なっているので、ご自身の環境に合わせて必要なものをインストールします。

画像14

インストールされます。

画像15

管理ユーザーを作成します。

画像16

URLの設定を行います。デフォルトで入っているので問題なければ完了を押します。

画像17

Jenkinsの利用準備ができます。

画像18

最初のJenkins画面に出ます。

画像19


chkconfig コマンドを使用して、システムがブートするたびに Jenkinsが起動するように設定します。

$ sudo chkconfig jenkins on
jenkins   0:off   1:off   2:on   3:on   4:on   5:on   6:off

EC2インスタンスを再起動して、Jenkinsにアクセスできることを確認しておきます。

環境作成-jqインストール-

JSONから簡単に値を抜き出したり、集計したり、整形して表示したりできるJSON用のgrepとかawkみたいなコマンドです。

$ sudo yum install jq


Jenkins JOB作成

Jenkins Jobを作成し、各種設定を行います。

「古いビルド破棄」にチェックを行い、各種設定します。

画像20

「ビルドパラメータ化」を各種設定します。

画像21

「SCMをポーリング」にチェック入れて、対象ブランチに対して定期的に監視するかを時間設定します。

画像22

ビルドには「シェル実行」を加えます。

画像23

以下、Shellの内容です。

# Unity Cloud Build
# API Reference Link : 
# https://build-api.cloud.unity3d.com/docs/1.0.0/index.html
apikey="xxxxxxxxxxxxxxxxxxxxxxxxxxxx" →Unity Cloud Buildのアカウント作成時のAPI Key 
orgid="xxxxxxxxxxxxxxxxxxx" →Unity Cloud Buildのアカウント作成時の組織名 or ID
projectid="xxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"  →Unity Cloud BuildでProject作成したPID
buildtargetid="xxxxxxxx"  →Unity Cloud BuildでJobを作成した際の名前(※注意:JOB名が大文字でも指定は小文字にする)
number=-1
PATH=${PATH}:/usr/local/bin

# Cancel all builds
curl -s\
  -X DELETE\
  -H "Content-Type: application/json"\
  -H "Authorization: Basic ${apikey}"\
  https://build-api.cloud.unity3d.com/api/v1/orgs/${orgid}/projects/${projectid}/buildtargets/${buildtargetid}/builds
# Create new build
number=$(curl -s\
 -X POST\
 -d '{"clean": false, "delay": 30}'\
 -H "Content-Type: application/json"\
 -H "Authorization: Basic ${apikey}"\
 https://build-api.cloud.unity3d.com/api/v1/orgs/${orgid}/projects/${projectid}/buildtargets/${buildtargetid}/builds\
| jq '.[0].build')
sleepTime=60s
while :
do
# Build status 60秒一回でビルドステータスを確認 
# ビルドがSuccessになったら結果ファイルをダウンロードする
buildStatus=$(curl -s\
 -X GET\
 -H "Content-Type: application/json"\
 -H "Authorization: Basic ${apikey}"\
 https://build-api.cloud.unity3d.com/api/v1/orgs/${orgid}/projects/${projectid}/buildtargets/${buildtargetid}/builds/${number} \
 | jq '.buildStatus' | tr -d '"')
 # Return if success
 if [ $buildStatus = "success" ]; then
   break
 fi
 # Exit with error if fail
 if [ $buildStatus = "failure" ] || [ $buildStatus = "canceled" ] || [ $buildStatus = "unknown" ]; then
   exit 1
 fi
 # Wait 60 seconds
 sleep ${sleepTime}
done
# Create a new link to share a project
shareid=$(curl -s\
 -X POST\
 -H "Content-Type: application/json"\
 -H "Content-Length: 0"\
 -H "Authorization: Basic ${apikey}"\
 https://build-api.cloud.unity3d.com/api/v1/\
orgs/${orgid}/projects/${projectid}/buildtargets/${buildtargetid}/builds/${number}/share\
| jq '.shareid' | tr -d '"')

# Get details on shared build including download link
curl -s\
 -X GET\
 -H "Content-Type: application/json"\
 -H "Authorization: Basic ${apikey}"\
 https://build-api.cloud.unity3d.com/api/v1/shares/${shareid}  > download.json
apk_download_url=$(cat download.json | jq '.links.download_primary.href' | tr -d '"')
# download application binary
APP_BINARY="xxxxxxxxxxx.apk"
wget $apk_download_url --output-document=${APP_BINARY}
# deployGate転送
MESSAGE="upload by jenkins: ${BUILD_TAG}"
curl https://deploygate.com/api/users/Pokelabo-Admin/apps \
-F file="@${APP_BINARY}" \
-F token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
-F message="$MESSAGE" \
-F distribution_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Unity Cloud Build設定

- プロジェクト作成
Unity Dashboardの「Develop」タブで新規プロジェクトを作成します。
https://developer.cloud.unity3d.com/projects/

画像24

- 基本設定
プロジェクト作成後、プロジェクト内の「Cloud Build」 -> 「Config」メニューから、Basic Info、Source Control Settingsを設定します。

画像25

- Job作成
「SETUP NEW TARGET」ボタンを押して、BuildしたいPlatformを選択します。

画像26

各種設定を入れます。(git branch, サブフォルダ名, Unityバージョン, push後自動ビルド)

画像27

次にBundle ID、Xcodeバージョン(iOSの場合)、provisioningの選択(新規登録)を行います。

画像28

設定完了するとJOBが作られます。

画像29


■Shell内のID等の記載について

Project IDを使ってShell内に記載します。

画像30

APIキーを使ってShell内に記載します。

画像31

===

以上で完了となります。
移行自体は簡単にできると思います。ビルド環境において何かしら課題をお持ちの方、ご活用いただける場面がありましたら、是非本記録をご参考いただけますと幸いです。

===

最後までお読みいただきましてありがとうございます。
宜しければ、記事へスキをいただけますと大変励みになります。

ポケラボでは一緒に働く仲間を募集しています!
ご興味をお持ちいただけた方は、ご応募お待ちしております。

また、ポケラボに関する情報は、弊社のマスコットキャラクターポケロボくんがTwitterで随時展開中!是非フォローしてあげてください。


みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!