建置分別針對使用MSBuild.exe及VB6.exe做了設定及測試, 也分別遇上了些問題, 最後評估後, 兩者都採用了設定 執行Windows批次指令(Command) 的方式來處理, 或許是我還有地方沒搞懂所以用plugin還行不通, 但就目前而言用Command是可以正常運行了。
先來說說骨董級的VB6。雖然Jenkins中有個Visual Basic 6的plugin, 安裝的版本是visual-basic-6@1.3, 在設定建置步驟時也可以選擇VB6這一類, 設定第一個遇到的問題是雖然界面有顯示環境變數的參考, 但實際測試卻發現設定.vbp的路徑中不可以使用變數, 否則會失敗, 原因是找不到路徑; 若改成實際路徑, 則不會再出現找不到路徑的錯誤。

不過按這樣接下去測試, 仍發現即使我自己在命令提示字元視窗中都測試過可以正常編譯的程式, 到了Jenkins中卻仍回報失敗, 所以作業執行結果一律是失敗, 燈號一律是紅燈。VB6 plugin可動的設定不多, 網路也找不到相似的討論, 我索性就改成Command的方式, 反倒是乾脆, 同時透過PowerShell處理, 我更可以在組檔的過程中, 探尋.vbp中是否有條件式編譯的內容, 如果有就一併加入Command指令中, 這更完美。
Get-Content $path | Where-Object {$_ -match "CondComp="} | ForEach-Object {
$cond = $_
}
$cond=$cond.Replace("CondComp=","").Replace("`"","").Replace(" ","")
If ($cond.Length -gt 0){
$cmd = "`"C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE`" `"$path`" /m /outdir `"$workSpacePath`" /out `"$workSpacePath\build%date:~6,4%%date:~0,2%%date:~3,2%.log`" /d $cond"
}
else{
$cmd = "`"C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE`" `"$path`" /m /outdir `"$workSpacePath`" /out `"$workSpacePath\build%date:~6,4%%date:~0,2%%date:~3,2%.log`""
}
由於我是在一個作業中, 包含很多程式的建置步驟, 在Command模式下, 還有一個選項滿推薦要設定的, 那就是把指定的ERRORLEVEL當成Unstable不穩定的狀態。雖然作業中包含了很多程式, 但不見得每支程式之間都彼此有關連, 預設情況下, 如果有一支程式編譯失敗了, 那這整個作業就會視為失敗而中止, 但我並不想這樣。我想要的是出錯的就記錄下來, 並繼續完成後面的步驟。


這裡VB6編譯失敗時, 回傳的ERRORLEVEL會是1, 因此我可以把這個ERRORLEVEL=1當成是Unstable, 並且讓作業可以再往下進行, 而最終, 有Unstable記錄的作業就會呈現黃燈狀態, 這樣我就會知道這裡面有未完成的建置。
再來是MSBuild的測試。Jenkins中同樣有個MSBuild的plugin, 版本是msbuild@1.29, 這個plugin的運作比前面的VB6的正常多了, plugin可設定的選項比VB6的多, 編譯也都能正常執行, 執行結果可以在Console output內看到整個作業編譯的結果, 就像在開發IDE上編譯輸出視窗中看到的一樣, 而在Console output中針對Warning部分會以黃字呈現, Error則以紅字呈現。

不過這裡也有一個問題(好吧, 也可以說是因為我的用法的問題, 不能怪Jenkins), 同樣地, 如果有一支程式編譯失敗了, 那這整個作業就會視為失敗而中止, 後面的都不會處理。MSBuild plugin這裡有個編譯失敗後是否繼續的選項(Continue Job on build Failure), 選取它就可以避免中斷的問題, 同樣它會記錄下錯誤來, 似乎不錯, 不過, 執行後卻發現有另一個問題, 而且是和VB6 plugin相反, 利用這個選項避免中斷, 結果是即使有錯誤, 最終這個作業卻呈現成功的藍燈, 這也不是我想要的。
於是同樣地, 索性也不用plugin了, 改成Command的方式, 而.NET程式在這裡編譯失敗時的ERRORLEVEL也同樣是回傳1, 所以就像上面VB6的做法一樣, 都將ERRORLEVEL=1當成是Unstable, 那就可解決前面提到的問題了。