远程存储库元数据是如何工作的

帕特里克·罗素
2023-01-22十一10

远程缓存的离线备份

Artifactory有大量的远程存储库类型,几乎可以与任何包管理器一起使用。这背后的系统代理机制实际上相当复杂。主要问题是如何处理上游元数据。通常,Artifactory的远程存储库系统依赖于客户机发出正确的请求。这就是通用远程存储库函数(即,下游客户端必须发出正确的GET请求来下载给定的远程包)。

对于其他包类型,客户机是更复杂的而且需要特别照顾。每种包管理器类型都使用元数据系统来确定要下载哪些包和依赖项。Maven就是这样的例子maven-metadata.xml文件,PyPI的simple.html文件,和YUM的repodata / *文件。由于所有这些包管理器的语法都是唯一的,Artifactory必须解决每个复杂的元数据系统。

元数据缓存检索周期

此设置可以通过导航到Admin > Repositories > Remote > < Remote-repo > Advanced菜单在Artifactory 6。X和7。X:

用户添加图片

上面,你可以看到我们已经展示了元数据缓存检索周期(MCRP)选项定义读取:"该值指在远程服务器上检查更新版本之前缓存元数据文件的秒数。值为0表示不缓存。”此设置对每个存储库类型的影响不同。例如,在Maven存储库中,它会导致Artifactory检查newmaven-metadata.xml文件每600秒。在PyPI中simple.html使用相同的时间戳更新文件。

相应地,Artifactory不需要读取单个元数据文件。它只是将新的元数据传递给客户端,然后客户端进行处理以发出下一个请求。以PyPI为例,序列如下:

用户添加图片

1.用户运行pip安装针对Artifactory

a. pip客户端请求artifactory.com/artifactory/api/pypi/pypi-remote/simpleHTML页面

b. Artifactory的元数据缓存检索周期已经过期,所以它提供一个更新HTML页面。有一点延迟,因为它必须重新下载文件。如果MCRP没有过期,则发送缓存文件。

2.基于简单的HTML元数据,pip客户机请求所需的内容包的二进制文件

a. Artifactory从其发送文件远程缓存对客户,这里跳过了Pypi.org。

然而,这可能会带来一个问题。例如,考虑开发人员将包上载到远程站点的可能性。如果他们在上传后马上通过Artifactory下载会发生什么?

在本例中,包不会出现在Artifactory的元数据副本中,开发人员将收到一个404未找到错误。

解决方案Artifactory UI内置了解决这个问题的方法。的Zap缓存函数为整个远程重置MCRP,从而确保在Zap之后将新的元数据发送到客户端。

用户添加图片
这个设置可以是调优提高下载性能。

用户总是需要准确的,最新的元数据应该降低设置,可能为“0”以禁用它。这将减慢大多数提取(因为Artifactory将不断地提供新的元数据),但确保始终使用最准确的数据。

当然,用户关心性能应该增加这个设置。但是,请注意,这样做将意味着Artifactory将更频繁地使用其缓存,并以准确性为代价。

删除包和Artifactory的缓存

到目前为止,我们一直在讨论远程上传,但是如果远程存储库删除包?假设给定的二进制文件在被上游删除之前缓存在Artifactory中,那么它不应该仍然可以下载吗?答案实际上是:没有,因为Artifactory正在努力镜子远程站点,二进制文件的元数据直接从上游源。如果元数据显示某个特定的包已被删除,则客户机将收到一个404未找到错误。

也就是说,包裹并没有真的丢失!来恢复删除对于给定的包,可以将其复制到本地Artifactory存储库。, Artifactory本地元数据计算将列出可供下载的软件包。然而,由于必须进入您的UI并手动复制软件包以重新开始使用它们是乏味的,我们建议您:

  • 下载并安装Artifactory的远程备份用户插件(必须有一个JSON配置文件,以实现预期的功能)。
  • 创建一个本地工件存储库的包类型,并将插件配置为复制远程缓存到本地存储库。
  • 创建一个虚拟存储库,让远程客户端使用它的URL。

使用该系统,远程站点上删除的任何文件都将被复制到本地存储库,其元数据将与远程站点的元数据无缝合并。

请注意删除某些包通常有很好的理由。因此,继续使用特定的已弃用包可能存在一些风险。此外,包覆盖将永远不会出现在下载客户机上,因为将首先提供旧的本地文件。