一尘不染

我可以使用Closure在Jenkins声明性管道中定义阶段吗?

jenkins

我正在尝试做这样的事情:

def makeStage = {
  stage('a') {
    steps {
      echo 'Hello World'
    }
  }
} 
pipeline {
  agent none
  stages {
    makeStage()
  }
}

但这给了我这个例外:

WorkflowScript: 11: Expected a stage @ line 11, column 5.
   makeStage()
   ^

是否可以将阶段定义为外部闭包?


阅读 344

收藏
2020-07-25

共1个答案

一尘不染

您不能在声明式管道之外定义阶段。声明性管道的主要目的是提供经过简化且自以为是的语法,因此您可以专注于应该做什么(通过使用一些可用的步骤)而不是如何去做。

如果您对更灵活的管道实现方式感兴趣,可以选择“
脚本化管道”方法,该语法在语法方面并不严格-仅受Groovy和CPS执行模块的限制。

您的示例中的工作(脚本)管道如下所示:

#!groovy

def makeStage = {
  stage('a') {
    echo 'Hello World'
  }
}

node {
    makeStage()
}

注意 :脚本化管道中没有任何steps方法stage。如果你把它留在那里

java.lang.NoSuchMethodError: No such DSL method 'steps' found among
    steps [archive, bat, build, catchError, checkout, deleteDir, dir,
    dockerFingerprintFrom, ...

声明式管道中的脚本

声明性管道定义了一个script步骤,可让您放置一段脚本化管道。但是,它仍然不允许您动态定义阶段或/和将阶段定义提取到函数或闭包中。scriptstep在舞台内部执行,因此无论舞台是否执行,您都无法在此块内进行控制。但是,在某些情况下,如果您想做一些比仅调用声明性管道的预定义步骤更复杂的操作,则此步骤可能非常有用。

2020-07-25