2017年12月17日 星期日

使用jenkins建置unity3d專案

使用jenkins建置unity3d專案

前言

  最近開始接觸jenkins,就試著用jenkins來建置unity3d的專案,發現過程有點複雜,所以記錄下來。如果只需要建置專案而已,就只需要做到步驟6就可以了,之後的步驟是為了做建置備份而設定的。

步驟1:安裝unity3d plugin

  開啟jenkins後,到管理外掛程式,如下圖
開啟管理外掛程式
接著到"可用的"頁籤,並在右上角的過濾條件輸入"unity",然後在下方列表勾選"Unity3d plugin"後,按下"直接安裝",如下圖
安裝unity3d plugin
如果這個外掛已安裝,這個步驟可以略過。

步驟2:設定unity3d plugin

  到"Global Tool Configuration",如下圖
開啟Global Tool Configuation
接著將畫面向下拉可以找到"Unity3d"的標籤,並按下"Unity3d安裝...",如下圖
按下"Unity3d安裝..."
接著設定unity3d程式的路徑,如下圖
設定unity3d程式的路徑
這裡可以依據需求來新增unity3d程式,名稱可以自己取名,這邊建議將Unity的版本寫在名稱裡,方便日後辨識,安裝目錄的話要注意並不是執行檔的目錄的位址,假設unity3d的執行檔位址是"C:\Program Files\Unity\Editor\Unity.exe",那這邊要填的路徑就會是"C:\Program Files\Unity",填完後按下"Save"即可。


步驟3:新增建置script在unity3d的專案

  開啟要被建置的unity3d專案,加入一個名為"JenkinsBuilder"的C#Script,然後填下以下內容

#if UNITY_EDITOR
using System;
using System.Linq;
using UnityEditor;

static class JenkinsBuilder {
 [MenuItem("Auto Builder/Build Win64")]
 public static void PerformBuildWin64()
 {
  var path = string.Format("Builds/Win64/{0:yyyy-MM-dd-hh-mm-ss}", DateTime.Now);

  if (UnityEditorInternal.InternalEditorUtility.inBatchMode)
  {
   path = GetBatchOutputPath();

   if (path == null)
   {
    throw new ArgumentException("-output is not set");
   }
  }

  PerformBuild(path, BuildTarget.StandaloneWindows64);
 }
 static void PerformBuild(string path, BuildTarget target)
 {
  var scenes = EditorBuildSettings.scenes.Where((v) => { return v.enabled; }).Select((v) => { return v.path; });
  BuildPipeline.BuildPlayer(scenes.ToArray(), path, target, BuildOptions.None);
 }

 static string GetBatchOutputPath()
 {
  var args = Environment.GetCommandLineArgs();
  for (int ii = 0; ii < args.Length; ++ii)
  {
   if (args[ii].ToLower() == "-output")
   {
    if (ii + 1 < args.Length)
    {
     return args[ii + 1];
    }
   }
  }

  return null;
 }
}
#endif

這裡要注意這裡設定是要建置windows 64bit的版本,若要建置不同平台的話,這個script需要修改!

步驟4:在jenkins裡新增作業

  到jenkins的首頁,按下"新增作業",如下圖
新增作業
接著設定作業,如下圖
設定作業
"Enter an item name"裡設定的是作業名稱,可以自己命名,這裡使用"BuildUnityTest",然後選擇"建置Free-style軟裡專案"後,按下"OK"。

步驟5:設定作業組態

  完成上一步驟後,會看到下圖
設定作業組態頁面
往下拉,在建置標籤裡,按下"新增建置步驟",並在子選單中選擇"Invoke Unity3d Editor",如下圖
新增建置步驟
接著設定建置步驟,如下圖
設定建置步驟
"Unity3d installation name"的欄位可以選擇要用哪一個unity3d來建置,如果這個欄位的選單是空的,表示步驟2的設定沒設定好!"Editor command line arguments"的欄位是填入建置的console命令,填入以下的命令
-projectPath "C:\Users\hosee\Documents\Unity\Test" -logFile "$WORKSPACE/unity3d_editor.log" -quit -batchmode -nographics -executeMethod JenkinsBuilder.PerformBuildWin64 -output "$WORKSPACE/Builds/test.exe"

-projectPath裡設定的是要建置的unity3d專案的路徑,這裡設定的是"C:\Users\hosee\Documents\Unity\Test",-logFile設定的是log檔輸出的位置,-executeMethod裡設定的是要執行的script命令,還記得步驟3的script嗎?這裡就是去呼叫那一個script的method,可以根據需要更改,這裡呼叫的是"JenkinsBuilder.PerformBuildWin64",-output設定的是輸出的路徑,這裡的設定值在不同的平台設定的方式不太一樣,在Windows平台設定的是輸出執行檔,所以設定為"$WORKSPACE/Builds/test.exe"。設定完後按下下方的"儲存"。

步驟6:建置專案

  到jenkins的首頁,點選建置的作業,如下圖
選擇建置的作業
接著按下"馬上建置",如下圖
馬上建置
建置完成後就可以在"(jenkins的安裝目錄)/workspace/(作業名稱)/Builds/"下得到建置後的檔案,如下圖
建置後的檔案

步驟7:安裝Build Timestamp Plugin

  和步驟1一樣的方法安裝"Build Timestamp Plugin"。

步驟8:設定Build Timestamp Plugin

  到jenkins的首頁,按下"設定系統",如下圖
設定系統
在"Build Timestamp"的標籤裡,按下新增並設定參數,如下圖
設定Build Timestamp
其中Name是環境變數的名稱,這裡的參數是"BUILD_TIMESTAMP",Pattern是日期時間的格式,這裡的參數是"yyyy_MM_dd_HH_mm_ss",這兩個參數都可以依據需要來調整。設定完後按下方的"儲存"。

步驟9:設定備份

  回到作業的組態,在建置的標籤中,把"Editor command line arguments"改成下面
-projectPath "C:\Users\hosee\Documents\Unity\Test" -logFile "$WORKSPACE/unity3d_editor.log" -quit -batchmode -nographics -executeMethod JenkinsBuilder.PerformBuildWin64 -output "$WORKSPACE/Builds/$BUILD_TIMESTAMP/test.exe"

這裡是改變-output的參數,讓它會依據日期時間來輸出資料夾。接著到建置後動作的標籤下,按下新增建置後動作,然後選擇封存成品,如下圖
新增封存成品
接著設定封存成品的參數,在"要封存的檔案"的欄位輸入"
在"要封存的檔案"的欄位輸入"Builds/$BUILD_TIMESTAMP/**/*.*",如下圖
設定封存成品
設定完後按下下方的"儲存"。

步驟10:測試建置

  回到作業頁面按下"馬上建置",建置完後,到"(jenkins的安裝目錄)/workspace/(作業名稱)/Builds"下檢查是否有建置時間的資料夾並確認專案輸出的檔案是否被正確建置,如下圖
確認workspace的檔案
接著確認是否備份,到"(jenkins的安裝目錄)/jobs/(作業名稱)/builds/(建置次數)/archive/Builds"下檢查是否有建置時間的資料夾並確認專案輸出的檔案是否被正確建置,如下圖
確認是否備份

參考資料:

思元的開發筆記

1 則留言: