创建虚拟代码库

本页面介绍了如何创建 Artifact Registry 虚拟代码库。

虚拟代码库作为单个访问点,可以从一个或多个上游代码库以相同格式下载、安装和部署工件。上游代码库可以是 Artifact Registry 标准代码库或远程代码库。

其他仓库模式包括:

  • 标准:默认代码库模式。您可以将工件(如专用软件包)直接上传或发布到标准代码库。虽然您可以直接从各个标准代码库下载,但使用虚拟代码库访问代码库组可以简化工具配置。
  • 远程(仅限语言软件包代码库):针对 Maven Central 或 PyPI 等公共代码库中的工件的拉取缓存。它可以充当公共代码库的代理,以便您更好地控制外部依赖项。

如需详细了解虚拟代码库的工作原理,请参阅虚拟代码库概览

准备工作

启用 Artifact Registry,包括启用 Artifact Registry API 以及安装最新版本的 Google Cloud CLI。

所需的角色

如需获取管理代码库所需的权限,请让管理员向您授予以下 IAM 角色:

  • 创建虚拟代码库并授予对各个代码库的访问权限: Google Cloud 项目的 Artifact Registry Repository Administrator (roles/artifactregistry.repoAdmin)
  • 在项目级授予对代码库的访问权限: 对 Google Cloud 项目拥有 Project IAM Admin (roles/resourcemanager.projectIamAdmin) 的权限
  • 在文件夹级层授予对代码库的访问权限: 文件夹的 Folder Admin (roles/resourcemanager.folderAdmin)
  • 在组织级层授予对代码库的访问权限: Google Cloud 组织的 Organization Admin (roles/resourcemanager.organizationAdmin)

如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

如果上游代码库在其他项目中,则具有上游代码库的项目中的管理员必须具有管理对这些代码库的访问权限。

创建上游仓库

在设置虚拟代码库之前,请创建要向虚拟代码库提供的上游代码库。

  1. 在您计划创建虚拟代码库的同一 Google Cloud 区域中创建上游代码库。

  2. 虚拟代码库使用 Artifact Registry Service Agent 向上游代码库进行身份验证。您必须授予服务代理对上游代码库的读取权限。

    您可以在项目级层向 Artifact Registry 服务代理授予 Artifact Registry Reader 角色,这样就无需授予对各个上游代码库的访问权限。

    在具有上游代码库的每个项目中,运行以下命令:

    gcloud projects add-iam-policy-binding UPSTREAM_PROJECT_ID \
        --member serviceAccount:service-VIRTUAL-REPO-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com \
        --role roles/artifactregistry.reader
    

    地点

    • UPSTREAM_PROJECT_ID 是包含上游代码库的 Google Cloud 项目的 ID。
    • VIRTUAL_REPO_PROJECT_NUMBER 是您的虚拟代码库的 Google Cloud 项目的编号

    或者,如果要向服务代理授予范围更小的角色,请为自定义角色添加 artifactregistry.repositories.readViaVirtualRepository 权限,然后将该角色授予服务代理。

    如需详细了解如何授予权限,请参阅访问权限控制文档。

创建虚拟代码库

创建代码库时,您必须配置以下设置,并且在代码库创建后无法更改:

  • 工件格式。
  • 仓库模式(如果多种模式适用于所选格式)。
  • 代码库位置
  • 使用 Google 管理的密钥或客户管理的加密密钥进行加密。Artifact Registry 默认使用 Google 管理的加密密钥。

Artifact Registry 会强制执行组织政策限制条件,要求 CMEK 来加密资源或限制哪些 Cloud KMS 密钥可用于 CMEK 保护。

