Jenkins错误处理脚本和声明性管道之间的错误



我想从脚本管道中构建许多声明的管道作业,并用嵌套在父母的try/catch try/catch

中的单个尝试/捕获块处理任何失败
node {
    def err = false
    try{
        stage('build image') {
            try {
                //this job is a declarative pipeline
                build job: 'build-docker-image' 
            } catch(e) {
                echo "failure at build-docker-image"
                throw e
            }
        }
        stage('deploy image') {
            try {
                //this job is a declarative pipeline
                build job: 'deploy-docker-image' 
            } catch(e) {
                echo "failure at deploy-docker-image"
                throw e
            }
        }
    } catch(e) {
        err = true
        echo "caught error ${e}"
    }
    if(!err) {
        echo "build and deploy ran successfully"
    }
}

此代码的行为不一致。如果构建作业出于句法原因失败,则该错误会被子女尝试/捕捉并回应错误消息,然后将其扔给父母,这也将其捕获并回应错误本身。但是,如果构建作业出于较少明确的原因而失败,即图像未正确编译,则父级的尝试/捕获仍然会捕获错误并与上一个示例相同,但是孩子的尝试/捕获不会捕获错误,并且不会呼应其故障消息。

为什么差异?是否有失败的声明管道作业造成了一些错误,但尝试/捕获块不会捕获?混合脚本和声明性管道是不好的做法吗?我将感谢对此的任何建议或见解。谢谢

您使用相同的变量来捕获try..catch循环中的错误。尝试这个:

    def err = false
    try{
        stage('build image') {
            try {
                //this job is a declarative pipeline
                build job: 'build-docker-image' 
            } catch(e) {
                echo "failure at build-docker-image"
                throw e
            }
        }
        stage('deploy image') {
            try {
                //this job is a declarative pipeline
                build job: 'deploy-docker-image' 
            } catch(e) {
                echo "failure at deploy-docker-image"
                throw e
            }
        }
    } catch(error) {
        err = true
        echo "caught error ${error}"
    }
    if(!err) {
        echo "build and deploy ran successfully"
    }
}```

最新更新