传递地图与使用`body.resolveStrategy = Closure.DELEGATE_FIRST`有什么区别?

时间:2019-03-15 23:28:01

标签: groovy jenkins-pipeline jenkins-groovy

这两个封装管道的示例是通过两种不同的方法获得pipelineParams的,但是尚不清楚为什么一个比另一个更受欢迎。

使用

有什么影响?
def call(body) {
    // evaluate the body block, and collect configuration into the object
    def pipelineParams= [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = pipelineParams
    body()

    pipeline {
        echo pipelineParams.name
    }
}

使用

def call(Map pipelineParams) {
    pipeline {
        echo pipelineParams.name
    }
}

来自https://jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/

的示例代码

1 个答案:

答案 0 :(得分:1)

区别在于,在第一种情况下,使用管道看起来像声明性配置。就DSL而言,这就是所谓的builder strategy

myDeliveryPipeline {
    branch = 'master'
    scmUrl = 'ssh://git@myScmServer.com/repos/myRepo.git'
    ...
}

在第二种情况下,应用管道就像命令式代码一样,即它是常规函数调用:

myDeliveryPipeline(branch: 'master', scmUrl: 'ssh://git@myScmServer.com/repos/myRepo.git', ...)

the official Jenkins doc中也有解释:

  

还有一个使用Groovy的Closure.DELEGATE_FIRST的“生成器模式”技巧,该技巧使Jenkinsfile看起来更像是配置文件而不是程序,但这更复杂且容易出错,因此不推荐。

就我个人而言,我不能说我不建议使用DSL方法。该文档不建议这样做,因为它比较复杂并且容易出错