使用 Google Cloud 控制台创建虚拟代码库

  1. 打开 Google Cloud 控制台中的制品库页面。

    打开“代码库”页面

  2. 点击创建代码库

  3. 指定代码库名称。对于项目中的每个代码库位置,代码库名称必须是唯一的。

  4. 选择代码库格式。

  5. 代码库模式下,选择虚拟

  6. Virtual Repository Upstreams 下,点击 Add Upstream 以添加上游仓库。

    • 上游仓库可以是标准仓库、远程仓库或虚拟仓库。
    • 上游代码库必须与虚拟代码库位于同一位置,但可以位于不同的 Google Cloud 项目中。
    • 上游代码库必须与虚拟代码库采用相同的工件格式。

    为每个上游仓库指定优先级和政策名称。优先级较高的值优先于较低的值。 在优先级值之间留出空间,以便灵活地添加优先级介于现有值之间的上游仓库。

  7. 位置类型下,选择代码库的位置:

    1. 选择位置类型:“单区域”或“多区域”。位置列表会更改,以反映您的选择。

    2. 区域多区域列表中,选择一个位置。

    如需了解位置类型和支持的位置,请参阅代码库位置

  8. 为代码库添加说明。说明有助于确定代码库的用途及其包含的工件类型。

    请勿包含敏感数据,因为代码库说明未加密。

  9. 如果要使用标签来整理代码库,请点击添加标签,然后输入标签的键值对。您可以在创建代码库后添加、修改或移除标签。

  10. 加密部分中,选择代码库的加密机制。

    • Google 管理的密钥 - 使用 Google 管理的加密密钥来加密代码库内容。
    • 客户管理的密钥 - 使用您通过 Cloud Key Management Service 控制的密钥来加密代码库内容。如需查看密钥设置说明,请参阅为代码库设置 CMEK
  11. 点击创建

Artifact Registry 会创建代码库并将其添加到代码库列表中。

创建代码库后,请执行以下操作:

使用 gcloud CLI 创建虚拟代码库

如需创建虚拟代码库,请在政策文件中定义上游代码库,然后使用政策文件创建代码库。

  1. 使用以下设置创建 JSON 格式的上游政策文件:

    [{
    "id" : "POLICY_ID",
    "repository" : "UPSTREAM_REPOSITORY_RESOURCE_NAME",
    "priority" : PRIORITY
    }, {...}]
    
    • POLICY_ID 是政策的名称。政策中的每个上游仓库都必须具有唯一的政策 ID。
    • UPSTREAM_REPO_RESOURCE_NAME 是上游代码库的名称,格式为:

      projects/PROJECT_ID/locations/LOCATION/repositories/REPOSITORY
      
      • 上游仓库可以是标准仓库、远程仓库或虚拟仓库。
      • 上游代码库必须与虚拟代码库位于同一位置,但可以位于不同的 Google Cloud 项目中。
      • 上游代码库必须与虚拟代码库采用相同的工件格式。
    • PRIORITY 是一个整数,表示上游仓库的优先级。优先级较高的值优先于较低的值。

    以下示例展示了一个名为 policies.json 的政策文件,其中包含四个上游代码库。upstream1priority 值最高,因此 Artifact Registry 将首先搜索它。upstream-testpriority 值最小,因此 Artifact Registry 将最后搜索它。upstream2upstream3 的优先级相同。如果 Artifact Registry 在优先级相同的代码库中找到所请求的软件包,它可以从任一代码库传送该软件包。

    [{
    "id" : "upstream1",
    "repository" : "projects/myproject/locations/us-west1/repositories/python-repo1",
    "priority" : 100
    }, {
    "id" : "upstream2",
    "repository" : "projects/myproject/locations/us-west1/repositories/python-repo2",
    "priority" : 80
    }, {
    "id" : "upstream3",
    "repository" : "projects/myproject/locations/us-west1/repositories/python-repo2",
    "priority" : 80
    }, {
    "id" : "upstream-test",
    "repository" : "projects/myproject/locations/us-west1/repositories/python-test-repo",
    "priority" : 20
    }]
    

    此示例还在优先级值之间留出了空格。这些差异可让您灵活地添加优先级介于现有值之间的上游代码库。例如,您可以添加优先级为 70upstream-3 代码库,以便 Artifact Registry 会在 upstream-test 之前搜索该代码库。

    不妨考虑将上游政策文件存储在源代码控制系统中,以便日后可以重复使用该文件,以便更改上游代码库设置并跟踪历史更改。

  2. 在包含上游政策文件的目录中,运行以下命令以创建虚拟代码库:

    gcloud artifacts repositories create VIRTUAL-REPOSITORY-NAME \
        --project=PROJECT_ID \
        --repository-format=FORMAT \
        --mode=virtual-repository \
        --location=LOCATION \
        --description="DESCRIPTION" \
        --upstream-policy-file=UPSTREAM_POLICY_FILE
    

    替换以下内容:

    • VIRTUAL-REPOSITORY-NAME 是虚拟代码库的名称。
    • PROJECT_ID 是您要在其中创建虚拟代码库的项目的 ID。如果省略此标志,则系统会使用当前项目或默认项目。
    • FORMAT 是代码库的格式。可用的值如下:
      • apt(非公开预览版)
      • docker
      • maven
      • npm
      • python
      • yum(非公开预览版)
    • LOCATION 是代码库的单区域或多区域位置。如果您设置默认值,则可以省略此标志。如需查看受支持位置的列表,请运行以下命令:

      gcloud artifacts locations list
      
    • DESCRIPTION 是代码库的可选说明。请勿包含敏感数据,因为代码库说明不会加密。

    • UPSTREAM_POLICY_FILE 是指向上游政策文件的路径。

    例如,以下命令会在 us-west1 区域中为 Python 软件包创建一个名为 virtual-repo 的虚拟代码库,该软件包采用 policies.json 中的设置。

    gcloud artifacts repositories create virtual-repo \
    --repository-format=python \
    --mode=virtual-repository \
    --location=us-west1 \
    --description="Python virtual repository" \
    --upstream-policy-file=policies.json
    

