当前位置: 首页 > 知识库问答 >
问题:

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

廉宇
2023-03-14

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

我们的存储库使用maven-2默认存储库布局。包含正则表达式设置为**/*,并且我们不定义任何排除。我的下一步是增加当我们遇到这个错误时,阿蒂工厂产生的日志的冗长性,但我不确定这是否会有成效。

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

共有1个答案

卢开济
2023-03-14

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

和神奇的短语

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

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

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

人工工厂正在做检查。。确定什么是最重要的。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/”之间存在差异

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

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

下面是魔法属性更完整的背景。注意,我有一个多模块gradle项目,我不想发布根项目#整块石头都是不正当的

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

下面是我的一个模块构建。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关于publicationName(如果你是第一次学习publicationName,人们使用publicationName关键字会让我有一段时间不高兴)

带有artifactory的“gradle.settings”:

https://www.jfrog.com/confluence/display/JFROG/WorkingGradle#Workingwith Gradle配置Gradle

artifactId上的时间戳

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

调试提示:

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

String repoKeyValue = version.endsWith('SNAPSHOT') ? 'doesnotexist-libs-snapshot-local' : 'doesnotexist-libs-release-local'

(它会失败,但暂时可以)

并尝试在本地运行工艺品推送:

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

./gradlew clean build artifactoryPublish   

这至少会让你看到它试图“推动”什么。

你会看到这样的失败:

[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

但它向你展示了它试图“推动”的东西,你可以从那里协调。

 类似资料:
  • 自动快照策略即通过设置快照策略周期性的对指定硬盘创建快照。 自动快照策略即通过设置快照策略周期性的对指定硬盘创建快照。建议针对核心业务、数据类业务创建自动快照策略,以加强数据保护。目前仅支持对 云联壹云 、阿里云、腾讯云平台上的硬盘设置自动快照策略。 来源 在云管平台上创建自动快照策略。 同步公有云平台上的自动快照策略,同时将产生一条缓存记录。 各个平台上的自动快照配额如下 在 云联壹云 平台上每

  • 我有一个多模块项目。而且,我希望能够只做gradle发布,并发布所有模块的所有工件。其中一个问题是,当我包含插件时,我得到了名为“构建”的任务,但在根项目中找不到。 当我运行

  • 我们正在使用Nexus来部署我们的快照工件。我们的构建服务器在每次构建期间使用以下命令部署它们:mvn deploy。因此,在每次构建时都会部署工件的较新版本。已经有大约几十个工件被部署到存储库,当然我们只需要最后一个工件的问题。有什么方法可以限制Nexus中部署的快照工件的数量吗?谢谢你的帮助,迈克尔

  • 问题内容: 我们正在使用Nexus部署快照工件。我们的构建服务器使用以下命令在每次构建期间部署它们:mvn deploy。结果,在每个构建上都部署了工件的较新版本。已经将大约数十个工件部署到存储库的问题,当然我们只需要最后一个工件。有什么方法可以限制Nexus中已部署快照工件的数量?谢谢迈克尔的帮助 问题答案: 创建计划任务以清除旧快照。 以下链接描述了功能: Nexus预定任务 管理计划的任务-

  • 如何通过Maven部署插件获得部署快照的时间戳到Nexus? 例如,我使用版本部署了一个工件,该工件使用时间戳(我假设Nexus创建了这个时间戳,或者至少是它的最后一个“内部版本号”部分)(格式)部署。我可以通过以下方式获得时间戳吗: 某个Maven命令/s? 某些Nexus REST API? 其他“纲领性”方式? 到目前为止,我只发现了一个烦人的解决方法--“在”我将工件部署到Nexus之后“

  • 问题内容: 问题描述 我们有几个相互依赖的多模块项目。所以像这样: 讯息传递 构架 其他成分 他们有单独的源代码控制存储库,可以说, 消息传递 和 其他 组件内的子模块正在使用来自 框架 子模块的捆绑包。所有项目都是基于OSGI的多模块Maven项目。它们全部都有一个服务器部分和一个来源GUI部分(Eclipse RAP + RCP)。因此,这最终针对所有这些多模块项目以三步为 基础的Maven构