場景
使用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
用於返回執行輸出,還可以使用returnStatus
,returnStatus
與returnStdout
不能同時使用,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塊完成剛才說的功能~
最后
簡單記記,公司最近流水線改造,順手記點內容。如果文中有什么錯誤,請留言評論告知我,謝謝。
引用: