【发布时间】:2020-03-03 18:37:11
【问题描述】:
我必须在专用函数中封装一些 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 进行单元测试,我们需要包装要模拟的函数,同时我们借此机会限制和控制可以用它们完成的用法.
【问题讨论】:
-
您在执行
currentWorkflowScript.copyArtifacts(parameters)时收到什么样的错误? -
至少在管道脚本中这是有效的:
def args = [label: 'foo', script: 'echo "bar"']; sh(args)。所以实际上可以使用单个 map 参数而不是单个参数来调用步骤。
标签: jenkins groovy jenkins-pipeline shared-libraries jenkins-groovy