Artifactory 409工件部署期间快照发布处理策略中的冲突

Artifactory 409工件部署期间快照发布处理策略中的冲突,artifactory,Artifactory,我们有一组文件要部署到artifactory,特别是测试结果。由于快照发布处理策略中存在冲突,匹配以下模式的文件似乎始终会生成一个409拒绝工件的解决方案。该文件的格式为abcxyz test results.json。我们还有其他的结果文件,它们只是testresults.json,可以很好地上传。值得注意的是,在遇到409之前,所有其他工件都会成功上载 我们的存储库使用maven-2-default存储库布局。include regex设置为***,我们不定义任何排除。我的下一步是增加Art

我们有一组文件要部署到artifactory,特别是测试结果。由于快照发布处理策略中存在冲突,匹配以下模式的文件似乎始终会生成一个
409拒绝工件的解决方案。该文件的格式为
abcxyz test results.json
。我们还有其他的结果文件,它们只是
testresults.json
,可以很好地上传。值得注意的是,在遇到409之前,所有其他工件都会成功上载

我们的存储库使用maven-2-default存储库布局。include regex设置为
***
,我们不定义任何排除。我的下一步是增加Artifactory在遇到此错误时生成的日志的详细程度,但我不确定这是否会有成效


我不知道这个文件违反的快照处理策略是什么。任何关于我可以采取哪些调试步骤或实际冲突可能是什么的想法都将不胜感激。

您正在尝试将快照工件部署到发布库。您需要配置存储库以处理快照工件。请参阅所附图片

为将来偶然发现这个问题的读者

和魔术短语(s)

由于快照发布处理策略中存在冲突

如果要发布到简单版本,很可能是这样:

String repoKeyValue = version.endsWith('SNAPSHOT') ? 'libs-snapshot-local' : 'libs-release-local'
String repoKeyValue = version.contains('SNAPSHOT') ? 'MyCustomRepository-Snapshots/com/mycompany/mypackagename1/mypackagename2/' : 'MyCustomRepository-Releases/com/mycompany/mypackagename1/mypackagename2/'
[pool-1-thread-1] Deploying artifact: https://somewhere.com/artifactory/MY-Snapshots/com/mycompany/mypackagenameNotQuiteRight999/myPackageNameNotQuiteRight888/1.0-SNAPSHOT/myPackageNameNotQuiteRight888-1.0-SNAPSHOT.jar
Failed to upload file
那么您可能不会得到这个错误

但是,如果您试图发布到公司范围内的全尺寸工件实现,则可能会发布到类似以下内容的内容:

String repoKeyValue = version.endsWith('SNAPSHOT') ? 'libs-snapshot-local' : 'libs-release-local'
String repoKeyValue = version.contains('SNAPSHOT') ? 'MyCustomRepository-Snapshots/com/mycompany/mypackagename1/mypackagename2/' : 'MyCustomRepository-Releases/com/mycompany/mypackagename1/mypackagename2/'
[pool-1-thread-1] Deploying artifact: https://somewhere.com/artifactory/MY-Snapshots/com/mycompany/mypackagenameNotQuiteRight999/myPackageNameNotQuiteRight888/1.0-SNAPSHOT/myPackageNameNotQuiteRight888-1.0-SNAPSHOT.jar
Failed to upload file
那么问题是什么呢

