Jenkins教程(六)腳本與方法執行效果不合預期,如何及時中止pipeline


場景

使用Jenkins的流水線時,有時明明某些Python或Shell執行結果錯誤,但仍會繼續運行下去,甚至於最終提示成功。這並不合我們的預期——出現錯誤及時停止。當然,還有那種小錯誤不影響構建的,希望繼續執行下去的情況。

所以,場景有兩個:

  • 希望發現錯誤,及時中止執行的情況。
  • 希望錯誤發生時,腳本仍繼續執行的情況。

本文以上兩種場景分別給出示例。

本文不考慮能被pipeline捕獲的異常中斷。

及時中止,如何做?

1、對於Jenkins流水線中,使用groovy語法實現的功能,可以考慮使用Java的異常。

示例:

stage('test'){
	step{
		script{
			def res = someGroovyMethod()
			if(res == false){
				throw new RuntimeException('提示信息')
			}
		}
	}
}

2、對於流水線中調用Shell,可以考慮匹配返回值,拋異常。

示例:

stage('test'){
	step{
		script{
			def res = sh(label:"測試分支是否存在:", script: """
						echo 'hello world!'
						""", returnStdout: true);
			if(!res.contains("hello world")){
				throw new RuntimeException('提示信息')
			}
		}
	}
}

除了 returnStdout 用於返回執行輸出,還可以使用 returnStatusreturnStatusreturnStdout 不能同時使用,returnStatus 表示腳本執行完畢的返回值是0還是非0,非0值即有問題的。

3、對於以上兩種情況,只要能獲取返回輸出或狀態,就可以終止流水線,使用 error

示例:

stage('test'){
	step{
		script{
			def res = someGroovyMethod()
			if(res == false){
				error '提示信息'
			}
		}
	}
}

報錯忽略,如何做?

1、使用異常捕獲,try-catch block 或 try-catch-finally block。

示例:

stage('test'){
	step{
		script{
			try{
				someMethodMaybeThrowException()
			} catch(Exception e){
				// do something you want. e.g,print logs.
			}
		}
	}
}

2、使用Jenkins 流水線中的 catchError 忽略異常或可能中斷構建的錯誤。

示例:

stage('test'){
	step{
		script{
			//無論是否會報錯,這個stage以及構建結果都不會因這個錯誤而失敗。
			catchError(buildResult: 'SUCCESS', catchInterruptions: false) {
			    someMethodMaybeThrowException()
			}
			//some post step will continued.
		}
	}
}

catchError 的玩法還有很多,典型應用場景是針對一些后置的操作,比如構建完成發消息給構建者,保證這個消息不會因為腳本執行中斷而停止。當然了,聲明式流水線還有post塊完成剛才說的功能~

最后

簡單記記,公司最近流水線改造,順手記點內容。如果文中有什么錯誤,請留言評論告知我,謝謝。

引用:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM