代码库概览

借助 Artifact Registry,您可以存储不同的工件类型,在单个项目中创建多个代码库,并将特定单区域或多区域与每个代码库相关联。本页面介绍了可帮助您规划代码库位置和组织的注意事项。

在创建代码库时,请考虑创建工件的内部过程和工件消费者的使用情况。

代码库格式

每个代码库都与特定的工件格式相关联。例如,Docker 代码库用于存储 Docker 映像。您可以在同一 Google Cloud 项目中为每种格式创建多个代码库。

仓库模式

仓库模式有多种。每种模式的用途各不相同,因此代码库模式一经创建便无法更改。

标准仓库
标准代码库是私有工件的常规 Artifact Registry 代码库。您可以直接使用这些代码库上传和下载工件,并使用 Artifact Analysis 扫描漏洞和其他元数据。
远程仓库

一个只读代码库,充当存储来自预设外部来源(如 Docker Hub、Maven Central、Python 软件包索引 (PyPI)、Debian 或 CentOS)的工件的代理,以及针对受支持格式的用户定义源。首次请求工件版本时,代码库会从外部来源下载工件版本并缓存副本。当再次请求同一版本时,仓库会提供缓存的副本。

远程代码库可缩短 Google Cloud 上构建和部署的延迟时间并提高可用性。您还可以使用 Artifact Analysis 扫描缓存的软件包中是否存在漏洞和其他元数据。

虚拟仓库

只读代码库,充当从一个或多个上游代码库下载、安装或部署相同格式的工件的单个接入点。上游仓库可以是标准、远程或虚拟仓库。

虚拟代码库可为工件的使用方简化客户端配置。您还可以配置上游政策,使包含私有工件的代码库优先于缓存公共工件的远程代码库,从而缓解依赖项混淆攻击

代码库使用示例

下图展示了您可以以不同模式一起使用代码库的多种可能方式之一。该图显示了两个 Google Cloud 项目的工作流。在开发项目中,开发者构建一个 Java 应用。在单独的运行时项目中,另一个构建包含该应用创建一个容器映像,以部署到 Google Kubernetes Engine。

跨两个项目使用的标准代码库、虚拟代码库和远程代码库。

  1. 在开发项目中,Java 开发团队使用 Cloud Build 构建 Java 应用。

    • build 可以使用虚拟代码库请求公共 Java 依赖项。虚拟代码库从远程代码库提供依赖项,远程代码库是 Maven Central 的缓存代理。
    • Cloud Build 将软件包上传到组件项目中的标准 Maven 制品库。
  2. 在运行时项目中,Cloud Build 将 Java 应用容器化。

    此构建使用 Maven 虚拟代码库下载应用。虚拟代码库从开发项目中的标准代码库提供软件包。build 还可以从同一虚拟代码库下载公共 Java 依赖项。

  3. 在运行时项目中,Cloud Build 将构建的容器映像上传到标准 Docker 代码库。

  4. GKE 从 Docker 虚拟代码库拉取映像。

    • 上游标准 Docker 代码库提供私有映像,例如容器化 Java 应用。
    • 上游远程代码库提供 GKE 从 Docker Hub 请求的映像。

在此示例中,所有代码库、构建和 GKE 集群都位于同一区域。为 Google Cloud 服务使用同一位置有诸多好处,详情请参阅代码库位置

存储库位置

您可以在支持的 单区域或多区域 中创建一个或多个代码库。合适的存储库位置可以平衡数据使用者的延迟时间、可用性和带宽费用。您的组织可能还具有特定的法规遵从要求。

位置注意事项

