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

fer*_*hgo 17 artifactory

我们有一组文件,我们希望专门部署到artifactory,测试结果.符合以下模式的文件似乎始终如一409 rejected the resolution of an artifact due to conflict in the snapshot release handling policy.该文件遵循格式abcxyz-test-results.json.我们有其他结果文件只是test-results.json上传就好了.值得注意的是,在遇到409之前,所有其他工件都会成功上传.

我们的存储库使用maven-2-default存储库布局.包含正则表达式设置为**/*,我们不定义任何排除.我的下一步是增加Artifactory在遇到此错误时产生的日志记录的详细程度,但我不确定这是否会有成效.

关于我们违反此文件的快照处理策略,我感到很遗憾.关于我可以采取什么样的调试步骤,或者实际的冲突可能是什么的任何想法将不胜感激.

gra*_*der 8

对于未来偶然发现这个问题的读者。

和神奇的短语

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

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

String repoKeyValue = version.endsWith('SNAPSHOT') ? 'libs-snapshot-local' : 'libs-release-local'
Run Code Online (Sandbox Code Playgroud)

那么您可能不会收到此错误。

但是,如果您尝试发布到公司范围内的全面工件实现,则可能会发布到看起来更像这样的东西:

String repoKeyValue = version.contains('SNAPSHOT') ? 'MyCustomRepository-Snapshots/com/mycompany/mypackagename1/mypackagename2/' : 'MyCustomRepository-Releases/com/mycompany/mypackagename1/mypackagename2/'
Run Code Online (Sandbox Code Playgroud)

那么问题出在哪里呢?

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

        publishBuildInfo = true
        publishPom = true
Run Code Online (Sandbox Code Playgroud)

Artifactory 正在检查..以确保 .pom 的内容与您的整体发布路径名称一致。

黑客修复:(紧邻代码下方)

        publishBuildInfo = false
        publishPom = false
Run Code Online (Sandbox Code Playgroud)

真正的解决方法是协调您的 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
Run Code Online (Sandbox Code Playgroud)

因此,如果您尝试发布到(请参阅上面的变量 repoKeyValue ),您将收到上述错误

'MyCustomRepository-Snapshots/com/mycompany/mypackagename1/mypackagename2/'

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

上面这句话是理解故障排除的关键思想。

Artifactory(当你将publishPom和publishBuildInfo设置为true时)检查一致性......(据我所知)

以下是魔法属性的更全面的背景。请注意,我有一个多模块 gradle 项目,我不想发布根项目。#monolithsAreHorrible

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

artifactoryPublish.skip = true


artifactory {
    contextUrl = "${artifactory_url}"
    publish {
        repository {
            repoKey = "${repoKeyValue}"

            username = "${artifactory_user}"
            password = "${artifactory_password}"
        }

        defaults {
            publications('myPublicationNameOne', 'myPublicationNameTwo', 'myPublicationNameThree')
            publishArtifacts = true
            publishBuildInfo = true
            publishPom = true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是我的模块 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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

奖励材料:

有关publicationNames,请参阅https://docs.gradle.org/current/dsl/org.gradle.api.publish.maven.MavenPublication.html (如果您是第一次学习者,使用publicationName(s)关键字的人把我扔了关闭一段时间)

带有工件的“gradle.settings”:

https://www.jfrog.com/confluence/display/JFROG/Working+with+Gradle#WorkingwithGradle-ConfiguringGradle

artifactId 上的时间戳

如何在 Jenkins 中为工件添加时间戳

调试提示:

有目的地将您的目标工件设置为:

String repoKeyValue = version.endsWith('SNAPSHOT') ? 'doesnotexist-libs-snapshot-local' : 'doesnotexist-libs-release-local'
Run Code Online (Sandbox Code Playgroud)

(会失败,不过暂时没问题)

并尝试在本地运行神器推送:

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

./gradlew clean build artifactoryPublish   
Run Code Online (Sandbox Code Playgroud)

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

你会看到这样的失败:

[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
Run Code Online (Sandbox Code Playgroud)

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


Yur*_* G. 7

您正在尝试部署快照工件以发布存储库。您需要配置存储库以处理快照工件。见所附图片 在此处输入图片说明

  • 勾选“处理快照”为我解决了这个问题,但最终我将 Maven 配置为将我的工件上传到名为“libs-snapshot-local”的存储库,该存储库默认允许快照。 (2认同)