使用 Unity Docker Container,讓AWS的機器幫你 Build Assetbundle

Jeff Yin
Akatsuki Taiwan Technology
5 min readOct 2, 2020

OverView

  1. Unity Docker Image 怎麼創建,要避開的坑有哪些?
  2. 我的 AWS Instance 怎麼建。
  3. 執行 Unity Command build Assetbundle.

創建符合專案的 Unity Docker

我的需求是建立有 iOS與 Android平台的 Unity 2018.4.20f1,並且已經註冊好 license 與 安裝了git-lfs。

最終成品:如果你已經有架設 Jenkins,可以直接使用這個 JenkinsJob

由於 gableroux/unity3d/ 提供的 image已經幫我們處理了單一平台,我們就在巨人的肩膀上繼續製作。

接下來我們就專注看 Dockerfile

  1. 先從 gableroux/unity3d 下載 android 平台版本。
  2. 接著再額外下載 iOS 版本並進行安裝。
  3. #Register
    填入要產 License 的資料。
  4. #copy…
    因為 Unity2018 有 package Manager 所以要準備一個空的 manifest.json 避免錯誤(坑1)。
  5. #register unity
    這裡比較特別,因為沒有註冊的話他會一直跳出註冊畫面,所以要執行這一行,完成註冊(坑2)。
  6. # — 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

  1. 先在 AWS 開啟一個 linux 2 (因為 ecs 的 instance 有 drivemapper控制硬碟空間,docker 很容易顯示容量不足,所以用 linux2)
  2. 依序輸入以下指令
    sudo yum update -y
    sudo amazon-linux-extras
    install docker
    sudo service docker start
    sudo usermod -a
    -G docker ec2-user
  3. 新準備 slave-jenkins 需要用的資料夾與檔案
    mkdir jenkins_home
    sudo yum install java-1.8.0-openjdk
    sudo yum install git -y
  4. 接著去 master-jerkins 創一個節點,然後下載節點的 agent.jar 檔案
  5. 將檔案複製到 instance 上
    scp agent.jar xxxxxxx:agent.jar
  6. 執行 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"
  7. 設定重開機時能自動執行連回 master-jenkins的程式碼
    vim /etc/crontab
    //新增執行程式在底端
    @reboot java -jar
    agent -jnlpUrl ...
  8. 設定 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動作解說

  1. 連到遠端的 node(上面設定的 slave-jenkins名稱)
  2. Git權限的環境設定
  3. Init簡單的初始資料
  4. Checkout-Project
    先 Checkout 專案 (坑3)
  5. 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的人能更順利得架設,如果對你有些幫助,希望給我一些回饋。

--

--