﻿# Jenkins on Windows 心得分享 (01)：從終端機輸出隱藏 Batch 批次命令

有鑑於 [Jenkins CI](http://jenkins-ci.org/) 連續性整合工具相對較少有專門針對 Windows 環境整理的文章，我將打算出一系列 **Jenkins on Windows** 文章，幫助 Windows 平台的開發人員可以更加順利的導入 CI 架構。我的第一篇文章將介紹如何有效地從 Jenkins 的 **終端機輸出** (**Console Output**) 隱藏建置過程執行的 Batch 批次命令。

由於我們公司已經採用 Jenkins CI 有段時間了，前陣子我還開設了一堂 [DevOps 實戰首部曲：使用 Jenkins CI 與 Azure 架構連續性整合方案](http://www.accupass.com/go/DCT104033) 課程，課後的反應非常好，許多人很驚豔的感受到原來導入 CI 架構是多麼美妙的事情，另一方面則是原本覺得難用的 Jenkins CI 介面在經過短短兩天的課程就能快速掌握核心觀念，不但會使用，還更能活用！如果你也有興趣報名此課程，歡迎到 [《預約上課》DevOps 實戰首部曲：使用 Jenkins CI 與 Azure 架構連續性整合方案](http://www.accupass.com/go/DCT_105Q1_09) 留下您的資料，等下個梯次確定日期就會優先提醒大家來報名課程。

我們在使用 [Jenkins CI](http://jenkins-ci.org/)  的時候，經常會透過自訂 Batch 批次命令執行**建置**、**測試**與**部署**等作業，不過像是「部署」的部分，有時候會在指令中寫上部署網站時所需的金鑰或密碼，由於負責開發的工程師皆有 [Jenkins CI](http://jenkins-ci.org/) 的唯讀權限，所以大家其實都可以看到 **終端機輸出** (**Console Output**) 的完整紀錄，如果部署網站的金鑰或密碼在 Console Log 中被揭露的話，那就不太好了。

以下我將建立一個簡單的 Jenkins 作業，並從中說明每一個細節：

1\. 新增作業

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e0ceaf28c964718b6051-image_2785.png)

2\. 設定**作業名稱**並選擇**建置 Free-Style 軟體專案**  
![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6631318acd8f677bc97e-image_2786.png)

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

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5814480561b4da0fff18-image_2787.png "image")

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

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ca84f406da85c1bcf7b3-image_2788.png "image")

5\. 接著執行 **馬上建置**

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/924642a8d3c46750a126-image_2789.png "image")

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2cb9e3d66793e56cbe41-image_2790.png)

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

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/897b78f518f4add16b17-image_2791.png "image")

8\. 當查看終端機輸出時，你可以從下圖編號中得知一些重要的細節，我分別說明如下：  
    [![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/648bb0e310eef0fa5ba1-image_thumb_214.png "image")](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8f717a618e3989bd3ee9-image_2792.png)

1.  Jenkins 會將每一個 **執行 Windows 批次指令** 的 **建置步驟** (**Build step**) 所設定的批次指令內容寫入一個暫時的批次檔中，然後才會去執行這個批次檔。  
    以我們這個例子來說，其內容將會是：  
    
    ```
    echo OK
    
    exit %ERRORLEVEL%
    ```
    
2.  執行批次檔時，由於預設所有指令都會呈現在終端機輸出中，因此你預設會看見所有要執行的命令名稱，不過這可能會揭露一些敏感資訊，這裡必須要特別留意。
3.  最後一步則是每一個 **執行 Windows 批次指令** 執行完畢後都會執行的 **exit** 退出終端機模式 (即退出命令提示字元)，這裡的 0 其實是個 %ERRORLEVEL% 環境變數，這個環境變數會保存著「**上次執行命令的回傳狀態碼**」，所以不一定會回傳 0 喔！ ( 這個環境變數在我的另一篇文章有介紹：[程式結束狀態: Windows 的 %ERRORLEVEL% 與 Linux 的 $?](/post/2010/10/04/Windows-Batch-ERRORLEVEL-and-Linux-Bash-Exit-Status.aspx) )
4.  在 Windows 批次檔環境中，任何命令回傳非 0 的狀態碼都會被視為有錯誤發生，而回傳 0 就代表執行成功。  
    **注意**：該建置步驟若執行成功，會顯示 **Finished: SUCCESS** (成功)，否則就會顯示 **Finished: FAILURE** (失敗)！  
      
    以下是建置失敗時的示意圖，當你看到「**紅色的圓球**」也是代表「**失敗**」的意思。  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f3620b176768bc8f1c53-image_2793.png)

那我們要如何隱藏這些指令輸出呢？其實很簡單，有兩種方法：

1.  在每行指令前面加上一個 **@** 符號，即可隱藏命令顯示在終端機輸出上。  
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ab066c90fb040eb417f8-image_2794.png "image")
2.  在批次命令的第一行加上 **@ECHO OFF** 批次指令即可預設隱藏以下所有批次命令。  
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/67da04174dfe07bfc113-image_2795.png "image")

接著我們再按一次 **馬上建置** 並點選建置的終端機輸出，此時你就可以立刻看到執行的結果發生些微變化，你可以發現原本要輸出 **echo OK** 與 **exit 0** 的指令都不見了，如下圖示：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7af823cbc189bf00b4be-image_2796.png)

**相關連結**

-   [Welcome to Jenkins CI! | Jenkins CI](http://jenkins-ci.org/)
-   [Echo | Windows CMD | SS64.com](http://ss64.com/nt/echo.html)
