Can I use a Closure to define a stage in a Jenkins Declarative Pipeline?

后端 未结 2 1910
死守一世寂寞
死守一世寂寞 2020-12-10 08:11

I\'m trying to do something like this:

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


        
2条回答
  •  借酒劲吻你
    2020-12-10 08:57

    You can't define stages outside the declarative pipeline. The main purpose of declarative pipeline is to provide simplified and opinionated syntax so you can focus on what should be done (by using some of the available steps) and not how to do it.

    If you are interested in more flexible way of implementing pipeline, you may choose Scripted Pipeline approach which is not that strict if it comes to the syntax - it's only limited by Groovy and CPS execution module.

    Working (scripted) pipeline from your example would look like this:

    #!groovy
    
    def makeStage = {
      stage('a') {
        echo 'Hello World'
      }
    } 
    
    node {
        makeStage()
    }
    

    Attention: There is no steps method inside stage in a scripted pipeline. If you leave it there you will get

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

    Scripts in declarative pipeline

    Declarative pipeline defines a script step that allows you to put a block of scripted pipeline. However it still does not allow you to define stage dynamically or/and extract stage definition to a function or closure. script step gets executed inside the stage so you can't control inside this block if stage is executed or not. In some cases however this step might be very useful if you want to do something more complex than just calling pre-defined step of a declarative pipeline.

提交回复
热议问题