代码库概览

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

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

代码库格式

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

代码库模式

代码库模式有多种。每种模式都有不同的用途,因此您在创建代码库后便无法更改代码库模式。

标准代码库

标准制品库是用于存储私有工件的常规 Artifact Registry 制品库。您可以直接使用这些代码库上传和下载工件,并使用工件分析功能扫描漏洞和其他元数据。

如需创建标准代码库,请按照创建标准代码库中的步骤操作。

远程代码库

远程代码库是只读代码库,可充当代理来存储以下上游源的工件:

  • 标准 Artifact Registry 制品库。
  • 外部来源,例如 Docker Hub、Maven Central、Python 软件包索引 (PyPI)、Debian 或 CentOS。

您首次请求工件版本时,代码库会从上游源代码下载该版本,并缓存其副本。当再次请求同一版本时,远程代码库会提供缓存的副本。

远程代码库可缩短 Google Cloud上的构建和部署的延迟时间,并提高其可用性。您还可以使用工件分析来扫描缓存的软件包,以查找漏洞和其他元数据。

如需详细了解远程仓库,请参阅远程仓库概览。如需创建远程代码库,请按照创建远程代码库中的步骤操作。

虚拟代码库

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

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

如需详细了解虚拟代码库,请参阅虚拟代码库概览。如需创建虚拟仓库,请按照创建虚拟仓库中的步骤操作。

代码库使用示例

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

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

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

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

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

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

  4. GKE 会从 Docker 虚拟仓库中拉取映像。

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

在此示例中,所有代码库、build 和 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 CloudArtifact Registry 仅在您将限制条件添加到组织政策中后才会强制执行该限制条件。如果您在不合规的位置有现有代码库,则必须自行将工件移至合规位置的代码库,然后删除不合规的代码库。

清理政策

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

如果您存储了许多工件版本,但只需要保留发布到生产环境的特定版本,清理政策会很有用。您可以定义删除政策(包含用于删除工件的条件),以及保留政策(包含用于保留工件的条件)。

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

删除政策

删除政策会删除符合以下必需条件的工件:

  • 标记状态:指示政策应检查是否存在带标记的工件或不带标记的工件。将映像推送到或从代码库中拉取映像时,系统会为工件添加标记。如需详细了解 Docker 标记,请参阅容器概念

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

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

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

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

  • 代码前缀:代码前缀的逗号分隔列表。例如,前缀 teststaging 会与标记为 testenvstaging-1.5 的图片匹配。必须将 tagState 设置为 TAGGED,才能使用代码前缀。
    • 版本前缀:- 是工件版本前缀的逗号分隔列表。例如,v1v2 将与版本 v1.5v2.0alphav10.2 匹配。
  • 软件包前缀:工件名称前缀列表。您可以在前缀之间按 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

如果您的保留最新版本政策设置为保留与软件包前缀 {release-xyz} 匹配的 3 个软件包版本,则系统只会保留 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 项目中整理资源的方式。您选择的结构取决于数据治理要求、信任边界和团队结构等因素。

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

集中管理代码库
在单个项目中创建所有代码库,然后在代码库级别向其他项目中的正文授予访问权限。如果由单个人或团队负责整个组织的代码库管理和代码库访问,这种方法会更有效。
它还可以简化虚拟代码库的设置,因为您只需启用和管理单个 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 如需了解详情,请参阅为代码库添加标记

后续步骤