ARTIFACTORY:揭示虚拟存储库解析

帕特里克·罗素
2022-10-18 09:30

有时,当您尝试从Virtual Repository下载工件时,您会得到一个错误,但是当使用底层的Local或Remote时,相同的URL可以工作。当绕过Virtual Repository绕过问题时,这意味着Virtual可能在其逻辑中存在问题。

在这些情况下,运行一个特殊的API来诊断问题是很有帮助的。

“?跟踪“API

自从Artifactory引入虚拟存储库以来,存在一个特殊的调试API来打印其工件解析逻辑。该API允许您查看下载背后的底层逻辑,包括对Maven Central等远程源进行的输出搜索。

要查看调试信息,请添加“?”trace"令牌到经过Virtual的下载URL的末尾:curl -u "https://artifactory.com/libs-snapshot/jfrog/hello/1.0.8-SNAPSHOT/hello-1.0.8-20220526.215602-2.pom?trace"
注意:不能在包管理器路径上使用Trace API,例如“API /pypi/pypi-virtual/[…]?”“Trace”不起作用。尝试使用文件路径代替。

当您使用这个API时,您将收到一个调试输出,而不是获得一个文件。调试输出是用于查找文件的逻辑工件。这在对复杂的虚拟存储库进行故障排除时非常有用,因为有时需要非常大的分辨率会导致意想不到的逻辑问题吗

请确保在使用此API时进行身份验证,trace API会像Virtual一样检查您的凭据。您甚至可以看到,如果您的帐户无法访问哪些存储库,将跳过它们。

打印输出中的许多信息都是调试信息,没有多大帮助。下面你可以在打印输出中找到一些关键标签。这些例子是从Virtual解析文件时的一些常见结果:找到本地文件、远程下载和404 Not Found事件。

这些例子是在一个有两个存储库的虚拟环境中执行的,一个小的本地存储库和一个指向Maven Central的远程存储库:

用户添加图片
在lib -snapshot-local中查找本地POM文件

Artifactory的虚拟存储库系统首先搜索所有本地存储库。如果它找到了该文件,它将不会查询Maven Central。

[示例命令用法]curl -u admin "https://artifactory.com/libs-snapshot/jfrog/hello/1.0.8-SNAPSHOT/hello-1.0.8-20220526.215602-2.pom?trace"

输出:

2022-10-17T14:11:10.187-07:00执行anyBeforeDownloadRequest用户插件这可能存在

  • 开始解决过程
  • 输出输出任何用户插件可能会阻止或修改下载请求
  • 没有,所以人工工厂继续搜寻

无法在目录中找到资源libs-snapshot: jfrog / hello / 1.0.8-SNAPSHOT / hello - 1.0.8 - 20220526.215602 - 2. - pom

  • 注意:该文件不是直接在虚拟中找到的
  • 一些虚拟机,比如Debian Virtual,实际上在其中保存了元数据文件
  • Debian Virtuals这样做是因为元数据在索引期间从本地和远程合并

2022 - 10 - 17 - t14:11:10.189 07:00返回找到的资源libs-snapshot-local: jfrog / hello / 1.0.8-SNAPSHOT / hello - 1.0.8 - 20220526.215602 - 2. - pom

  • 此搜索在Local中找到工件,因此返回文件
  • 不会查询Maven Central,也不会检查Remote Repo缓存

2022-10-17T14:11:10.190-07:00创建资源处理从“libs-snapshot-local: jfrog / hello / 1.0.8-SNAPSHOT / hello - 1.0.8 - 20220526.215602 - 2. - pom的

  • 资源处理是本地/远程目录中直接文件的路径
  • 它被传递给父类Virtual,这样下载函数就知道要返回什么文件

2022 - 10 - 17 - t14:11:10.216 07:00请求成功

  • 这意味着请求成功!
  • 使用不带“?”跟踪“APIon the end should return the file found in libs-snapshot-local

在maven中心找到一个远程POM文件

接下来,让我们下载一个只在Maven Central中可用的新文件,Artifactory还没有下载它。要下载它,Artifactory必须先搜索当地人,然后在网上搜索。

[示例命令用法]Curl -u admin -v "https://artifactory.com/artifactory/libs-snapshot/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-1.pom?trace"

输出:

