Jenkinsfile中error语句未执行,构建未按预期失败求助
问题描述
我有一个调用共享库的Jenkinsfile,示例如下:
@Library('test-shared-library') _ testAndPack{ //container = '' PIPELINE = [ ["type": "python", "name": "Dummy", "stage": "Run python", "folder": "build", "script": "python3 HelloWorld.py", ], ["type": "Pack", "name": "DummyCombination", "stage":"Pack To Zip", "script": "echo packing to zip", "artefacts": "*.zip" ], ] triggerGenerateCodePipeline = true }
对应的共享库文件testAndPack.groovy代码如下:
def call(body) { // Confuration from the argument def config = [:] body.resolveStrategy = Closure.DELEGATE_FIRST body.delegate = config body() try{ for (val in config.PIPELINE){ if (val.type == "python"){ run_python(val) }else if (val.type == "Pack"){ perform_packing(val) } } } catch(Exception e) { BUILD_STATUS ="FAILURE" } } def run_python(val){ stage(val.name) { node { checkout scm BUILD_STATUS = sh ( script: "ls && cd ${val.folder} && ${val.script}", returnStatus: true ) == 0 echo "${BUILD_STATUS}" if (BUILD_STATUS) { echo "${val.name} was build correctly " } else { error "#### build_step ${val.name} failed ####"//Even here it doesn't print when failure } } } } def perform_packing(val){ stage(val.name) { node { def BUILD_STATUS = sh (returnStatus: true, script: "ls && zip -r build.zip build")==0 echo "${BUILD_STATUS}" if (BUILD_STATUS) { echo "${STAGE_NAME} was build correctly " } else { echo "before error" error "There is a failure" //Does not print echo "after error" //throw new Exception("Something went wrong!") } } } }
当前节点中缺少zip工具,我预期会触发error语句并使构建失败,但实际构建未按预期失败,error语句也未执行。不过error结构在简单流水线中可正常工作,请问我遗漏了什么?
问题原因与解决方法
核心问题出在共享库call方法的try-catch块逻辑:
你在顶层call方法中捕获了所有异常,但仅将BUILD_STATUS设为"FAILURE",没有重新抛出异常或触发构建终止操作。当run_python或perform_packing里调用error抛出异常时,这个异常会被顶层的catch块完全"吞掉",Jenkins无法感知到失败,因此构建会继续执行直至结束。
修复方案
修改call方法的catch块,添加重新抛出异常或直接终止构建的逻辑:
def call(body) { def config = [:] body.resolveStrategy = Closure.DELEGATE_FIRST body.delegate = config body() try{ for (val in config.PIPELINE){ if (val.type == "python"){ run_python(val) }else if (val.type == "Pack"){ perform_packing(val) } } } catch(Exception e) { BUILD_STATUS ="FAILURE" // 重新抛出异常,让Jenkins识别构建失败并终止 throw e // 也可以直接调用error输出自定义信息并终止: // error "流水线执行失败: ${e.getMessage()}" } }
补充说明:当节点缺少zip工具时,perform_packing中的sh命令会返回非0状态,BUILD_STATUS会变为false,此时确实会进入else分支执行echo "before error"和error语句,但之前因为顶层try-catch的拦截,异常没有传递到Jenkins层面。修改后,异常会被正常传递,构建会正确失败并显示对应的错误信息。
内容的提问来源于stack exchange,提问作者Rakshan Premsagar Kapikad
相关产品推荐
相关产品推荐

