首页 > 解决方案 > 如何正确包装 Jenkins 插件功能,例如 copyArtifacts?

问题描述

我必须在专用函数中包装一些 Jenkins 步骤,其中之一是 copyArtifacts

这是关于这个函数的一些文档,它列出了它的所有参数,但没有可选参数的默认值: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 可以接收 Maps 的方式,以下方法会起作用:

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

但事实并非如此。

那么有没有合适的方法呢?

对于那些想知道的人,如果我们这样做是为了使用 Mockito 进行单元测试,我们需要包装要模拟的函数,同时我们借此机会限制和控制可以用它们完成的用法。

标签: jenkinsgroovyjenkins-pipelineshared-librariesjenkins-groovy

解决方案


如果配置正确,这将起作用:

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)

推荐阅读