创建虚拟代码库

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

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

其他代码库模式包括:

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

如需详细了解虚拟代码库的运作方式,请参阅虚拟代码库概览

准备工作

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

所需的角色

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

  • 创建虚拟制品库并授予对各个制品库的访问权限: Google Cloud 项目的 Artifact Registry Administrator (roles/artifactregistry.admin)
  • 在项目级别授予对代码库的访问权限: 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 服务代理对上游代码库进行身份验证。您必须向服务代理授予对上游代码库的读取权限。

    您可以在项目级向 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 拥有和 Google 管理 的加密密钥或客户管理的加密密钥进行加密。默认情况下,Artifact Registry 使用的 Google 拥有且由 Google 管理 的加密密钥。

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

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

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

    打开“代码库”页面

  2. 点击创建代码库

  3. 指定代码库名称。对于项目中的每个代码库位置,代码库名称不得重复。

  4. 选择代码库格式。

  5. 仓库模式下,选择虚拟

  6. 虚拟代码库上游下,点击添加上游以添加上游代码库。

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

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

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

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

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

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

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

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

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

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

    • Google-managed encryption key - 使用 Google-owned and Google-managed encryption key加密代码库内容。
    • 客户管理的密钥 - 使用您通过 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
      • go
      • 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 for 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 拥有且由 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 拥有且由 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 拥有且由 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 拥有且由 Google 管理的 加密密钥。
  • PRIORITY 是可选的优先级值。最高优先级为 1。优先级值较高的条目在拉取顺序中优先。

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

gcloud artifacts repositories describe REPOSITORY \
    --location=LOCATION

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

更新上游代码库

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

控制台

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

    打开“代码库”页面

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

  3. 虚拟代码库上游列表中,进行必要的更改。您可以添加和移除代码库,或更改列表中代码库的优先级

  4. 点击保存

gcloud

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

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

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

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

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

    如需详细了解该命令,请参阅 gcloud artifacts 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:代码库的说明。