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

时间:2017-07-17 14:28:20

标签: 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在遇到此错误时产生的日志记录的详细程度,但我不确定这是否会有成效。

我不知道我们违反了这个文件的快照处理策略。关于我可以采取什么样的调试步骤,或者实际的冲突可能会有什么想法,我们将不胜感激。

2 个答案:

答案 0 :(得分:5)

您正尝试部署快照工件以释放存储库。您需要配置存储库以处理快照工件。请参见附图 enter image description here

答案 1 :(得分:0)

对于那些偶然发现此问题的未来读者。

还有魔术短语

由于快照发行处理策略中的冲突

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

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/'

那是什么问题?

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

        publishBuildInfo = true
        publishPom = true

Artifactory正在检查..以确保什么是.pom与您的总体发布路径名称一致。

漏洞修复:(紧邻下面的代码)

        publishBuildInfo = false
        publishPom = false

真正的解决方法是协调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-Snapshots / com / mycompany / mypackagename1 / mypackagename2 /'

因为这是要理解的关键)......“ com / mycompany / mypackagename1 / mypackagename2 /”和“ com / mycompany / mypackagenameNotQuiteRight999 / myPackageNameNotQuiteRight888 /“

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

人工工厂(将publishPom和publishBuildInfo设置为true时)以检查该一致性...(据我所知)

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

(下面在我的root 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
        }
    }
}

下面是我的模块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"
        }
    }
}

奖励材料:

有关出版物名称的信息,请参见https://docs.gradle.org/current/dsl/org.gradle.api.publish.maven.MavenPublication.html(如果您是第一次学习,使用关键词作为出版物名称的人会把我赶走一段时间)

带有人工制品的“ gradle.settings”:

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

artifactId上的时间戳

How to add timestamp for artifacts in Jenkins