Jenkins 執行 Windwos 批次指令時顯示失敗

Jenkins 的強大在於可以執行 windows 的指令,甚至是 powershell, 但最近在執行 robocopy 這個 dos command 時居然在 jenkins 的建置結果有時會顯示成功,有時會顯示失敗

在 jenkins 中,我們會希望將建置後的一些靜態檔案資料同步到遠端去

於是在 jenkins 設定了這個執行指令 

robocopy "c:\souce" "\\remoteShared\des" /s /e /MT:100

第一次執行時, Jenkins 的確發現 souce 的資料夾的確有複製到遠端去,然而 Jenkins 上居然是顯示建置失敗

觀察了一下 Jenkins console 輸出, 的確資料都有複製過去,但奇怪的是 exit 1 這個字眼

然而再建置一次之後的結果居然就成功了

查了一下,才發現 Jenkins 建置的結果判定方式是以 exit code, 預設值 exit code 為 0會被乎略,如果不為 0 的話,就會被 Jenkins 判定為執行失敗

那為何執行完 robocopy 為何會得到不同的結果呢?

在這邊可以參考一下 robocopy 的執行結果定義

這也可以解釋了為什麼我們第一次執行的時候,會得到 exit code 1 (fail in Jenkins)

然而第二次執行的時候,檔案都已經存在了,不需要複製新的檔案,所以會得到 exit code 0 (pass in Jenkins)

 

要解決這個問題有兩個方式

1. 修改 Jenkins 的判斷方式

可以試著去設定 ERRORLEVEL to set build unstable 的判斷邏輯,但目前只看到接受單值的設定

以 robocopy 會有 0, 1, 2, 4... bla bla 這麼多的情況,這個設定目前較不適合

即便設定了,也只能標記為不穩定

可以採用方法2

2. 將結果再做一次轉型

只要是 1 以上的值,我們就 exit code 轉為 0,其他的就以 exit code 為 1 

或是在 command line 以 Set ErrorLevel 的方式執行,其實也是一樣的道理

robocopy "c:\souce" "\\remoteShared\des" /s /e /MT:100
if %ERRORLEVEL% GTR 1 ( exit 1 ) else (exit 0)

參考資料

https://ss64.com/nt/robocopy-exit.html

https://code-examples.net/en/q/125da2f