我想从脚本管道中构建许多声明的管道作业,并用嵌套在父母的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"
}
}```