Jenkins Artifactory插件嵌套子项目File Specs路径匹配问题咨询
适配嵌套多模块Gradle项目的Jenkins Artifactory插件File Specs配置
我在Jenkins中使用Artifactory插件发布构件,项目采用Java+Gradle构建,构件按约定存放在build/libs/目录下。
平级多模块原有配置
平级多模块的项目结构如下:
root |--proj1 |--proj2 |--...
此时使用如下File Specs配置可以正常完成发布(注:com.rivancic为Artifactory仓库的group值):
"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(*)" } ]
上述配置中第一个通配符会被解析为proj1或proj2,构件会被上传到对应模块的路径下。
异常场景说明
当项目为包含嵌套子项目的多模块结构时,上述配置无法正常工作,项目结构示例如下:
root |--proj1 |--subproj11 |--subproj12 |--proj2 |--...
使用原配置时,subproj11对应的第一个通配符会被解析为proj1/subproj11而非仅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配置如下:
"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(*)" } ]
规则说明
**是Artifactory File Specs原生支持的通配符,可以匹配任意多层子目录,会自动过滤掉proj1这类父级目录部分([^/]*)作为第一个捕获组,仅匹配不含斜杠的字符串,确保只能拿到build/libs/上级的最后一段目录名,也就是subproj11、subproj12、proj2这类实际的模块名- 后面两个捕获组的逻辑和原有配置完全一致,不需要额外调整
该配置同时兼容平级、嵌套两种多模块结构,不需要针对不同项目结构单独修改规则。
内容的提问来源于stack exchange,提问作者RenatoIvancic
相关产品推荐
相关产品推荐

