首页 > 解决方案 > 带有子项目的 Jenkins Artifactory 插件文件规范

问题描述

我正在使用带有Artifactory 插件的 Jenkins来发布工件。

我使用 Java 和 Gradle 构建应用程序。按照惯例,工件位于build/libs/文件夹中。如果我有多模块项目,则使用指定的文件规范发布。

root
|--proj1
|--proj2
|--...

File Specs 模式看起来像(注意 com.rivancic 是 Artifactory 存储库的组):

"files": [
  {
    "target": "test-repo/com/rivancic/{1}/1.0.0/{2}-1.0.0{3}",
    "pattern": "/home-dir/com/rivancic/(*)/build/libs/(*)-1.0.0(*)"
  }
]

此处将第一个通配符解析为proj1orproj2并将工件上传到特定模块。

问题

我面临的问题是在将多模块项目与嵌套项目一起使用时。

root
|--proj1
   |--subproj11
   |--subproj12
|--proj2
|--...

现在对于第一个 subproject11 使用相同的模式,第一个通配符被解析为proj1/subproj11而不是 only subproj11。这解决了无效的工件模块名称和 Artifactory 抛出异常

java.lang.RuntimeException: java.io.IOException: Failed to deploy file. Status code: 409 Response message: Artifactory returned the following errors: 
The target deployment path 'com/rivancic/project1/subproject11/1.0.0/subproject11-1.0.0.pom' does not match the POM's expected path prefix 'com/rivancic/subproject11/1.0.0'. Please verify your POM content for correctness and make sure the source path is a valid Maven repository root path. Status code: 409

有没有一种方法可以在 File Specs 中定义一个模式,它总是只采用路径的最后一部分,即最终的子项目,而不是上述结构的整个路径

标签: javajenkinsartifactory

解决方案


您可以使用 2 个不同的文件规范或 2 个不同的文件规范组:一个用于多模块,另一个用于多个项目。

对于多项目,请使用以下示例:

"files": [
  {
    "target": "test-repo/com/rivancic/{1}/1.0.0/{2}-1.0.0{3}",
    "pattern": "/home-dir/com/rivancic/*/(*)/build/libs/(*)-1.0.0(*)"
  }
]

说明 - 在/*/(*)规范的一部分中,第一个星号被解析为常规通配符,被括号包围的星号用作占位符

有关文件规范的更多信息,请参见使用文件规范


推荐阅读