复制到另一个存储库时,无法通过内部版本号或LATEST解析工件

时间:2017-01-18 19:23:37

标签: jenkins jenkins-plugins artifactory

指定分辨率详细信息时,我们在使用 Jenkins Artifactory插件时遇到了困难已解决的工件(需要Artifactory Pro)(我将此值称为 Artifactory-query-string )。

在这种情况下,我们对Artifactory的使用是拉取现有模块(Artifactory中的单个ZIP文件),我们希望使用特定内部版本号或抽象请求检索该特定模块' 最新'建立。

当我们想要的模块/工件只存在于一个存储库中时,我们可以得到我们想要的结果。但是,在一个模块的特定BUILD#被提升之后#39; (通过Artifactory中的简单复制操作)然后我们无法找到“推广的”#39;它被复制到的存储库中的工件。

工具/版本

  • Jenkins(2.7.2)
  • Artifactory Pro(4.11.2)
  • Jenkins的Artifactory插件(2.6.0)
  • 通用套餐类型使用' simple-default' Artifactory中的布局

背景

最近我们引入了Jenkins Build#作为工件的属性和工件文件名的一部分。

我们能够找到的唯一信息来源,其中包含详细信息' Artifactory-query-string'是通过输入区旁边的问号图标提供的帮助信息。

我们对此帮助文本的解释表明:

  • 如果想要通过 build_number (或' LATEST')进行检索,则还必须指定 build_name 值,换句话说,这两个值是相互依赖的

工作案例

以这种方式使用此功能时(仅在一个存储库中 - 称为 DEV ),一切都按预期工作。我们能够成功填写“最新”的请求。或者使用 build_number 参数的特定内部版本号,只要我们还指定 build_name

Artifactory tree

  • DEV (存储库)
    • somePath (路径)
      • myApplication-build-100.zip build_number: 100 build_name: myJenkinsBuildJob
      • myApplication-build-101.zip build_number: 101 build_name: myJenkinsBuildJob
      • myApplication-build-102.zip build_number: 102 build_name: myJenkinsBuildJob

Artifactory的查询字符串
$DEV:somePath/myApplication*.zip@myJenkinsBuildJob#$LATEST=>.\someFolder

Artifactory-query-string 将正确返回单个工件:myApplication-build-102.zip

失败案例

然而,在其中一个版本被推广之后#39;通过Artifactory中的简单COPY操作到另一个存储库,例如 QA ,我们无法弄清楚如何利用这个相同的功能来对抗刚刚复制工件的 QA 存储库(& #39;促进&#39)。换句话说,我们无法找到'复制/'升级'存储库中复制到它的工件。

Artifactory tree

  • DEV (存储库)
    • somePath (路径)
      • myApplication-build-100.zip build_number: 100 build_name: myJenkinsBuildJob
      • myApplication-build-101.zip build_number: 101 build_name: myJenkinsBuildJob
      • myApplication-build-102.zip build_number: 102 build_name: myJenkinsBuildJob
  • QA (存储库)
    • somePath (路径)
      • myApplication-build-102.zip build_number: 102 build_name: myJenkinsBuildJob (已从DEV复制/'升级'库)

Artifactory的查询字符串
使用相同的&Artifactory-query-string'和以前一样但是指定 QA 存储库而不是 DEV

$QA:somePath/myApplication*.zip@myJenkinsBuildJob#$LATEST=>.\someFolder

然后Jenkins的Artifactory插件永远不会返回/找到任何东西:

Jenkins Artifactory Plugin version: 2.6.0
Beginning to resolve Build Info dependencies.
Finished resolving Build Info dependencies.
Beginning to resolve Build Info build dependencies.
Dependency on build [myJenkinsBuildJob], number [LATEST], pattern [QA:somePath/myApplication*.zip] - [0] results found.

有趣的是,如果我们删除 DEV 存储库中的原始工件,则针对 QA 的查询可以正常工作。

观察到的行为似乎表明给定的工件(基于文件名,构建#和构建名称)只能在一个存储库中定位/查询(解析),如果您将工件复制到另一个存储库,它将是'隐藏'或忽略此类查询。

这不是我们预期的行为。我们希望每个存储库与其他存储库是分开的,并且针对一个存储库的查询不应该考虑任何其他存储库的任何内容 - 并且我们应该能够在存储库中找到/查找/解析复制的模块到。

有谁能建议我在这里缺少什么?我的期望是错的吗?

2 个答案:

答案 0 :(得分:5)

这是一个带有构建信息的known issue,因为它仅通过校验和引用工件。如果移动工件而不是复制工件,它将从正确的路径解析。

答案 1 :(得分:3)

自Jenkins Artifactory插件版本2.9.0起,file specs支持retrieving artifacts by build 在这个新的实现中,您的方案可行。
您的下载规范应如下所示:

{
  "files": [    
    {
      "pattern": "${QA}/somePath/myApplication*.zip",
      "target": "someFolder/",
      "build" : "myJenkinsBuildJob/LATEST",
      "flat": "false",
      "recursive": "true"
    }
  ]
}