Как правильно обернуть функцию плагина Jenkins, такую ​​как copyArtifacts? - PullRequest
1 голос
/ 03 марта 2020

Я должен обернуть некоторые шаги Дженкинса в выделенные функции, одна из них - copyArtifacts

Вот некоторые из них делают c об этой функции, она перечисляет все ее параметры, но не содержит значений по умолчанию для опциональных параметры: https://jenkins.io/doc/pipeline/steps/copyartifact/

Обычный способ вызова функции copyArtifacts заключается в следующем:

copyArtifacts projectName: "myJenkinsJob", filter: "*.pdf", excludes: "iAmUseless.pdf", flatten: false

Один из способов обернуть его в функцию, допуская тот же синтаксис вызова следующий:

void myCopyArtifacts(Map<String, Object> parameters) {
   ...
}

Самое интересное в том, чтобы фактически реализовать обертку. Поскольку я не могу реализовать все возможные комбинации аргументов, мне приходится анализировать их вручную по одному и присваивать им значение по умолчанию (которое в этом случае я могу найти в исходном коде, но не всегда). А затем вызовите функцию плагина.

Это не очень практично, подвержено ошибкам и не подлежит обслуживанию. Наивно я думал, что из-за способа, которым groovy может получать Карты, будет работать следующее:

void myCopyArtifacts(Map<String, Object> parameters) {
   currentWorkflowScript.copyArtifacts(parameters)
}

Но это не так.

Так есть ли правильный способ сделать это?

Для тех, кто интересуется, если мы делаем это для целей модульного тестирования с помощью Mockito, нам нужно было обернуть функции, которые нужно смоделировать, и в то же время воспользоваться возможностью ограничить и контролировать использование, которое может быть сделано с ними.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Как zett42 упомянул то, что я сделал, и объяснил, что в моем первом посте фактически работает отлично. Я попытаюсь найти время для go в моей истории git и найти ошибку, с которой я столкнулся в первый раз, но правильный ответ для переноса шагов Дженкинса следующий:

void myCopyArtifacts(Map<String, Object> parameters) {
   currentWorkflowScript.copyArtifacts(parameters)
}
0 голосов
/ 04 марта 2020

Это работает, если правильно настроено:

void myCopyArtifacts(Map params) {
   copyArtifacts projectName: params.projectName, 
                 filter: params.filter, 
                 excludes: params.excludes, 
                 flatten: params.flatten
}

Затем вы можете сделать:

myCopyArtifacts projectName: "myJenkinsJob", 
                filter: "*.pdf", 
                excludes: "iAmUseless.pdf", 
                flatten: false,
                extra_parameter: "will not be used"

или

def myParams = [:]
myParams.projectName = "myJenkinsJob"
myParams.filter = "*.pdf"
// etc., finally
myCopyArtifacts(myParams)
...