持續集成高級篇之Jenkins參數化構建(二)

  • 2019 年 10 月 3 日
  • 筆記

系列目錄

上一節我們講解了如何使用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