【问题标题】:How to properly wrap a Jenkins plugin function such as copyArtifacts?如何正确包装 Jenkins 插件功能,例如 copyArtifacts?
【发布时间】: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


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

    正如zett42 提到我所做的并解释说,在我的第一篇文章中实际上效果很好。我会试着找时间回到我的 git 历史并找到我第一次遇到的错误,但包装 Jenkins 步骤的正确答案如下:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多