有鑑於 Jenkins CI 連續性整合工具相對較少有專門針對 Windows 環境整理的文章,我將打算出一系列 Jenkins on Windows 文章,幫助 Windows 平台的開發人員可以更加順利的導入 CI 架構。我的第一篇文章將介紹如何有效地從 Jenkins 的 終端機輸出 (Console Output) 隱藏建置過程執行的 Batch 批次命令。
由於我們公司已經採用 Jenkins CI 有段時間了,前陣子我還開設了一堂 DevOps 實戰首部曲:使用 Jenkins CI 與 Azure 架構連續性整合方案 課程,課後的反應非常好,許多人很驚豔的感受到原來導入 CI 架構是多麼美妙的事情,另一方面則是原本覺得難用的 Jenkins CI 介面在經過短短兩天的課程就能快速掌握核心觀念,不但會使用,還更能活用!如果你也有興趣報名此課程,歡迎到 《預約上課》DevOps 實戰首部曲:使用 Jenkins CI 與 Azure 架構連續性整合方案 留下您的資料,等下個梯次確定日期就會優先提醒大家來報名課程。
我們在使用 Jenkins CI 的時候,經常會透過自訂 Batch 批次命令執行建置、測試與部署等作業,不過像是「部署」的部分,有時候會在指令中寫上部署網站時所需的金鑰或密碼,由於負責開發的工程師皆有 Jenkins CI 的唯讀權限,所以大家其實都可以看到 終端機輸出 (Console Output) 的完整紀錄,如果部署網站的金鑰或密碼在 Console Log 中被揭露的話,那就不太好了。
以下我將建立一個簡單的 Jenkins 作業,並從中說明每一個細節:
1. 新增作業

2. 設定作業名稱並選擇建置 Free-Style 軟體專案

3. 新增一個建置步驟,並選擇 執行 Windows 批次指令

4. 我們設定一個最簡單的 echo OK 批次指令即可,然後儲存設定
請注意:這裡輸入的指令,其實就是批次檔內容。

5. 接著執行 馬上建置

6. 展開 #1 建置的選單,請點選如下圖的 倒三角形 展開選單

7. 點選 Console Output (終端機輸出)

8. 當查看終端機輸出時,你可以從下圖編號中得知一些重要的細節,我分別說明如下:
- Jenkins 會將每一個 執行 Windows 批次指令 的 建置步驟 (Build step) 所設定的批次指令內容寫入一個暫時的批次檔中,然後才會去執行這個批次檔。
以我們這個例子來說,其內容將會是:
echo OK
exit %ERRORLEVEL%
- 執行批次檔時,由於預設所有指令都會呈現在終端機輸出中,因此你預設會看見所有要執行的命令名稱,不過這可能會揭露一些敏感資訊,這裡必須要特別留意。
- 最後一步則是每一個 執行 Windows 批次指令 執行完畢後都會執行的 exit 退出終端機模式 (即退出命令提示字元),這裡的 0 其實是個 %ERRORLEVEL% 環境變數,這個環境變數會保存著「上次執行命令的回傳狀態碼」,所以不一定會回傳 0 喔! ( 這個環境變數在我的另一篇文章有介紹:程式結束狀態: Windows 的 %ERRORLEVEL% 與 Linux 的 $? )
- 在 Windows 批次檔環境中,任何命令回傳非 0 的狀態碼都會被視為有錯誤發生,而回傳 0 就代表執行成功。
注意:該建置步驟若執行成功,會顯示 Finished: SUCCESS (成功),否則就會顯示 Finished: FAILURE (失敗)!
以下是建置失敗時的示意圖,當你看到「紅色的圓球」也是代表「失敗」的意思。

那我們要如何隱藏這些指令輸出呢?其實很簡單,有兩種方法:
- 在每行指令前面加上一個 @ 符號,即可隱藏命令顯示在終端機輸出上。
- 在批次命令的第一行加上 @ECHO OFF 批次指令即可預設隱藏以下所有批次命令。
接著我們再按一次 馬上建置 並點選建置的終端機輸出,此時你就可以立刻看到執行的結果發生些微變化,你可以發現原本要輸出 echo OK 與 exit 0 的指令都不見了,如下圖示:

相關連結