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)
參考資料