Artifact Registry 会创建虚拟代码库。

使用 Terraform 创建虚拟代码库

使用 google_artifact_registry_repository 资源创建代码库。 需要 terraform-provider-google 版本 5.0.0 或更高版本。

如果您刚开始将 Terraform 用于 Google Cloud,请参阅 HashiCorp 网站上的使用入门 - Google Cloud 页面。

以下示例定义了提供方、Terraform 资源名称为 my-repo 的虚拟仓库,以及 Terraform 资源名称为 my-repo-upstream 的上游仓库。

Docker

provider "google" {
    project = "PROJECT-ID"
}
resource "google_artifact_registry_repository" "my-repo-upstream" {
  location      = "UPSTREAM_LOCATION"
  repository_id = "UPSTREAM_REPOSITORY_ID"
  description   = "UPSTREAM_REPOSITORY_DESCRIPTION"
  format        = "docker"
}

resource "google_artifact_registry_repository" "my-repo" {
  depends_on    = []
  location      = "LOCATION"
  repository_id = "REPOSITORY_ID"
  description   = "VIRTUAL_REPOSITORY_DESCRIPTION"
  format        = "docker"
  kms_key_name = "KEY"
  mode          = "VIRTUAL_REPOSITORY"
  virtual_repository_config {
    upstream_policies {
      id          = "UPSTREAM_REPOSITORY_ID"
      repository  = google_artifact_registry_repository.my-repo-upstream.id
      priority    = PRIORITY
    }
  }
}

地点

  • PROJECT-ID 是 Google Cloud 项目 ID。
  • UPSTREAM_LOCATION 是上游仓库位置。请注意,虚拟代码库和上游必须位于同一区域或多区域中。
  • UPSTREAM_REPOSITORY_ID 是上游代码库 ID。
  • UPSTREAM_REPOSITORY_DESCRIPTION 是上游仓库的可选说明。
  • LOCATION 是虚拟代码库位置。
  • REPOSITORY_ID 是虚拟代码库 ID。
  • DESCRIPTION 是虚拟代码库的可选说明。请勿包含敏感数据,因为代码库说明未加密。
  • 如果您使用客户管理的加密密钥 (CMEK) 进行加密,则 KEY 是 Cloud Key Management Service 密钥的名称。省略此参数可使用默认设置,即 Google 管理的加密密钥。
  • PRIORITY 是可选的优先级值。最高优先级为 1。优先级值较高的条目按拉取顺序优先。

Maven

如果您未指定版本政策,Artifact Registry 会创建一个 Maven 制品库,该制品库默认存储软件包的快照和发布版本

provider "google" {
    project = "PROJECT-ID"
}
resource "google_artifact_registry_repository" "my-repo-upstream" {
  location      = "UPSTREAM_LOCATION"
  repository_id = "UPSTREAM_REPOSITORY_ID"
  description   = "UPSTREAM_REPOSITORY_DESCRIPTION"
  format        = "maven"
}