当您使用此配置(就在下面)发布时(本问题后面的配置的完整上下文:

        publishBuildInfo = true
        publishPom = true
Artifactory正在检查..以确保.pom的内容与您的总体发布路径名称一致

黑客修复:(代码正下方)

真正的解决办法是协调com.mycompany.mypackage……blah.blah.blah名称,以便人工命名一致性检查正确通过。

 The repository 'MyCustomRepository-Snapshots' rejected the resolution of an artifact 'MyCustomRepository-Snapshots:com/mycompany/mypackagenameNotQuiteRight999/myPackageNameNotQuiteRight888/my-thing-impl/1.0.60-SNAPSHOT-1601111703114/my-thing-impl-1.0.60-SNAPSHOT-1601111703114.jar' 

due to conflict in the snapshot release handling policy. Status code: 409
因此,如果您试图发布到,则会出现上述错误(请参阅上面的变量repoKeyValue)

“MyCustomRepository快照/com/mycompany/mypackagename1/mypackagename2/”

因为(这是理解的关键)…在“com/mycompany/mypackagename1/mypackagename2/”和“com/mycompany/mypackagenameNotQuiteRight999/myPackageNameNotQuiteRight888/”之间存在差异

以上句子是解决问题的关键。

 The repository 'MyCustomRepository-Snapshots' rejected the resolution of an artifact 'MyCustomRepository-Snapshots:com/mycompany/mypackagenameNotQuiteRight999/myPackageNameNotQuiteRight888/my-thing-impl/1.0.60-SNAPSHOT-1601111703114/my-thing-impl-1.0.60-SNAPSHOT-1601111703114.jar' 

due to conflict in the snapshot release handling policy. Status code: 409
Artifactory(当publishPom和publishBuildInfo设置为true时)来检查一致性…(据我所知)

下面是魔法属性更完整的上下文。 注意,我有一个多模块gradle项目,我不想发布根项目。#MonolithsareHarry

(下面是我的root build.gradle文件)

下面是我的一个module build.gradle文件(它们看起来都一样)

我发现,我把出版物保存得越简单(例如:“myPublicationNameOne”),当我以一种协调的方式使它工作时,我就越理智

// the "name" variable inside the publications/myPublicationName block is getting overwritten.  so create a variable here to capture the name (as the artifactid)

def artifactIdForPublicationBlockHolder = "${name}"


dependencies {
    testImplementation group: 'junit', name: 'junit', version: junitVersion
}

println("hey.there.myPublicationNameOne")
println("group=${group}")
println("version=${version}")
println("artifactId=${name}")


publishing {
    publications {
        myPublicationNameOne(MavenPublication) {
            // groupId, artifactId and version have defaults, so do not arbitrarily override : https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven:publications
            artifact "./build/libs/${artifactIdForPublicationBlockHolder}-${version}.jar"
        }
    }
}
奖励材料:

请参阅关于publicationName的内容(如果您是第一次学习publicationName,那么使用publicationName关键字的人会把我甩了一段时间)

带有artifactory的“gradle.settings”:

artifactId上的时间戳

调试提示:

有目的地将您的目标artifactory设置为:

String repoKeyValue = version.endsWith('SNAPSHOT') ? 'doesnotexist-libs-snapshot-local' : 'doesnotexist-libs-release-local'
(它会失败,但暂时可以)

并尝试在本地运行artifactory推送:

在gradle中(或可能基于您的设置):

这至少会告诉你它试图“推动”什么

您将看到这样的失败:

String repoKeyValue = version.endsWith('SNAPSHOT') ? 'libs-snapshot-local' : 'libs-release-local'
String repoKeyValue = version.contains('SNAPSHOT') ? 'MyCustomRepository-Snapshots/com/mycompany/mypackagename1/mypackagename2/' : 'MyCustomRepository-Releases/com/mycompany/mypackagename1/mypackagename2/'
[pool-1-thread-1] Deploying artifact: https://somewhere.com/artifactory/MY-Snapshots/com/mycompany/mypackagenameNotQuiteRight999/myPackageNameNotQuiteRight888/1.0-SNAPSHOT/myPackageNameNotQuiteRight888-1.0-SNAPSHOT.jar
Failed to upload file

但它向您展示了它试图“推送”的内容,您可以从中进行协调。

我们最终只是将该文件重命名为camel case来解决它。我会检查是否设置了此选项,但我相信它已设置为快照存储库。(由于我们的devops团队现在有点人手不足,我有管理员临时访问artifactory的权限来尝试解决这个问题。我必须向他发送一条消息,以了解配置了哪些选项)不过你可能是对的,如果我们的快照repo没有配置为拍摄快照,我不会感到惊讶。感谢你加入我的想法!如果你的假设是正确的,我将投票并接受。勾选“处理快照”为我解决了这个问题,但最终我将Maven配置为将我的工件上传到名为“libs snapshot local”,默认情况下允许快照。