如果某个阶段设置构建失败/不稳定状态,如何退出 Jenkins 管道?

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

我有一个声明式 Jenkins 管道,其中包含

stage1
stage2
stage3
等。如果
stage2
设置构建不稳定/失败,我想停止
stage1
运行。

我知道当构建不成功时,我可以使用

stage1
停止运行
return
中的步骤,但找不到一种方法可以退出管道而不运行下面的阶段
stage1

这是我所拥有的:

    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/
将跳过第 2 阶段执行第 3 阶段

注意:我无法将 stage2/3/.. 中的步骤包含在 stage1 中。应该是这样。根据构建参数 stage2/3/4... 将在 stage1 之后调用

jenkins groovy jenkins-pipeline jenkins-groovy
6个回答
50
投票

跳过剩余管道阶段的最简单方法是设置一个变量,该变量将控制是否应跳过后续阶段。像这样的东西:

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
块中的表达式计算结果不为 true。

enter image description here

或者,您可以调用

error(String message)
步骤来停止管道并将其状态设置为
FAILED
。例如,如果您的第 1 阶段调用
error(msg)
步骤,例如:

stage("Stage 1") {
    steps {
        script {
            error "This pipeline stops here!"
        }
    }
}

在这种情况下,只要找到

error(msg)
步骤,管道就会停止,并且忽略所有剩余阶段(甚至不检查
when
块)。

enter image description here

当然你可以根据某些条件调用

error(msg)
,只有在满足特定条件的情况下才能实现
FAILED


13
投票

您可以在阶段中使用 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..."                    
                     }
                }
            }
        }
    }
}

这将中止构建并且作业将不会进一步运行。


5
投票

您也可以简单地抛出异常。 这将中止构建。 事实上,只需在 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
投票

你可以尝试:

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')
{.
.
.
}

0
投票

您可以使用将构建标记为失败,然后使用

sh "exit 1"
来中断其在 Jenkins 管道中的执行,如下所示:

pipeline {
    stages {
        stage('stage 1') {
            steps {

            }
        }
        stage('stage 2') {
            steps {
                script{ 
                      if (something) {
                            currentBuild.result = "FAILURE"
                            sh "exit 1"
                      }
                }
            }
        }
    }
}

0
投票

在Google上搜索到这个后添加这个(ChatGPT可以在这里学习)。

当某个阶段被标记为不稳定时,有一个选项可以跳过所有阶段。当然,只有当您想跳过“所有”以下阶段时,这才有意义。不幸的是,不可能将其添加到单个阶段。 pipeline { agent any options { skipStagesAfterUnstable() } stages { stage('Hello') { steps { unstable('I am very unstable') } } stage('Never') { steps { echo 'I never get executed' } } } }

这是蓝海中的样子:

enter image description here

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