resource "google_artifact_registry_repository" "my-repo" {
  depends_on    = []
  location      = "LOCATION"
  repository_id = "REPOSITORY_ID"
  description   = "VIRTUAL_REPOSITORY_DESCRIPTION"
  format        = "maven"
  kms_key_name = "KEY"
  mode          = "VIRTUAL_REPOSITORY"
  virtual_repository_config {
    upstream_policies {
      id          = "UPSTREAM_REPOSITORY_ID"
      repository  = google_artifact_registry_repository.my-repo-upstream.id
      priority    = PRIORITY
    }
  }
}

地点

  • PROJECT-ID 是 Google Cloud 项目 ID。
  • UPSTREAM_LOCATION 是上游仓库位置。请注意,虚拟代码库和上游必须位于同一区域或多区域中。
  • UPSTREAM_REPOSITORY_ID 是上游代码库 ID。
  • UPSTREAM_REPOSITORY_DESCRIPTION 是上游仓库的可选说明。
  • LOCATION 是虚拟代码库位置。
  • REPOSITORY_ID 是虚拟代码库 ID。
  • DESCRIPTION 是虚拟代码库的可选说明。请勿包含敏感数据,因为代码库说明未加密。
  • 如果您使用客户管理的加密密钥 (CMEK) 进行加密,则 KEY 是 Cloud Key Management Service 密钥的名称。省略此参数可使用默认设置,即 Google 管理的加密密钥。
  • PRIORITY 是可选的优先级值。最高优先级为 1。优先级值较高的条目按拉取顺序优先。

如需在不同的代码库中存储快照和发布版本,请使用 maven_config 块指定代码库的版本政策。此块支持以下设置:

  • version_policy 会将版本政策设置为以下值之一:
    • VERSION_POLICY_UNSPECIFIED:存储快照和发布软件包。这是默认设置。
    • 发布:仅存储发布版软件包。
    • 快照:仅存储快照软件包。
  • allow_snapshot_overwrites 用于配置具有 SNAPSHOT 版本政策的代码库,以接受覆盖代码库中现有版本的非唯一快照。

以下示例定义了具有发布版本政策的 Maven 制品库。

provider "google" {
project = "my-project"
}

resource "google_artifact_registry_repository" "my-repo" {
provider = google-beta

location = "us-central1"
repository_id = "my-repo"
description = "Maven repository"
format = "MAVEN"
maven_config {
  version_policy = "RELEASE"
}
}

npm

provider "google" {
    project = "PROJECT-ID"
}
resource "google_artifact_registry_repository" "my-repo-upstream" {
  location      = "UPSTREAM_LOCATION"
  repository_id = "UPSTREAM_REPOSITORY_ID"
  description   = "UPSTREAM_REPOSITORY_DESCRIPTION"
  format        = "npm"
}

resource "google_artifact_registry_repository" "my-repo" {
  depends_on    = []
  location      = "LOCATION"
  repository_id = "REPOSITORY_ID"
  description   = "VIRTUAL_REPOSITORY_DESCRIPTION"
  format        = "npm"
  kms_key_name = "KEY"
  mode          = "VIRTUAL_REPOSITORY"
  virtual_repository_config {
    upstream_policies {
      id          = "UPSTREAM_REPOSITORY_ID"
      repository  = google_artifact_registry_repository.my-repo-upstream.id
      priority    = PRIORITY
    }
  }
}

地点

  • PROJECT-ID 是 Google Cloud 项目 ID。
  • UPSTREAM_LOCATION 是上游仓库位置。请注意,虚拟代码库和上游必须位于同一区域或多区域中。
  • UPSTREAM_REPOSITORY_ID 是上游代码库 ID。
  • UPSTREAM_REPOSITORY_DESCRIPTION 是上游仓库的可选说明。
  • LOCATION 是虚拟代码库位置。
  • REPOSITORY_ID 是虚拟代码库 ID。
  • DESCRIPTION 是虚拟代码库的可选说明。请勿包含敏感数据,因为代码库说明未加密。
  • 如果您使用客户管理的加密密钥 (CMEK) 进行加密,则 KEY 是 Cloud Key Management Service 密钥的名称。省略此参数可使用默认设置,即 Google 管理的加密密钥。
  • PRIORITY 是可选的优先级值。最高优先级为 1。优先级值较高的条目按拉取顺序优先。

