jenkins - 如何正确包装 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 进行单元测试,我们需要包装要模拟的函数,同时我们借此机会限制和控制可以用它们完成的用法。
解决方案
如果配置正确,这将起作用:
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)
推荐阅读
- firebase - 我将 firebase 添加到我的统一项目中并构建失败
- ubuntu - 我可以在 Ubuntu 虚拟机上安装应用程序吗?
- java - 如何仅使用数据库信息在 JFreeChart 中制作图表?
- javascript - 在将对象键添加到异步生成的对象时遇到问题
- ios - iOS 使用 Open App Link 或 Deep Link 选项分享 Instagram 故事
- angular - scheduler-kendo 日历在 angular9 中可见同时可见
- php - php:根据是否存在的键对多维数组进行排序
- java - 查询语法与 MySQL 相同,有 2 个参数,可以吗?
- r - 由内而外的阴谋旭日?(r/闪亮)
- rest - REST API 合约定义和 Spring Security