持續整合高階篇之Jenkins引數化構建(二)
上一節我們講解了如何使用bat指令碼或者powershell指令碼自身的機制來達到引數化構建的目的,這在一定程式上增加了靈活性,然而缺點也相當明顯:它只能適應一些相對比較固定的引數傳入(比如像上一節講到的,構建的環境分為(development
和production
)兩種情況,對於一些相對較複雜的情況以上方法就會捉襟見肘,最為明顯問題是外部的變化可能導致引數隨之做必要更改,最常見的是檔案的位置引數,我們指定歸檔檔案的目錄為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