В чем разница между передачей карты и использованием `body.resolveStrategy = Closure.DELEGATE_FIRST` - PullRequest
3 голосов
/ 16 марта 2019

Эти два примера инкапсулированных конвейеров получают свои 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 Ответ

3 голосов
/ 16 марта 2019

Разница в том, что в первом случае использование конвейера выглядит как декларативная конфигурация. Это так называемая стратегия построения в терминах DSL:

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

Тогда как во втором случае применение конвейера выглядит как императивный код, то есть это обычный вызов функции:

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

Есть также объяснение в официальном документе Дженкинса :

Существует также трюк с «шаблоном построения», использующий Groovey Closure.DELEGATE_FIRST, который позволяет Jenkinsfile выглядеть немного больше как файл конфигурации, чем как программа, но это более сложный и подверженный ошибкам и не рекомендуется.

Лично я не могу сказать, что я не рекомендую подход DSL. Док не рекомендует этого, потому что он немного сложнее и может быть подвержен ошибкам

...