我们有一组文件,我们希望专门部署到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在遇到此错误时产生的日志记录的详细程度,但我不确定这是否会有成效。
我不知道我们违反了这个文件的快照处理策略。关于我可以采取什么样的调试步骤,或者实际的冲突可能会有什么想法,我们将不胜感激。
答案 0 :(得分:5)
答案 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”:
artifactId上的时间戳