我正在尝试做这样的事情:
def makeStage = { stage('a') { steps { echo 'Hello World' } } } pipeline { agent none stages { makeStage() } }
但这给了我这个例外:
WorkflowScript: 11: Expected a stage @ line 11, column 5. makeStage() ^
是否可以将阶段定义为外部闭包?
您不能在声明式管道之外定义阶段。声明性管道的主要目的是提供经过简化且自以为是的语法,因此您可以专注于应该做什么(通过使用一些可用的步骤)而不是如何去做。
如果您对更灵活的管道实现方式感兴趣,可以选择“ 脚本化管道”方法,该语法在语法方面并不严格-仅受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, ...
注意 :脚本化管道中没有任何steps方法stage。如果你把它留在那里
steps
stage
java.lang.NoSuchMethodError: No such DSL method 'steps' found among steps [archive, bat, build, catchError, checkout, deleteDir, dir, dockerFingerprintFrom, ...
声明性管道定义了一个script步骤,可让您放置一段脚本化管道。但是,它仍然不允许您动态定义阶段或/和将阶段定义提取到函数或闭包中。scriptstep在舞台内部执行,因此无论舞台是否执行,您都无法在此块内进行控制。但是,在某些情况下,如果您想做一些比仅调用声明性管道的预定义步骤更复杂的操作,则此步骤可能非常有用。
script