Разница в том, что в первом случае использование конвейера выглядит как декларативная конфигурация. Это так называемая стратегия построения в терминах 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. Док не рекомендует этого, потому что он немного сложнее и может быть подвержен ошибкам