1. 程式人生 > >持續整合高階篇之Jekins指令碼引數化構建

持續整合高階篇之Jekins指令碼引數化構建

系列目錄

本系列已經很久沒有更新了,接前面基礎篇,本系統主要介紹jenkins構建裡的一些高階特性.包括指令碼引數化,Jenkins Pipeline與及在PipeLine模式下如何執行常見的傳統構建任務(這裡指jenkins自由風格構建模式),jenkins cli,jenkins ssh,jenkins任務排程,資源排程,jenkins任務遠端觸發,jenkins混合叢集搭建(同時包含windows和linux節點)等高階功能.

jenkins引數化構建

在一些複雜的構建中,我們可能需要指定很多引數,如果這些引數都寫死在cmd或者powershell指令碼或者ssh腳本里,指令碼的可擴充套件性將嚴重受限,最為重要的是修改構建指令碼可能會造成嚴重後果(尤其是一些非常複雜的指令碼),這裡的一個最佳實踐就是不要輕易更改生產環境的指令碼檔案.而引數化構建可以大大增加指令碼的可擴充套件性.

Jenkins提供了豐富的引數配置入口結合指令碼自身的外部引數處理可以實現非常靈活的指令碼引數配置.下面從指令碼自身引數化選項,專案級引數化配置,節點級引數化配置以及全域性引數配置來詳細講解如何在Jenkins裡實現引數化配置.

指令碼自身引數化配置

下面分別介紹bat指令碼和powershell指令碼如何接收外部引數

bat指令碼接收外部引數

在windows bat指令碼命令裡,可以通過%0,%1,%2...以此類推來接收外部傳入引數,其中%0為指令碼自身的名稱,很多時候不是我們需要的,我們可以從%1開始接收外部傳入引數.我們假如有以下一個名為build.bat的指令碼,它用作構建測試環境和生產環境的指令碼,測試環境和生產環境的構建可以通過一個外部引數來判斷.為了簡單起見我們並不使用真實環境的構建指令碼,而是簡單模擬,希望讀者能夠舉一反三,聯絡到真實環境應用場景.

這個bat指令碼非常簡單,就一行程式碼

echo %1

shell接收外部引數

在Jenkins中,除了powershell和bat命令外,其它地方接收外部引數的方法寫法都是shell語法寫法,即${引數名}形式

如果我們傳入什麼就會列印什麼,我們傳入development,或者production,bat指令碼就會接收到它們.以上非常簡單,這裡不在jenkins裡單獨建立專案演示,大家可以自己動手試一試.

powershell接收外部引數

相對於windows cmd,powershell更為強大,也更為靈活.下面分別介紹powershell的位置引數命名引數

powershell位置引數

位置引數類似於上面講的cmd通過%0,%1獲取引數一樣,通過引數的順序來決定呼叫的是哪一個引數.在Powershell裡,位置引數傳入到ps1檔案後都儲存在了一個叫作$args的陣列變數裡,可以通過$args[0],$args[1]來獲取各位置上的引數(位置通過空格區分,如果引數包含空格需要加引號)

類似上面bat,我們新建一個叫作'build.ps1'的powershell指令碼檔案,程式碼與上面的bat類似,如下

echo $args[0]

需要注意的是,powrshell指令碼檔案(即字尾名為ps1的檔案)無法通過cmd命令視窗開啟.需要使用powershell視窗或者呼叫powershell.exe來開啟

ps1檔案的執行方式

1) 使用powrshell命令視窗開啟,就像開啟cmd命令一下開啟powershell命令視窗,需要注意的是powershell視窗執行ps1檔案需要使用相對路徑或者絕對路徑,比如你要開啟一個名稱為Build.ps1的檔案,開啟方式應該是.\Build.ps1(相對路徑形式)或者C:\build.ps1形式,不能是直接Build.ps1

2) 使用cmd開啟powershell,在cmd中輸入powershell就會進入powershell命令視窗,和直接開啟powershell命令視窗效果是一樣的.

3) 通過powrshell.exe 執行powershell命令.在cmd中輸入powershell.exe -File 要執行的ps1檔案即可執行ps1指令碼

第三種方式提供了一種在cmd環境執行powershell指令碼的方法,這在jenkins環境中非常有用,可以不必使用powershell外掛即可呼叫powershell指令碼.

powershell 命名引數

很多時候,尤其在要傳入的引數非常多的時候,位置引數語義不是很清析,對於除錯指令碼很不方便,而命名引數可以在一定程度上使語義更清楚,出錯的可能性也會更小.下面就介紹一下powershell中的命名引數,我們新建一個名為build.ps1(名稱可以隨便起)

param($build,$version)

echo "current build type is: $build,and the version is:$version"

以上指令碼我們通過param關鍵字建立了兩個命名引數,$build和$version(powershell中引數命名前面要加一個$符號),我們在當前指令碼所在資料夾下開啟powershell命令視窗,然後執行以下命令

.\build.ps1 -version 1.0 -build development

可以看到這裡是通過-+引數名的方式來傳入命名引數

可以看到輸出如下結果

current build type is: development,and the version is:1

大家可以看到,不管-version-build位置如何,輸出的結果都是一樣的.

明眼的同學可能會發現一點小問題,那就是-versoin輸入的引數是1.0而輸出的結果卻是1,這是因為powershell把1.0當作數字來處理了,捨棄掉了沒有用的小數位,我們想要輸出1.0只需要把1.0用引號引起來就行了,當然還有其它辦法,那就是指定引數的型別,指定引數型別超出了本節講解的範圍.有興趣的童鞋可以查閱相關資料深入瞭解.