对于脚本化管道,如何将 Jenkins 的作业阶段标记为已跳过

Sag*_*bes 8 jenkins jenkins-pipeline

使用脚本化管道时如何将阶段标记为已跳过。我在声明性管道中跳过一个阶段没有问题。我刚设置

when {
  expression {<some boolean expression>}

}
Run Code Online (Sandbox Code Playgroud)

如果表达式的计算结果为 false,则跳过该阶段。 在此处输入图片说明

问题是,如果您尝试使用脚本化管道执行此操作,您会得到:

java.lang.NoSuchMethodError: No such DSL method 'when' found among steps
Run Code Online (Sandbox Code Playgroud)

错误信息。这是因为声明式管道的 DSL 与脚本式管道不一样, 那么,怎么做呢?

Sag*_*bes 13

解决这个问题需要一点点hacking...(别担心,没什么特别的)

这样做的方法是使用 Jenkins 的模块,可以在这里找到

因此,要将阶段标记为已跳过,您需要调用静态方法markStageSkippedForConditional传递您要跳过的阶段的名称。

假设您有一个名为“mystage”的舞台。并且您想跳过它并将其标记为“已跳过”。您的代码应该类似于:

import org.jenkinsci.plugins.pipeline.modeldefinition.Utils

node() {
  stage('a'){
    echo 'stage 1'
  }
  stage('mystage'){
    if(true){
       echo 'skipping stage...'
       Utils.markStageSkippedForConditional('mystage')
    }else{
      echo 'This stage may be skipped'

    }
  }
  stage('b'){
    echo 'stage 2'
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须取消选中Use Groovy Sandbox复选框,因为 Utils 方法受到限制。

  • 无需取消选中“使用 Groovy Sandbox”并明确允许使用。此方法现已列入白名单。使用 Jenkins 2.277.2 进行测试 (3认同)
  • ..或者您可以允许在 Jenkins 的全局配置中使用此方法 (2认同)

Ste*_*ing 11

您可以在comquent/imperative-when 中找到一个实现(以共享管道步骤的形式)在 GitHub 上的。

这允许以Utils.markStageSkippedForConditional一种很好的方式访问您发现自己的方法,如下所示:

stage('Zero') {
    when(BRANCH_NAME != 'master') {
        echo 'Performing steps of stage Zero'
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在脚本化管道中使用when将抛出NoSuchMethodError。(java.lang.NoSuchMethodError:“当”找不到这样的 DSL 方法)。共享库方法可能会有所帮助:https://comquent.de/en/skipped-stages-in-jenkins-scripted-pipeline/ (3认同)