You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:35:01