2022-10-17T14:26:40.535-07:00查找其中的资源libs-snapshot-local
2022 - 10 - 17 - t14:26:40.535 07:00中无法找到资源libs-snapshot-local: com/sun/pkg/pkg - java/1.0.0 -α- 1/pkg - java - 1.0.0 -α- 1. - pom

  • 看起来包不在lib -snapshot-local中…

2022-10-17T14:26:40.535-07:00查找其中的资源maven-central-cache
2022 - 10 - 17 - t14:26:40.536 07:00无法在maven-central-cache中找到资源: com/sun/pkg/pkg - java/1.0.0 -α- 1/pkg - java - 1.0.0 -α- 1. - pom

  • 看起来也不在藏物里…

2022-10-17T14:26:40.536-07:00查找其中的资源maven
2022-10-17T14:26:40.537-07:00使用远程请求URL - https://repo.maven.apache.org/maven2/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-1.pom
2022-10-17T14:26:40.537-07:00执行对https://repo.maven.apache.org/maven2/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-1.pom的HEAD请求
找到内容长度为- 1678的远程资源

  • 首先,进行HEAD检查,Artifactory找到了一个文件
  • 这节省了网络带宽,并且仅在远程站点限制频繁的GET请求时才这样做

2022 - 10 - 17 - t14:26:40.868 07:00在maven-central中发现资源
2022-10-17T14:26:40.868-07:00资源是一个精确匹配返回
2022-10-17T14:26:40.868-07:00返回聚合存储库中找到的资源

  • Artifactory已经找到了这个文件,它的逻辑说可以下载了

2022 - 10 - 17 - t14:26:40.880 07:00执行GET请求https://repo.maven.apache.org/maven2/com/sun/pkg/pkg - java/1.0.0 -α- 1/pkg - java - 1.0.0 -α- 1. - pom
2022-10-17T14:26:40.933-07:00下载内容#下载开始
2022-10-17T14:26:40.933-07:00将资源保存到maven-central-cache
下载内容#下载完成-耗时0.1秒

  • 这是文件下载事件
  • 您可以使用时间戳查看下载花费了多长时间

2022 - 10 - 17 - t14:26:41.020 07:00创建资源句柄从“maven-central-cache: com/sun/pkg/pkg - java/1.0.0 -α- 1/pkg - java - 1.0.0 -α- 1. - pom的

  • Artifactory再次向Virtual发送一个资源句柄指针,以便下载正确的文件
  • 注意,这里使用缓存是因为文件已经被下载和缓存

404未找到示例

在本例中,请求了一个不存在的包。“pkg-java”POM文件路径修改错误。

[示例命令用法]
Curl -u admin -v "https://artifactory.com/artifactory/libs-snapshot/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-d.pom?trace"

输出

2022-10-17T14:46:33.906-07:00查找其中的资源libs-snapshot-local
2022 - 10 - 17 - t14:46:33.907 07:00无法在lib -snapshot-local中找到资源: com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-d.pom

2022-10-17T14:46:33.907-07:00查找其中的资源maven-central-cache
2022-10-17T14:46:33.908-07:00无法找到资源maven-central-cache: com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-d.pom

  • 在缓存或本地中找不到,next Artifactory查询远程…

2022-10-17T14:46:33.908-07:00使用远程请求URL - https://repo.maven.apache.org/maven2/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-d.pom
2022-10-17T14:46:33.908-07:00执行对https://repo.maven.apache.org/maven2/com/sun/pkg/pkg-java/1.0.0-alpha-1/pkg-java-1.0.0-alpha-d.pom的HEAD请求
2022 - 10 - 17 - t14:46:34.242 07:00在远程信息请求中收到状态404(消息:未找到)-返回未找到的资源

  • 在Maven Central中也没有找到该资源
  • 注意Artifactory只执行了一个HEAD请求,该请求失败了。之后它没有尝试GET
  • 你可以旁路HEAD请求在远程存储库设置中生成GET请求

2022 - 10 - 17 - t14:46:34.242 07:00设置隐藏未授权资源的真实状态= false2022世界杯阿根廷预选赛赛程对于repo库-快照
2022-10-17T14:46:34.242-07:00原始响应状态为auth related = false
使用' '的原始响应状态404'和消息'找不到资源
2022-10-17T14:46:34.242-07:00发送状态为404的响应,消息为“无法找到资源”。