こんにちは、ポケラボです。
ポケラボでは、定期的にポケロボMeetupというゲーム業界で働く方向けのイベントを様々なテーマで開催しています。
去る10月23日のポケロボMeeup#9は、「\Unityビルド環境に関わる方必見/クラウドCI導入による業務改善メソッド大公開!」というテーマで開催。
本講演ではUnityのビルド環境を刷新してCIの導入と仕組みを構築し、ビルド環境に関わる工数/費用削減、リスクを排除させた事例をご紹介しました。
Unityをビルドするためにビルド環境の維持/管理にはエンジニアの大変な手数が必要となり、ビルドマシンのOS UP、セキュリティーバージョンUPに関わる影響対応、ビルドマシンの構築や特殊対応で属人化されてしまいます。
まして、ビルドマシンが壊れた際に業務が止まったり、審査が出せないといったリスクを含んでいます。
全てのプロジェクトでこれをすれば良いということではないと思いますが、ポケラボでは他社と共同で開発を進めた某プロジェクトでビルドマシンをクラウド化することにより、拡張性・保守性・安全性の3つの観点で良い効果を得ることが出来ました。
今回は、参加者アンケートでもご要望いただきまして、Unityのビルド環境をクラウド上に構築した際の記録を、登壇したエンジニアの鈴木がまとめた内容を公開いたします。
鈴木 隼人:2013年4月ポケラボ入社。エンジニアとして運用中プロダクトを担当。
はじめに
Unityのビルド環境をクラウド上に構築したときの記録です。
構築にあたって、AWSのEC2上にJenkinsを置きUnity Cloud Buildを利用します。
前提条件
AWSを利用
Amazon EC2
OS :Amazon Linux 2
環境作成-EC2作成-
インスタンス作成を押下します。
Amazon Linux 2 64ビット (x86)を選択します。
最初の構築時は、t2.microにしておきます。運用してスペック不足であればあげておきます。
企業によって違うので、必要に応じて設定変更しておきます。
ストレージは最初デフォルトの8Gにしています。Jenkinsインストールまでは全容量2G程度です。運用の状況に応じてEBSの拡張します。
企業によって違うので、適切なセキュリティグループを設定します。
設定情報確認してOKなら次へ押します。
インスタンスが作成されます。
インスタンス作成完了するまで数分程度待ちます。
EC2インスタンス作成時に割り当てたキーペアファイル(ここではxxx.pemとする)を使って、ユーザ名「ec2-user」でインスタンスにsshでログインします。
環境作成-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 のホームディレクトリに初期パスワードファイルが書き込まれているので、そのパスワードを入力します。
Jenkins-Pluginのインストールです。「Select plugins to install」でデフォルトお勧め設定なっているので、ご自身の環境に合わせて必要なものをインストールします。
インストールされます。
管理ユーザーを作成します。
URLの設定を行います。デフォルトで入っているので問題なければ完了を押します。
Jenkinsの利用準備ができます。
最初のJenkins画面に出ます。
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を作成し、各種設定を行います。
「古いビルド破棄」にチェックを行い、各種設定します。
「ビルドパラメータ化」を各種設定します。
「SCMをポーリング」にチェック入れて、対象ブランチに対して定期的に監視するかを時間設定します。
ビルドには「シェル実行」を加えます。
以下、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/
基本設定
プロジェクト作成後、プロジェクト内の「Cloud Build」 -> 「Config」メニューから、Basic Info、Source Control Settingsを設定します。
Job作成
「SETUP NEW TARGET」ボタンを押して、BuildしたいPlatformを選択します。
各種設定を入れます。(git branch, サブフォルダ名, Unityバージョン, push後自動ビルド)
次にBundle ID、Xcodeバージョン(iOSの場合)、provisioningの選択(新規登録)を行います。
設定完了するとJOBが作られます。
■Shell内のID等の記載について
Project IDを使ってShell内に記載します。
APIキーを使ってShell内に記載します。
以上で完了となります。
移行自体は簡単にできると思います。ビルド環境において何かしら課題をお持ちの方、ご活用いただける場面がありましたら、是非本記録をご参考いただけますと幸いです。
最後までお読みいただきましてありがとうございます。
宜しければ、記事へイイネ!をいただけますと大変励みになります。
ポケラボでは一緒に働く仲間を募集しています!
ご興味をお持ちいただけた方は、ご応募お待ちしております。
また、ポケラボに関する情報は、弊社のマスコットキャラクターポケロボくんがTwitterで随時展開中!
是非フォローしてあげてください。