我有一个声明性的Jenkins管道,其中包含stage1
,stage2
,stage3
等。如果stage2
设置构建不稳定/失败,我想停止运行stage1
。
我知道我可以在构建不成功但无法找到stage1
中的步骤的情况下使用return
来运行stage1
,但是我无法找到一种无需退出{ {1}}
这是我所拥有的:
stage('stage1') {
steps {
script{
//somesteps
if ("${stdout}" == "1"){
currentBuild.result = 'UNSTABLE'
return
} //if
//somesteps
} //script
} //steps
} //stage
// run only when stage1 is success
stage('stage2'){
when {
expression {
params.name ==~ /x|y/
}
}
steps {
script{
//stage2 steps
}
}
}
如果要执行params.name ==~ /z/
阶段3,则跳过阶段2
注意:我不能在stage1 / 3 / ..中包括步骤1。应该是那样的。根据构建参数,stage2 / 3/4 ...将在stage1之后调用
答案 0 :(得分:5)
跳过剩余管道阶段的最简单方法是设置一个变量,该变量将控制是否应跳过后面的阶段。像这样:
def skipRemainingStages = false
pipeline {
agent any
stages {
stage("Stage 1") {
steps {
script {
skipRemainingStages = true
println "skipRemainingStages = ${skipRemainingStages}"
}
}
}
stage("Stage 2") {
when {
expression {
!skipRemainingStages
}
}
steps {
script {
println "This text wont show up...."
}
}
}
stage("Stage 3") {
when {
expression {
!skipRemainingStages
}
}
steps {
script {
println "This text wont show up...."
}
}
}
}
}
这是一个非常简单的示例,它在skipRemainingStages
处将Stage 1
设置为true,并且Stage 2
和Stage 3
被跳过,因为when
块中的表达式不求值真实。
或者,您可以调用error(String message)
步骤来停止管道并将其状态设置为FAILED
。例如,如果您的阶段1调用error(msg)
步骤,例如:
stage("Stage 1") {
steps {
script {
error "This pipeline stops here!"
}
}
}
在这种情况下,只要找到error(msg)
步骤,流水线就会停止,而所有其余阶段都将被忽略(甚至不会检查when
块)。
当然,只有在满足特定条件的情况下,您才能根据特定条件调用error(msg)
使其成为FAILED
。
答案 1 :(得分:1)
您也可以简单地引发Exception。这将中止构建。 实际上,只需在catch子句中设置构建状态就可以很好地工作。 然后,您还可以在finally块中添加自定义逻辑,以发送有关构建状态更改(电子邮件,Slack消息等)的通知
所以也许像下面这样。注意:我已经从现有的Jenkinsfile复制了其中的一些内容。因此,不能100%确定这与您使用的语法相同:
pipeline {
try {
stages {
stage("stage1") {
if (something) {
throw new RuntimeException("Something went wrong")
}
}
stage("stage2") {
}
}
} catch (e) {
currentBuild.result = "FAILED"
throw e
}
}
答案 2 :(得分:1)
您可以在阶段中使用post退出,如下所示:
pipeline {
stages {
stage('stage 1') {
steps {
//step 1
}
}
stage('stage 2') {
steps {
script{
//step 2
}
}
post{
success {
}
failure {
script{
sh "exit 1"
//or
error "Failed, exiting now..."
}
}
aborted {
}
unstable {
script{
sh "exit 1"
//or
error "Unstable, exiting now..."
}
}
}
}
}
}
这将中止构建,并且作业将无法继续运行。
答案 3 :(得分:0)
您可以尝试:
stage('Set skipRemainingStages variable which decides, whether to run next stages or not') {
steps {
script {
skipRemainingStages = true
try {
println("In if block")
skipRemainingStages = true
}
catch (Exception exc) {
println("Exception block: ${exc}")
skipRemainingStages = false
}
if (skipRemainingStages) {
currentBuild.result = 'FAILURE'
error("Stopping early!")
}
}
}
}
stage('This will not execute if skipRemainingStages=true')
{.
.
.
}