在其他 Google Cloud 服务所在的区域中创建代码库具有许多好处:

  • 在运行 GKE、Cloud Run、Cloud Build 以及与代码库进行交互的其他 Google Cloud 服务所在的同一区域中创建代码库,从而缩短延迟时间和网络出站流量费用。从 Artifact Registry 到同一区域中其他 Google Cloud 服务的出站流量是免费的。

    虽然从多区域到相应区域的 Google Cloud 服务的出站流量是免费的,但此价格仅适用于部分区域。

    • 对于 us 多区域,发往美国区域(例如 us-central)的出站流量不收费,发往加拿大或南美洲任何区域的出站流量则收费。
    • 对于 asia 多区域,发往亚洲各区域(例如 asia-northeast1)的出站流量不收费,但发往澳大利亚各区域的出站流量则收费。
  • 如果您的容器映像存储在与工作负载位于同一区域的 Artifact Registry 代码库中,或者位于与您的工作负载所在区域对应的多区域中,则只能在 GKEDataproc Serverless 中使用映像流式传输。当您使用较大的容器映像时,映像流式传输可以显著缩短工作负载初始化时间,因为工作负载可以在整个映像下载完毕之前启动。

  • 考虑 Google Cloud 外部消费者的位置。例如,如果位于澳大利亚的开发者团队需要将工件从 Artifact Registry 下载到其本地工作站,则与位于另一个大洲的代码库相比,澳大利亚区域的代码库可以缩短延迟时间,并且产生的出站流量费用更低。

限制代码库位置

如果您需要遵守要求您将数据存储在特定区域的法规或政策,则可以在 Google Cloud 组织政策中添加资源位置限制条件,以仅允许在合规区域创建代码库。只有将限制条件添加到组织政策后,Artifact Registry 才会强制执行该限制条件。如果您的现有代码库位于不合规的位置,您必须自行将工件移动到合规位置的代码库,然后删除不合规的代码库。

清理政策

Artifact Registry 清理政策定义了自动删除不再需要的工件版本或保留要无限期存储的工件的条件。

如果您存储了多个版本的工件,但只需要保留发布到生产环境的特定版本,那么清理政策会非常有用。您可以定义包含删除工件的条件的删除政策,并定义包含保留工件的条件的保留政策

如果工件版本同时符合删除政策和保留政策中的条件,Artifact Registry 会应用保留政策。

删除政策

删除政策会删除符合以下必要条件的制品:

  • 标记状态:指示政策应该检查已标记的工件还是未标记的工件。在将映像推送到代码库或从中拉取映像时,系统会对工件进行标记。如需详细了解 Docker 标记,请参阅容器概念

    • 任何标记状态:忽略标记状态,同时适用于已标记和未标记的工件。
    • 已加标记:仅适用于带标记的工件。
    • 未添加标记:仅适用于未添加标记的工件。

    不支持标记的格式会被视为 untagged。如果代码库中启用了不可变标记的已标记工件,则无法删除。

    如需详细了解应用于清理政策的标记状态,请参阅 TagState 参考文档

以下是定义删除政策的可选方法:

  • 标记前缀:以英文逗号分隔的标记前缀列表。例如,前缀 teststaging 将匹配带有 testenvstaging-1.5 标记的映像。tagState 必须设置为 TAGGED 才能使用标记前缀。
    • 版本前缀:- 以英文逗号分隔的工件版本前缀列表。例如,v1v2 将与版本 v1.5v2.0alphav10.2 匹配。
  • Packageprefixes:是一个工件名称前缀列表。您可以按 Enter, 在前缀之间输入多个前缀。例如,red, blue 会创建 redblue 两个前缀,并与工件名称 red-teamredisbluebird 匹配。
  • 早于:自工件版本上传到代码库以来的最短时间,指定为时长。 例如,30d 为 30 天。您可以通过分别附加 smhd 来指定秒、分钟、小时或天的时长。
  • 早于:自工件版本上传到代码库以来的最长时间,以时长的形式指定。 例如,30d 为 30 天。

保留政策

保留政策可让工件保持与删除政策相同的条件,或满足一定数量的最近版本要求。

例如,假设代码库包含以下工件:

IMAGE: us-west1-docker.pkg.dev/my-project/release-xyz-v1
DIGEST: sha256:1b0a26bd07a3d17473d8d8468bea84015e27f87124b2831234581bce13f61370
TAGS:
CREATE_TIME: 2023-06-19T18:59:09
UPDATE_TIME: 2023-06-19T18:59:10

IMAGE: us-west1-docker.pkg.dev/my-project/release-xyz-v2
DIGEST: sha256:6e494387c901caf429c1bf77bd92fb82b33a68c0e19f123456a3ac8d27a7049d
TAGS: latest
CREATE_TIME: 2023-06-19T18:59:09
UPDATE_TIME: 2023-06-19T18:59:09

