1. 程式人生 > 實用技巧 >持續整合高階篇之Jenkins引數化構建(二)

持續整合高階篇之Jenkins引數化構建(二)

上一節我們講解了如何使用bat指令碼或者powershell指令碼自身的機制來達到引數化構建的目的,這在一定程式上增加了靈活性,然而缺點也相當明顯:它只能適應一些相對比較固定的引數傳入(比如像上一節講到的,構建的環境分為(developmentproduction)兩種情況,對於一些相對較複雜的情況以上方法就會捉襟見肘,最為明顯問題是外部的變化可能導致引數隨之做必要更改,最常見的是檔案的位置引數,我們指定歸檔檔案的目錄為D盤下的一個資料夾,現在D盤滿了需要指定為其它盤,則所有的指令碼都需要更改,這樣的結果就是可維護性差.我們可以把一些較為常用的引數定義為全域性引數,比如常用工具的位置.

本節我們將從專案級別,節點級別,全域性級別來講解Jenkins ci提供的引數配置方案

專案級別引數

本節部分我們分為引數構建和在專案中定義專案級別引數來講解.

引數化構建專案.

在Jenkins裡新建一個自由式專案,勾選This project is parameterized會出現一個Add Parameter按鈕,點選會出現一個下拉框,選擇最後一項'string paramter'建立一個字串型別引數,在出現的對話方塊中輸入名稱(我用的是buildenv)和預設值(預設值可以不輸入),在構建欄裡我們選擇Execute windows bat command,在出現的框中輸入以下內容:

//buildenv為我們定義的引數名
echo %buildenv%

點選ok完成專案建立,此時build now

按鈕變成了Build with Parameters引數化構建,點選又會出現一步讓輸入值,有預設值可以直接點選'build',點選後我們檢視控制檯可以看到輸出了我們定義的引數

在以後的章節裡也是一樣,不管是Jenkins預置的引數還是我們自定義的,使用cmd時都是通過%引數名%來獲取.

如果是powershell指令碼,則需要使用$env:引數名來接收引數,比如在powershell命令視窗輸入echo $env:buildenv就會達到和上面cmd一樣的效果.

需要指出的是,如果在jenkins裡直接執行powershell命令,需要下載powershell外掛.

專案級別引數

以上引數化構建適用於需要手動構建的,不是特別頻繁但是引數又必須動態指定的情況,這種構建缺點也相當明顯,因為每次需要手動指定引數.還有一種方法是指定專案級別的引數,這種方式比直接使用指令碼自身引數要更容易管理,因為引數在單獨的一塊地方定義,並且可以新增描述,使得語義更加明確,並且引數在單獨醒目地方出更容易引起關注.

下面講解一下如何在專案級別新增環境變數.

新建一個自由式專案,名稱隨意,找到Build Environment欄目,找到Inject environment variables to the build process選項並勾選,此時會出現一些輸入框讓輸入,Properties File Path暫時忽略,在下面的Properties Content裡輸入buildenv=development就可以在bat,shell或者powershell腳本里使用它了.

如果需要定義多個引數,換一行書寫就行了,同樣是name=value形式

大家可能已經看到,選項裡除了Properties Content外,下面還有Groovy Script選項,大家不要害怕,這裡並不講Groovy,這裡可以使用一些簡單的groovy語法來定義引數變數

Groovy Script框裡輸入的選項如下

def str="hello,world"
return ["greeting":str,"filename":"jenkins.txt"]

可以使用 def關鍵字定義一個變數,下面return裡的內容可以做為引數在構建時使用.比如在bat腳本里可以使用%greeting%來獲取鍵為greeting的引數的值.

節點級別引數

有些引數在不同的節點上是不一樣的,比如說某一個工具的位置,如果我們把它定義為專案級別,由工具在不同節點上安裝的位置可能是不一樣的,這樣就會造成部分節點上的構建失敗.這時候可以考慮把引數定義為節點級別.

進入Manage Jenkins>Manage Nodes,進入管理頁面便會看到我們已經建立好的Jenkins節點,點選某個基點後面的齒輪圖示,在出現的介面裡找到Node Properties,勾選Environment variables此時便可以輸入引數的名稱和值,點選Add按鈕則可以新增多個引數.完成後點選Save儲存後便可以在腳本里使用剛定義的節點級別的變量了.

全域性變數

全域性變數對所有節點都有效,當某些變數不會因為環境的改變而改變,比如說構建的版本只有development和production時,就可以定義為全域性變數.這樣不需要在每個專案裡都重複定義了.

全域性變數的定義也非常簡單,進入Manage Jenkins>Configure System找到Global properties並勾選Environment variables出現的介面跟節點級別配置類似.

使用檔案引數

Jenkins提供了靈活的配置選項,我們除了可以在Jenkins內部配置引數外,還可以以外部檔案的形式提供配置引數,配置引數為name=value鍵值對形式,必須符合java properties檔案格式.

下面講解如何使用配置檔案.

我們新建一個自由式專案,滾動到Build Environment欄,勾選Inject environment variables to the build process,在Properties File Path選項裡輸入配置檔案路徑,我放在了E盤裡,路徑為E:\testenv.txt,這個檔案很簡單,裡面就一行內容,如下:

database=sqlserver

往下流動到Build欄,新建一個Execute windows bat command,輸入以下內容

echo %database%

儲存後點擊構建,可以看到控制檯輸入sqlserver