【问题标题】:Artifactory ignores checksum uploads on maven-metadata.xml filesArtifactory 忽略 maven-metadata.xml 文件上的校验和上传
【发布时间】:2018-05-12 03:47:20
【问题描述】:

我有一个大型 Maven 存储库,由 Artifactory 版本 5.4.6 托管。 使用 JFrog REST API,我可以使用

查看所有错误或缺失的校验和
curl -u "admin:$PASSWORD" -X GET "http://myserver/artifactory/api/search/badChecksum?type=sha1&repos=mymavenrepo"

这会为我的所有“maven-metadata.xml”文件返回大量关于“缺少客户端校验和”的错误。

但是,我使用发布校验和的 maven 插件部署 repo 中的所有文件。当我部署新文件时,我可以在 logs/request.log 中看到

  • 现有的 maven-metadata.xml 已下载(在 maven-metadata.xml 上获取)
  • 已上传更新的 maven-metadata.xml(PUT on maven-metadata.xml)
  • 已上传更新后的 maven-metadata.xml 的 MD5 哈希(PUT 到 maven-metadata.xml.md5)
  • 已上传更新后的 maven-metadata.xml 的 SHA1 哈希(PUT 到 maven-metadata.xml.sha1)

在 CLI 上进行一些测试,我可以确认设置校验和的 PUT 调用适用于普通文件,但在 maven-metadata.xml 文件上被忽略。

对于标准 JAR

FAKE_SHA1=0000111122223333444455556666777788889999
curl -u "admin:$PASSWORD" -X PUT "http://myserver/artifactory/mymavenrepo/javax/mail/mail/1.4.3/mail-1.4.3.jar.sha1" --data-ascii "$FAKE_SHA1"

将返回以下错误

{
  "errors" : [ {
    "status" : 409,
    "message" : "Checksum error for 'javax/mail/mail/1.4.3/mail-1.4.3.jar.sha1': received '0000111122223333444455556666777788889999' but actual is '8154bf8d666e6db154c548dc31a8d512c273f5ee'"
  } ]
}

对于一个 maven-metada.xml 文件

FAKE_SHA1=0000111122223333444455556666777788889999
curl -u "admin:$PASSWORD" -X PUT "http://myserver/artifactory/mymavenrepo/javax/mail/mail/maven-metadata.xml.sha1" --data-ascii "$FAKE_SHA1"

绝对不会返回任何东西

现在,启动 badChecksum 会抱怨 JAR 有错误的客户端校验和,但会继续抱怨 maven 元数据没有客户端校验和:

curl -u "admin:$PASSWORD" -X GET "http://myserver/artifactory/api/search/badChecksum?type=sha1&repos=mymavenrepo" | grep "javax/mail" -A2

返回

    "uri" : "http://myserver/artifactory/api/storage/mymavenrepo/javax/mail/mail/maven-metadata.xml",
    "serverSha1" : "61001c349ebaac8e116d5f25716e2abf31e081af",
    "clientSha1" : ""
--
    "uri" : "http://myserver/artifactory/api/storage/mymavenrepo/javax/mail/mail/1.4.3/mail-1.4.3.jar",
    "serverSha1" : "8154bf8d666e6db154c548dc31a8d512c273f5ee",
    "clientSha1" : "0000111122223333444455556666777788889999"

maven-metadata.xml 文件有什么奇怪的校验和语义吗? 这对我来说基本上破坏了 badChecksum REST 功能,因为这些元数据错误会淹没合法错误。

我的观点是,要么 maven-metadata.xml 文件是特殊的,badChecksum 应该忽略它们,要么它们就像普通文件一样,应该记录客户端校验和......

我看到的唯一解决方法是使用 fixChecksum API,但是您只需接受服务器校验和而不是推送本地校验和...

curl -u "admin:$PASSWORD" -X POST "http://myserver/artifactory/api/checksums/fix" --data-ascii "{\"repoKey\":\"mymavenrepo\",\"path\":\"javax/mail/mail/maven-metadata.xml\"}" --header "Content-Type: application/json"
{"info":"Successfully fixed checksum inconsistency"}

【问题讨论】:

  • 我很乐意收到评论来解释否决票。我认为缺少客户端校验和对很多人来说很烦人。如果我遗漏了一些明显的东西,我想知道......
  • maven-metadata.xml 是 Artifactory 根据相邻文件夹的内容自动生成的,为什么要为它设置校验和..?
  • 如果您使用 maven 命令行部署工件,maven 将自身下载现有的 maven-metadata.xml 并在之后重新上传。 AFAICS,这个逻辑在 maven-artifact-transfer 的 org.eclipse.aether.internal.impl.DefaultDeployer 类中。您可以从标准 maven 项目中进行以下测试:mvn clean install deploy:deploy -DaltDeploymentRepository=test::default::http://myserver/artifactory/mymavenrepo 您将在日志中看到部署插件首先下载元数据,然后再重新上传。

标签: maven-3 artifactory


【解决方案1】:

当我尝试使用 JFrog REST API 将模块发布到由 Artifactory 托管的 Maven 存储库时,我在 Intellij 中遇到了类似的问题。问题是:显然(根据日志所说),常规 Deploy Apache Maven Plugin 发送文件 .sh1.md5 以及模块,例如 .jar 文件,但 JFrog REST API expects a HTTP header 和 @987654327 @ 或 md5 值,而不是文件。

我找到的解决方案:使用Maven Artifactory Plugin。它处理这部分(显然它处理,因为错误已经消失,但我没有看到引擎盖下发生了什么)。

【讨论】:

    猜你喜欢
    • 2020-11-17
    • 1970-01-01
    • 2013-07-21
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多