使用 Unity Docker Container,讓AWS的機器幫你 Build Assetbundle
OverView
- Unity Docker Image 怎麼創建,要避開的坑有哪些?
- 我的 AWS Instance 怎麼建。
- 執行 Unity Command build Assetbundle.
創建符合專案的 Unity Docker
我的需求是建立有 iOS與 Android平台的 Unity 2018.4.20f1,並且已經註冊好 license 與 安裝了git-lfs。
最終成品:如果你已經有架設 Jenkins,可以直接使用這個 JenkinsJob
由於 gableroux/unity3d/ 提供的 image已經幫我們處理了單一平台,我們就在巨人的肩膀上繼續製作。
接下來我們就專注看 Dockerfile
- 先從 gableroux/unity3d 下載 android 平台版本。
- 接著再額外下載 iOS 版本並進行安裝。
- #Register
填入要產 License 的資料。 - #copy…
因為 Unity2018 有 package Manager 所以要準備一個空的 manifest.json 避免錯誤(坑1)。 - #register unity
這裡比較特別,因為沒有註冊的話他會一直跳出註冊畫面,所以要執行這一行,完成註冊(坑2)。 - # — set custom install
因為我需要安裝 git-lfs 就在這邊寫入額外的安裝程式碼。
跑完以上步驟後就能產出一個已經註冊好的 image,之後就能直接呼叫此 image 進行 build Assetbundle 的動作。
坑1: 由於開啟 Unity 時,Unity Package Manager 會搜尋 manifest.json 檔案,一開始沒那個檔案會找不到,一定要手動加一個進去。
坑2: 我有試過 copy license 的方式,但還是要執行這一行,他相當於跳過 license的畫面。如果沒執行,Docker 就會有 Timeout,因為他在等你設定 license。
符合我需求的Instance 要怎麼製作
目標可以當作 jenkins-slave 的 aws instance
- 先在 AWS 開啟一個 linux 2 (因為 ecs 的 instance 有 drivemapper控制硬碟空間,docker 很容易顯示容量不足,所以用 linux2)
- 依序輸入以下指令
sudo yum update -y
sudo amazon-linux-extrasinstall docker
sudo service docker start
sudo usermod -a-G
docker ec2-user
- 新準備 slave-jenkins 需要用的資料夾與檔案
mkdir jenkins_home
sudo yum install java-1.8.0-openjdk
sudo yum install git -y - 接著去 master-jerkins 創一個節點,然後下載節點的 agent.jar 檔案
- 將檔案複製到 instance 上
scp agent.jar xxxxxxx:agent.jar - 執行 java -jar agent -jnlpUrl … 測試看看,詳細的執行指令可以從 master-jenkins 上取得
java -jar
agent.jar -jnlpUrl
http://xxx.xxx.xxx.xxx/computer/aws-unity/slave-agent.jnlp -secret
xxxxxxxx -workDir
"/home/ec2-user/jenkins_home"
- 設定重開機時能自動執行連回 master-jenkins的程式碼
vim /etc/crontab
//新增執行程式在底端
@reboot java -jaragent -jnlpUrl
...
- 設定 Security Group 開啟 jenkins-slave設定的 port
設定完成後,執行上面的 JenkinsJob並將Node設定成這個 Instance就能產 unity image了。
如何呼叫遠端 Unity 執行 command
創建一個呼叫遠端 Unity 的 JenkinsJob,如果沒有遠端的需求,那你可以在本地端執行
docker run --name myunity -v client:/var/client DOCKER_IMAGE_NAME
Jenkinsfile動作解說
- 連到遠端的 node(上面設定的 slave-jenkins名稱)
- Git權限的環境設定
- Init簡單的初始資料
- Checkout-Project
先 Checkout 專案 (坑3) - Build Assetbundle
在遠端的 Node上建立 Docker container並在 docker內執行 Unity Command。(坑4)
執行完畢後你可以根據自己的需求做 git commit等動作,這邊就自由發揮。
坑3: 注意 Linux環境是不分大小寫,如果是既有的專案,可以用上面的指令先避開。
坑4: 一般來說開啟Unity專案第一次很慢,因為要 imoprt 所有資源,但是在Docker環境不只第一次慢,import 完之後會修改掉所有的 meta file。
reset 後執行第二次會跟第一次一樣費時,但是 meta file就不會再產生變化。
第三次就會有正常的速度。
我的狀況是第一次 1hr 20m, 第二次 1hr 14m, 第三次 3m。
結語
架設Unity Docker觀念不難,但是因為環境與未知坑的關係比預期花掉了好幾倍的時間。希望我的分享能讓使用 Unity docker的人能更順利得架設,如果對你有些幫助,希望給我一些回饋。