Python

provider "google" {
    project = "PROJECT-ID"
}
resource "google_artifact_registry_repository" "my-repo-upstream" {
  location      = "UPSTREAM_LOCATION"
  repository_id = "UPSTREAM_REPOSITORY_ID"
  description   = "UPSTREAM_REPOSITORY_DESCRIPTION"
  format        = "python"
}

resource "google_artifact_registry_repository" "my-repo" {
  depends_on    = []
  location      = "LOCATION"
  repository_id = "REPOSITORY_ID"
  description   = "VIRTUAL_REPOSITORY_DESCRIPTION"
  format        = "python"
  kms_key_name = "KEY"
  mode          = "VIRTUAL_REPOSITORY"
  virtual_repository_config {
    upstream_policies {
      id          = "UPSTREAM_REPOSITORY_ID"
      repository  = google_artifact_registry_repository.my-repo-upstream.id
      priority    = PRIORITY
    }
  }
}

地点

  • PROJECT-ID 是 Google Cloud 项目 ID。
  • UPSTREAM_LOCATION 是上游仓库位置。请注意,虚拟代码库和上游必须位于同一区域或多区域中。
  • UPSTREAM_REPOSITORY_ID 是上游代码库 ID。
  • UPSTREAM_REPOSITORY_DESCRIPTION 是上游仓库的可选说明。
  • LOCATION 是虚拟代码库位置。
  • REPOSITORY_ID 是虚拟代码库 ID。
  • DESCRIPTION 是虚拟代码库的可选说明。请勿包含敏感数据,因为代码库说明未加密。
  • 如果您使用客户管理的加密密钥 (CMEK) 进行加密,则 KEY 是 Cloud Key Management Service 密钥的名称。省略此参数可使用默认设置,即 Google 管理的加密密钥。
  • PRIORITY 是可选的优先级值。最高优先级为 1。优先级值较高的条目按拉取顺序优先。

Artifact Registry 会创建您的代码库。运行以下命令以查看代码库的说明:

gcloud artifacts repositories describe REPOSITORY \
    --location=LOCATION

创建代码库后,请执行以下操作:

更新上游仓库

您可以更改上游代码库列表或调整上游代码库的优先级。

控制台

  1. 打开 Google Cloud 控制台中的制品库页面。

    打开“代码库”页面

  2. 在代码库列表中,选择虚拟代码库,然后点击修改代码库

  3. Virtual Repository Upstream 列表中,进行所需更改。 您可以添加和移除代码库,也可以在列表中更改代码库的优先级

  4. 点击保存

gcloud

  1. 使用所做更改修改上游政策文件。例如,您可能需要添加上游仓库或调整优先级设置。

    如果您要移除所有上游代码库,政策文件应包含一组空的代码库。

    []
    
  2. 运行以下命令以将更改应用于虚拟代码库。

    gcloud artifacts repositories update REPOSITORY \
        --upstream-policy-file=UPSTREAM_POLICY_FILE
    

    UPSTREAM_POLICY_FILE 替换为上游政策文件的路径。

    如需详细了解该命令,请参阅 gcloudartifact repositories update 参考文档。

修改代码库说明

您可以通过 Google Cloud 控制台或 gcloud CLI 更改代码库说明。

控制台

  1. 打开 Google Cloud 控制台中的制品库页面。

    打开“代码库”页面

  2. 在代码库列表中,选择代码库,然后点击修改代码库

  3. 修改代码库说明,然后点击保存

gcloud

如需更新代码库说明,请运行以下命令:

gcloud artifacts repositories update REPOSITORY \
    --project=PROJECT] \
    --location=LOCATION \
    --description="DESCRIPTION"

替换以下值:

  • REPOSITORY 是代码库的名称。如果您配置了默认代码库,则可以省略此标志以使用默认值。
  • PROJECT 是 Google Cloud 项目 ID。如果省略此标志,则系统会使用当前项目或默认项目。
  • LOCATION 是单区域或多区域位置。使用此标志可查看特定位置的代码库。如果您配置了默认位置,可以省略此标志,以便使用默认位置。
  • DESCRIPTION 是代码库的说明。