Help us learn about your current experience with the documentation. Take the survey.

虚拟仓库

  • 层级:Premium, Ultimate
  • 提供:GitLab.com, GitLab Self-Managed
  • 状态:Beta

此功能的可用性由功能标志控制。 有关更多信息,请参阅历史记录。 此功能在 beta 版本中可用。 使用此功能前,请仔细阅读文档。

使用 GitLab 虚拟仓库来代理、缓存和分发来自多个上游仓库的包,通过一个知名统一的 URL。

通过这种方式,您可以配置应用程序使用一个虚拟仓库,而不是多个上游仓库。

先决条件

要配置虚拟仓库:

  • 您需要一个至少具有 Maintainer 角色的顶级组。
  • 确保启用依赖代理设置。默认情况下已启用,但 管理员可以将其关闭
  • 您必须为支持的 包格式 配置身份验证。

支持的包格式

虚拟仓库工作流程

当您创建虚拟仓库时:

  • 仓库托管在给定包格式的顶级组中。项目和子组不受支持。
  • 虚拟仓库对象链接到一个有序的可用上游列表(最多 20 个)。每个上游指向一个外部仓库。
  • 外部仓库可以是公开的或私有的。私有仓库的凭据存储在上游本身中,因此您无需在包管理器配置中存储它们。

当虚拟仓库收到包请求时:

  • 仓库遍历上游的有序列表,找到一个可以满足请求的上游。
  • 如果在上游中找到请求的文件,虚拟仓库将返回该文件并为将来的请求缓存它。缓存 提高了依赖项的可用性,如果您至少通过虚拟仓库拉取过一次。

缓存系统

所有上游仓库都有一个缓存系统,它:

  • 将请求存储在缓存条目中
  • 从 GitLab 虚拟仓库为相同的请求提供服务

这样,当请求相同的包时,虚拟仓库无需再次联系上游。

如果请求的路径在任何可用的上游中都没有被缓存:

  1. 虚拟仓库遍历上游的有序列表,找到一个可以满足请求的上游。
  2. 当找到一个可以满足请求的上游时,虚拟仓库根据需要使用提供的凭据从上游拉取响应。

如果请求的路径在任何可用的上游中已被缓存:

  1. 虚拟仓库检查 缓存有效期,以查看在转发响应之前是否需要刷新缓存条目。
  2. 如果缓存有效,上游的缓存条目将满足请求。
    • 如果较低优先级的上游在其缓存中有请求,而较高优先级的包含该文件但未缓存请求,则较低优先级的上游将满足请求。虚拟仓库不会再次遍历上游的有序列表。

如果虚拟仓库找不到可以满足请求的上游,它将返回 404 Not Found 错误。

缓存有效期

缓存有效期以小时为单位设置缓存条目被认为有效以满足请求的时间。

在虚拟仓库从现有缓存条目拉取之前, 它会检查缓存有效期以确定是否需要刷新该条目。

如果条目超出有效期,虚拟仓库会检查 上游响应是否与缓存中的响应相同。如果:

  • 响应相同,则使用该条目满足请求。
  • 响应不同,则再次从上游下载响应以覆盖上游缓存条目。

如果虚拟仓库由于网络条件无法连接到上游, 上游将使用可用的缓存条目提供服务。

只要虚拟仓库在缓存中有与 请求相关的响应,该请求就会被满足, 即使超出有效期也是如此。

设置缓存有效期

缓存有效期对于虚拟仓库满足请求的整体性能很重要。联系外部仓库是一项成本高昂的操作。较短的有效期会增加检查次数,而较长的有效期则会减少检查次数。

您可以通过将其设置为 0 来关闭缓存有效性检查。

缓存有效期的默认值为 24 小时。

当上游目标的外部仓库已知具有不可变响应时,您应该将缓存有效期设置为 0。官方公共仓库通常就是这种情况。有关更多信息,请查看您的 支持的包格式

对象存储使用

缓存条目将其文件保存在 dependency_proxy 存储桶 的对象存储中。

对象存储使用计入顶级组的 对象存储使用限制

性能考虑因素

虚拟仓库的性能可能会因以下因素而有所不同:

  • 请求的文件是否从上游仓库缓存
  • 上游仓库在文件存在或不存在时能够多快地响应
  • 哪个客户端正在拉取依赖项,以及客户端与 GitLab 实例的接近程度

权衡

虚拟仓库比公共仓库更高级。 当您使用虚拟仓库拉取依赖项时, 它可能比其他仓库(如公共官方仓库)花费更长时间。

与公共仓库相比,虚拟仓库 还支持多个上游仓库和身份验证。

上游优先级

上游仓库按有序列表组织。每当请求未 在缓存中找到时,虚拟仓库会遍历有序列表以找到 可以满足请求的最高优先级上游。 此系统明显影响虚拟仓库的性能。

当您管理私有上游仓库列表时:

  • 您应该将包含最多包的仓库放在列表顶部。这种方法:
    • 增加高优先级仓库可以满足请求的机会
    • 防止遍历整个有序列表以查找有效的上游仓库
  • 您应该将包含最少包的仓库放在列表底部。

使用性能提升

当您创建虚拟仓库时,每个配置的上游的缓存都是空的。每个请求都需要虚拟仓库遍历可用上游仓库列表以满足请求。这些初始请求需要更长时间才能满足。

当上游仓库缓存请求时,满足相同请求的时间会减少。随着时间的推移,随着更多上游仓库缓存更多请求,虚拟仓库的整体性能会提高。

使用 CI/CD 缓存

您可以使用 GitLab CI/CD 中的缓存,这样作业就不必从虚拟仓库下载依赖项。

这种方法可以提高执行时间,但也会为每个依赖项重复存储(依赖项存储在 CI/CD 缓存和虚拟仓库中)。