【问题标题】:How to mark Jenkins' job stage as skipped, for scripted pipeline对于脚本化管道,如何将 Jenkins 的工作阶段标记为已跳过
【发布时间】:2020-03-25 16:58:08
【问题描述】:

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

when {
  expression {<some boolean expression>}

}

如果表达式的计算结果为 false,则跳过该阶段。

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

java.lang.NoSuchMethodError: No such DSL method 'when' found among steps

错误信息。这是因为声明式管道的 DSL 与 脚本式管道 不同 那么,如何实现呢?

【问题讨论】:

    标签: jenkins jenkins-pipeline


    【解决方案1】:

    解决这个问题需要一点技巧......(别担心,没什么花哨的)

    方法是使用 Jenkins 的模块 that can be found here

    因此,要将阶段标记为已跳过,您需要调用静态方法 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'
      }
    }
    

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

    【讨论】:

    • ..或者您可以允许在 Jenkins 的全局配置中使用此方法
    • 无需取消选中Use Groovy Sandbox 并明确允许使用。此方法现已列入白名单。使用 Jenkins 2.277.2 测试
    • 如果对你更方便,可以不导入,而是指定整个库+方法一起:org.jenkinsci.plugins.pipeline.modeldefinition.Utils.markStageSkippedForConditional('stage name')
    【解决方案2】:

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

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

    stage('Zero') {
        when(BRANCH_NAME != 'master') {
            echo 'Performing steps of stage Zero'
        }
    }
    

    【讨论】:

    • 感谢您的回答。正如我所说,when 块在脚本化管道下不可用。它仅在声明式管道下可用。
    • @SagiForbes 他使用脚本化管道的实现。
    • 在脚本化管道中使用时会抛出 NoSuchMethodError。 (java.lang.NoSuchMethodError:没有找到这样的 DSL 方法“何时”)。共享库方法可能会有所帮助:comquent.de/en/skipped-stages-in-jenkins-scripted-pipeline
    【解决方案3】:

    声明式管道中,您可以使用:

    stage('deploy') {
            when {  <some boolean expression> }
    ......
    }
    

    脚本化管道中,您可以使用:

    if(<some boolean expression>) {
    stage('deploy') {
    ......
       }
    }
    

    以上都可以正常工作。我测试过

    【讨论】:

    • 您提到的脚本选项会删除所有先前作业运行的可视化,并且不会将该步骤标记为已跳过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多