保障pipeline腳本在devops中成功應(yīng)用的四大核心點

想設(shè)計復(fù)雜的pipeline腳本在devops中成功應(yīng)用,我們需要從如下幾個方面進行考慮:

1.腳本的穩(wěn)定性:使用異常處理機制保證在發(fā)生異常的情況下腳本能夠捕獲異常并持續(xù)運行;

2.腳本執(zhí)行的超時處理:構(gòu)建時需要考慮超時機制避免花費大量時間等待而浪費執(zhí)行時間;

3.構(gòu)建結(jié)果處理:通過異常處理機制,jenkins build的結(jié)果都是SUCCESS,如果想對build的結(jié)果或者是stage的結(jié)果進行控制分析,我們需要進一步對構(gòu)建結(jié)果進行處理;

4.對于groovy腳本的調(diào)用:引入其他groovy腳本來實現(xiàn)某些更為復(fù)雜的功能

代碼的設(shè)計基礎(chǔ)樣式

寫一個腳本的通常形式是

node {?

????stage('Build') {

????????// git 下載代碼

?????? // mvn clean install 構(gòu)建代碼

??? }

??? stage('unit Test') {

????????// 執(zhí)行單元測試

}

stage('Test') {

????????// 執(zhí)行自動化測試腳本,進行核心功能覆蓋

??? }

??? stage('Deploy') {

????????//執(zhí)行運維腳本,部署程序上線

??? }

}

對腳本進行穩(wěn)定性處理

stage('Test'){

try {

? //需要處理的代碼

}catch(err) {

?? //處理error的代碼

?}

catch(exp) {

? //處理exception的代碼

??? }

腳本執(zhí)行超時的處理

某些場景我們需要對腳本進行超時處理,例如maven構(gòu)建超時、測試代碼執(zhí)行超時等等,那么我們可以這樣設(shè)計代碼。

try {

???????????timeout(timeout) {

???????????????????? //超時處理的代碼

???????????????????????????????? }

??? }

catch (exp) {

??? //捕獲超時異常,便于大家做進一步的處理

???????def error_msg = exp.getCauses()[0].toString()

???????if (error_msg.find("TimeoutStepExecution") =="TimeoutStepExecution") {

????????? //處理邏輯

?????????????????}

}

構(gòu)建結(jié)果的處理

通過使用try… catch…的處理,jenkins build的結(jié)果都是SUCCESS,如果想對build的結(jié)果或者是stage的結(jié)果進行控制,可以按照下面的方法進行處理:

build結(jié)果包括:SUCCESS, UNSTABLE,或者FAILURE (返回null ,build正在進行中)

使用變量currentBuild.result可以設(shè)置build的最終結(jié)果

currentBuild.result =‘FAILURE’//設(shè)置build結(jié)果為失敗

對各個stage的結(jié)果處理,需要使用catchError

catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {}//設(shè)置build結(jié)果為成功,而改stage結(jié)果為失敗

引入其他groovy腳本

調(diào)用groovy類中的api

ClassDemo.groovy

class MyClass {

? ? void test1() {

? ? ? ? println("test1")

? ? }

? ? static void test2() {

? ? ? ? println("test2")

? ? }

}

return new MyClass()

注意一定要給調(diào)用者一個返回值,即return new MyClass()返回一個實例

調(diào)用groovy腳本中的函數(shù)

Demo.groovy

def fun1(){

? ? println("func1")

}

def fun2(){

? ? fun1()

? ? println("func2")

}

def fun3(){

? ? fun1()

? ? println("func3")

}

return this

同樣注意一定要給調(diào)用者一個返回值,即return this

在pipeline中調(diào)用groovy腳本

使用load引入腳本即可,代碼如下

node {

? ? ? def f=load ("/opt/scripts/test/Demo.groovy")

? ? ? f.fun1()

? ? ? def f2=load ("/opt/scripts/test/ClassDemo.groovy")

? ? ? f2.test1()

}

jenkins share libary方式

可以使用share的方法,請參考官方文檔:

https://www.jenkins.io/doc/book/pipeline/shared-libraries/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容