脚本化和声明性管道之间的詹金斯错误处理

问题描述 投票:0回答:1

我想从脚本化管道中构建许多声明性管道作业,并使用嵌套在父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捕获并回显错误消息,然后将其抛出给父级,父级也将其捕获并回显错误本身。但是,如果构建工作由于不太明确的原因而失败,即映像未正确编译,则父try / catch仍会捕获该错误,并且其行为与前面的示例相同,但是子try / catch不会捕获该错误。 ,并且不会回显其失败消息。

为什么会有差异?是否有由于声明的管道作业失败而导致try / catch块无法捕获的错误?混合使用脚本式和声明式管道是不好的做法吗?对于此方面的任何建议或见解,我将不胜感激。谢谢

jenkins
1个回答
0
投票
您正在使用相同的变量来捕获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" } }```

© www.soinside.com 2019 - 2024. All rights reserved.