Wil*_*ode 9 groovy closures jenkins jenkins-pipeline
我正在尝试做这样的事情:
def makeStage = {
stage('a') {
steps {
echo 'Hello World'
}
}
}
pipeline {
agent none
stages {
makeStage()
}
}
Run Code Online (Sandbox Code Playgroud)
但它给了我这个例外:
WorkflowScript: 11: Expected a stage @ line 11, column 5.
makeStage()
^
Run Code Online (Sandbox Code Playgroud)
是否可以将阶段定义为外部闭包,如果可以 - 如何定义?
Joh*_*ynh 11
太晚了,但如果有人遇到这个问题,一个可能的解决方案是将生成的阶段包装在一个脚本声明中并.call
在生成的阶段上调用。
所以对你来说:
def makeStage = {
return {
stage('a') {
echo 'Hello World'
}
}
}
pipeline {
agent none
stages {
stage ('hello world') {
steps {
script {
makeStage().call()
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
哎呀。编辑后,我在 makeStage 声明中的舞台('a')上有“步骤”。“steps”是一个声明性管道指令,因此它在脚本块内抛出错误。
您不能在声明性管道之外定义阶段。声明式管道的主要目的是提供简化和自以为是的语法,以便您可以专注于应该做什么(通过使用一些可用的步骤)而不是如何去做。
如果您对更灵活的管道实现方式感兴趣,您可以选择脚本化管道方法,它在语法上并不那么严格 - 它仅受 Groovy 和 CPS 执行模块的限制。
您示例中的工作(脚本化)管道如下所示:
#!groovy
def makeStage = {
stage('a') {
echo 'Hello World'
}
}
node {
makeStage()
}
Run Code Online (Sandbox Code Playgroud)
注意:脚本管道中没有
steps
内部方法stage
。如果你把它留在那里,你会得到Run Code Online (Sandbox Code Playgroud)java.lang.NoSuchMethodError: No such DSL method 'steps' found among steps [archive, bat, build, catchError, checkout, deleteDir, dir, dockerFingerprintFrom, ...
声明式管道定义了一个script
步骤,允许您放置一个脚本管道块。但是,它仍然不允许您动态定义阶段或/和将阶段定义提取到函数或闭包中。script
step 在舞台内执行,因此您无法在此块内控制舞台是否执行。但是,在某些情况下,如果您想做一些比仅调用声明性管道的预定义步骤更复杂的事情,则此步骤可能非常有用。