我想通过脚本化管道构建许多声明性管道作业,并使用嵌套在父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块无法捕获的错误?混合使用脚本式和声明式管道是不好的做法吗?对于此方面的任何建议或见解,我将不胜感激。谢谢