Jenkins 管道:检测阶段是否以 "Restart from stage" 图标开始

Jenkins pipeline: detect if a stage is started with the "Restart from stage" icon

假设我有一个声明性管道。我只想在 'Restart from stage' 图标被使用时 运行 一个舞台?

有没有办法做到这一点(一个方法,一个变量...)?我想 运行 仅当使用“从舞台重新启动”时

stage('Test') {
    when {
        expression {
            // An expression to detect if Restart from this stage is used
         }
    }
    steps {
        sh 'echo 1'
    }
}

您可以定义一个全局变量,该变量将保存一个布尔值,表示管道是从开始执行还是从特定阶段执行,在第一阶段更新它并稍后在 when 中使用它确定是否发生 从阶段 重新启动的条件。
类似于:

RESTART = true

pipeline {
    agent any

    stages {
        stage('Setup') {
            steps {
                script{
                    // signaling pipeline was executed from the beginning (first stage)
                    RESTART = false
                }
                // other setup steps
            }
        }
        stage('Test') {
            when {
                expression { return RESTART }
            }
            steps {
                sh 'echo 1'
            }
        }
    }
}

基于@Pamela 对使用 cause 条件的回答的另一个不错的选择是在 when directive 中使用内置的 triggeredBy 选项,从而避免使用 getBuildCauses() 并且需要过滤所有原因,并立即获取条件。
类似于:

stage('Test') {
   when { triggeredBy 'RestartDeclarativePipelineCause' }
   steps {
      sh 'echo 1'
   }
}

您可以使用currentBuild.getBuildCauses()https://www.jenkins.io/doc/pipeline/examples/#get-build-cause

然后,在您的测试阶段添加when表达式检查构建的原因是否与您需要的相匹配。

stage('Test') {
    when {
        expression {
            return currentBuild.getBuildCauses().any { cause ->
            cause._class == 'org.jenkinsci.plugins.pipeline.modeldefinition.causes.RestartDeclarativePipelineCause'
            }
        }
    }
    steps {
        sh 'echo 1'
    }
}