IMAGE: us-west1-docker.pkg.dev/my-project/release-v2
DIGEST: sha256:6e494387c901caf429c1bf77bd92fb82b33a68c0e19f123456a3ac8d27a7049d
TAGS: latest
CREATE_TIME: 2023-06-19T18:59:09
UPDATE_TIME: 2023-06-19T18:59:09

如果保留最新版本政策设置为保留与软件包前缀匹配的 3 个软件包版本:{release-xyz},则仅保留 release-xyz-v1release-xyz-v2

删除政策触发的删除操作会计入您的 Artifact Registry 每个项目的删除请求配额

如需创建清理政策并将其应用于代码库,请参阅配置清理政策

gcr.io 网域支持

Artifact Registry 支持在 gcr.io 网域上托管映像。如果您要从 Container Registry 转换到 Artifact Registry,可以设置 gcr.io 代码库 Artifact Registry,以最大限度地减少对现有自动化操作和工作流的更改。这些代码库提供:

  • 将请求重定向到 gcr.io 网域。
  • 将第一个映像推送到 gcr.io 主机名时,系统会创建 gcr.io 代码库,以便与 Container Registry 行为兼容。

如需了解详情,请参阅转换为具有 gcr.io 网域支持的代码库

项目结构

资源层次结构是跨 Google Cloud 项目整理资源的方式。您选择的结构取决于数据治理要求、信任边界和团队结构等因素。

在多项目组织中设置代码库的常规方法有两种。

集中管理代码库
在单个项目中创建所有代码库,然后在代码库级别向其他项目中的主账号授予访问权限。如果单个人员或团队处理整个组织的代码库管理和代码库访问权限,则此方法可能更加有效。
它还可以简化虚拟代码库或 Software Delivery Shield 等解决方案的设置,因为您只需启用和管理 Artifact Registry 的单个实例。
项目专用的代码库
在用于存储和下载工件的项目中创建代码库。当您的数据治理政策或信任边界需要在项目级对资源进行更多隔离和控制时,可能需要此方法。

访问权限控制

除非您将代码库配置为公开访问权限,否则只有具备适当权限才能访问代码库。您可以授予项目级或代码库级的权限。

某些 Google Cloud 服务使用的默认服务帐号具有对同一 Google Cloud 项目中的代码库的默认权限。但是,这些默认设置可能不适合您的软件开发过程,或者不符合贵组织的安全或政策要求。在以下情况下,您的代码库管理员必须明确向这些服务授予对代码库的访问权限:

  • Artifact Registry 与与其交互的服务位于不同的项目中。
  • 您正在使用默认服务帐号的自定义 IAM 角色,而不是预定义角色。
  • 您没有为 Google Cloud 服务使用默认服务帐号。
  • 您正在设置虚拟代码库。您必须明确向 Artifact Registry 服务帐号授予对上游代码库的访问权限。

对于需要访问代码库的其他主账号,代码库管理员必须授予访问权限。请遵循最小权限安全原则,授予所需的最低权限。例如:

  • 您将 Artifact Registry 中的容器映像部署到多个不同项目中的 GKE 集群。这些集群中节点的服务帐号只需要代码库的读取权限。
  • 您有一个用于开发应用的开发仓库和用于已发布的应用的生产仓库。开发者需要拥有对开发代码库的读写权限以及对生产代码库的只读权限。
  • 您有一个包含示例应用的演示版代码库。您的销售团队只需拥有下载演示的只读权限即可。

数据加密

默认情况下,Google Cloud 会使用 Google 拥有的密钥和 Google 管理的密钥自动加密静态数据。如果您对保护数据的密钥有特定的合规性或监管要求,您可以创建使用客户管理的加密密钥 (CMEK) 加密的代码库。

Artifact Registry 还支持可能需要 CMEK 保护资源的组织政策限制条件

标签和标记

标签提供了一种整理 Google Cloud 服务专用资源的方法。在 Artifact Registry 中,您可以向代码库添加标签,以便将它们组合在一起或按标签过滤代码库列表。例如,您可以使用标签按开发阶段或团队对代码库进行分组,以实现自动化或结算。如需详细了解如何创建和使用代码库标签,请参阅为代码库添加标签

您还可以将标记应用于代码库。虽然标签主要用于整理和过滤服务专用资源,但标签用于以编程方式控制整个 Google Cloud 组织的政策。如需了解详情,请参阅标记代码库

后续步骤