在哪里放置try / catch以便它可以按预期工作,特别是在并行分支存在时工作? (另外,蓝海洋插件也在那里)
在关于Jenkinsfile的官方文档中,没有明确说明这个主题,但是例子确实存在:
示例1:尝试在舞台块内
Jenkinsfile (Scripted Pipeline)
node {
stage('Example') { //It's inside the stage block
try {
sh 'exit 1'
}
catch (exc) {
echo 'Something failed, I should sound the klaxons!'
throw
}
}
}
示例2:尝试在节点块内
Jenkinsfile (Scripted Pipeline)
stage('Build') {
/* .. snip .. */
}
stage('Test') {
parallel linux: {
node('linux') {
checkout scm
try {
unstash 'app'
sh 'make check'
}
finally {
junit '**/target/*.xml'
}
}
},
windows: {
node('windows') {
/* .. snip .. */
}
}
}
所以特别是在我的情况下,它是否以这种方式工作(它是最外面的块)?基本上,它是嵌套的并行构建。我观察到,有时当其中一个分支失败时,整个构建会继续,并且管道图表仍然是绿色在蓝色海洋中:(如果try / catch以这种方式工作,那么我可以努力实现其他可能性)< / p>
try{
parallel 'b0': {
node('parallel'){
....
}
}, 'b1': {
node('parallel'){
....
}
}, 'b2': {
parallel 'b2-0': {
node('parallel'){
....
}
}, 'b2-1': {
node('parallel'){
....
}
}, failFast: true
parallel 'anotherb0': {
node('parallel'){
.....
}
}, 'anotherb1': {
node('parallel'){
....
}
}, failFast: true
}, failFast: true
}catch(err){
print err
currentBuild.result = 'FAILURE'
}finally{
}
答案 0 :(得分:0)
建议使用声明性管道而不是脚本化管道。
您将专注于编写要使用的每个插件提供的特定管道语法支持。每个人都有相似但特定的语法来实现其特定目的。
那表示有时候您必须在脚本块中写一些小的脚本。我从来没有尝试过,如果您遵循每个插件提供的语法支持(应该在插件站点上单独记录每个语法),您将永远不需要这样做。
pipeline {
stages {
stage ("Do Something") {
steps {
bat "..."
script {
//Code that requires a script tag to be present if it can't be done by a plugin's native pipeline support.
}
}
}
}
}