将 Cloud Build 连接到 Private Service Connect 实例

您可以使用Cloud Build 专用池将 Cloud Build 连接到 Secure Source Manager Private Service Connect 实例。 与使用 Developer Connect 相比,这种连接方式更为 复杂。如果您不希望公开 Git 代理端点,请使用本指南中介绍的方法。

准备工作

  1. 创建 Private Service Connect Secure Source Manager 实例
  2. 如果您之前为 Private Service Connect 实例配置了端点,则必须断开这些端点的连接。如需 释放端点,请按照 释放静态内部 IPv4 或 IPv6 地址中的说明操作。
  3. 启用 Cloud Build API、Service Networking API 和 Compute Engine API。

    启用 API 所需的角色

    如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予 角色

    启用 API

所需的角色

如需获得将 Cloud Build 连接到 Private Service Connect Secure Source Manager 实例所需的权限,请让您的管理员为您授予组织的Access Context Manager Admin 角色 (roles/accesscontextmanager.policyAdmin) IAM 角色。

配置服务帐号

如需在 Cloud Build 中遵循最小权限原则,您可以将 Cloud Build 配置为使用具有执行构建所需的最低权限的服务 账号。

如果您未指定服务帐号,Cloud Build 可能会自动选择一个服务帐号来代表您执行构建。此服务帐号可能具有不必要的广泛权限,例如访问您的 Secure Source Manager 实例以及项目中的任何代码库。

  1. 如果您还没有要使用的服务账号 ,请创建一个。

  2. 在 Google Cloud 控制台中,前往 Secure Source Manager 权限 页面:

    前往权限

  3. 服务账号权限 标签页中,选择您要用作 Cloud Build 服务帐号的服务帐号。

  4. (可选)选择设置为首选服务账号 ,以便在您创建新触发器时预先填充您的服务帐号。

向服务帐号授予所需权限

  1. 向服务帐号授予您的使用场景所需的 Cloud Build 角色。如需了解不同 Cloud Build 操作所需的 Cloud Build 角色,请参阅 配置对 Cloud Build 的访问权限

  2. 如需向服务帐号授予检索 CA 证书的权限,请运行以下命令。

    gcloud projects add-iam-policy-binding CA_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/privateca.auditor \
      --condition=None
    

    替换以下内容:

    • CA_PROJECT_ID:替换为 CA 池项目的项目 ID。
    • SA_EMAIL:替换为您设置为 Cloud Build 服务帐号的服务帐号的电子邮件地址。
  3. 如需向服务帐号授予访问 Secure Source Manager 实例的权限,请运行以下命令。

    gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/securesourcemanager.instanceAccessor \
      --condition=None
    
  4. 如需向服务帐号授予从 Secure Source Manager 代码库读取的权限,请运行以下命令。

    gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/securesourcemanager.repoReader \
      --condition=None
    

设置构建日志

如果您为构建指定自己的服务帐号,则必须将构建日志存储在 Cloud Logging 或用户创建的 Cloud Storage 存储桶中。您不能将日志存储在默认日志存储桶中。

如需将构建日志存储在 Cloud Logging 中,请向您的 Cloud Build 服务帐号授予 Logs Writer (roles/logging.logWriter) 角色

如需详细了解如何设置构建日志,请参阅 配置用户指定的服务账号

创建专用 Cloud DNS 区域

如需创建代管式专用 Cloud DNS 区域,请运行以下命令。

gcloud dns managed-zones create ZONE_NAME \
    --project=PROJECT_ID \
    --description=DESCRIPTION \
    --dns-name="INSTANCE_LOCATION.p.sourcemanager.dev." \
    --visibility="private" \
    --networks="https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK"

替换以下内容:

  • ZONE_NAME:替换为您要为代管式区域指定的名称。
  • PROJECT_ID:替换为您要用于 Cloud DNS 区域的 Google Cloud 项目的项目 ID。
  • DESCRIPTION:替换为区域的说明。
  • INSTANCE_LOCATION:替换为您要在其中创建 Secure Source Manager 实例的位置。

如需详细了解代管式专用 Cloud DNS 区域,请参阅 Cloud DNS 概览

配置虚拟私有云 (VPC) 网络

  1. 预留您要用于将 Secure Source Manager VPC 与 Cloud Build 专用池对等互连的 IP 范围。

     gcloud compute addresses create CB_PEER_RANGE \
      --global \
      --purpose=VPC_PEERING \
      --prefix-length=24 \
      --description="IP range for peering with Cloud Build private pool" \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID
    

    替换以下内容:

    • CB_PEER_RANGE:替换为要创建的地址的名称。
    • NETWORK:替换为应在其中预留地址的网络资源。如果您使用的是 默认网络,则值为 default
    • INSTANCE_PROJECT_ID:替换为 Private Service Connect 实例项目 ID。
  2. 如需创建与 servicenetworking.googleapis.com 的 VPC 对等互连,请运行以下命令。

    gcloud services vpc-peerings connect \
      --service=servicenetworking.googleapis.com \
      --ranges=CB_PEER_RANGE \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID
    
  3. 如需创建与 Cloud Build 连接的对等互连 DNS 网域,请运行以下命令。

    gcloud services peered-dns-domains create DNS_PEERING_DOMAIN \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID \
      --dns-suffix=INSTANCE_LOCATION.p.sourcemanager.dev.
    

    替换以下内容:

    • DNS_PEERING_DOMAIN:替换为您要创建的对等互连 DNS 网域的名称。

    必须明确共享专用 DNS 区域。如需详细了解如何共享 专用 DNS 区域,请参阅 与服务提供方共享专用 DNS 区域

  4. 如需将网络路由导出到 Cloud Build,请运行以下命令。

    gcloud compute networks peerings update servicenetworking-googleapis-com \
      --network=NETWORK \
      --export-custom-routes \
      --no-export-subnet-routes-with-public-ip \
      --project=INSTANCE_PROJECT_ID
    
  5. 如需在与 Private Service Connect 实例相同的 Google Cloud 项目中创建 Cloud Build 专用池,请运行以下 命令。

    gcloud builds worker-pools create PRIVATE_POOL_ID \
      --project=INSTANCE_PROJECT_ID \
      --region=INSTANCE_LOCATION \
      --peered-network=projects/INSTANCE_PROJECT_ID/global/networks/NETWORK \
      --worker-disk-size=100 \
      --no-public-egress
    

    其中,PRIVATE_POOL_ID 是您要创建的专用池的名称。该名称的长度必须介于 1 到 63 个字符之间,并且有效字符为 [a-zA-Z0-9_-]+

  6. 如需为 HTTP 端点创建 Private Service Connect 网络端点组 (NEG),请运行以下命令:

    gcloud compute network-endpoint-groups create HTTP_NEG_NAME \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION \
        --network-endpoint-type=PRIVATE_SERVICE_CONNECT \
        --psc-target-service=HTTP_PSC \
        --network=NETWORK --subnet=SUBNET
    

    其中:

    • HTTP_NEG_NAME 是您要为 HTTP 端点创建的 NEG 的名称。
    • HTTP_PSC 是 HTTP Private Service Connect 端点值。
  7. 如需为 SSH 端点创建 Private Service Connect NEG,请运行以下命令:

    gcloud compute network-endpoint-groups create SSH_NEG_NAME \
      --project=INSTANCE_PROJECT_ID \
      --region=INSTANCE_LOCATION \
      --network-endpoint-type=PRIVATE_SERVICE_CONNECT \
      --psc-target-service=SSH_PSC \
      --network=NETWORK --subnet=SUBNET
    

    其中:

    • SSH_NEG_NAME 是您要为 SSH 端点创建的 NEG 的名称。
    • SSH_PSC 是 SSH Private Service Connect 端点值。

设置代理内部负载均衡器 (ILB)

无法从对等互连的 VPC 网络访问端点。如需访问 Secure Source Manager 端点,您必须为每个端点设置 L4 内部负载均衡器 (ILB)。如需详细了解如何通过端点访问已发布的服务,请参阅 通过端点访问已发布服务的简介

  1. 如需为 ILB 创建代理专用子网,请运行 以下命令。

    gcloud compute networks subnets create ILB_PROXY_SUBNET_NAME \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=INSTANCE_LOCATION \
    --network=NETWORK \
    --range=CIDR_RANGE \
    --project=INSTANCE_PROJECT_ID
    

    其中:

    • ILB_PROXY_SUBNET_NAME 是要创建的子网的名称。
    • CIDR_RANGE 是该子网的主要 IP 地址范围。使用的子网掩码长度不得超过 26,以确保至少有 64 个 IP 地址可用于该区域中的代理。建议的子网掩码长度为 /23。如需详细了解代理专用子网,请参阅 基于 Envoy 的负载平衡器的代理专用子网
  2. 如需为 HTTP 连接 NEG 创建 L4 ILB,请运行以下命令。

    gcloud compute backend-services create HTTP_PROXY_ILB \
      --project=INSTANCE_PROJECT_ID \
      --region=INSTANCE_LOCATION \
      --load-balancing-scheme=INTERNAL_MANAGED
    

    其中,HTTP_PROXY_ILB 是要为 HTTP 端点创建的 ILB 的名称。

  3. 如需为 SSH 连接 NEG 创建 L4 ILB,请运行以下命令。

    gcloud compute backend-services create SSH_PROXY_ILB \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION \
        --load-balancing-scheme=INTERNAL_MANAGED
    

    其中,SSH_PROXY_ILB 是要为 SSH 端点创建的 ILB 的名称。

将 Private Service Connect NEG 注册为 ILB 的后端

  1. 如需注册 HTTP NEG,请运行以下命令。

    gcloud compute backend-services add-backend HTTP_PROXY_ILB \
      --network-endpoint-group=HTTP_NEG_NAME \
      --network-endpoint-group-region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    
  2. 如需注册 SSH NEG,请运行以下命令。

    gcloud compute backend-services add-backend SSH_PROXY_ILB \
      --network-endpoint-group=SSH_NEG_NAME \
      --network-endpoint-group-region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    

为 ILB 创建目标 TCP 代理

  1. 如需为 HTTP ILB 创建目标 TCP 代理,请运行以下命令。

    gcloud compute target-tcp-proxies create ILB_HTTP_TCP_TARGET_PROXY \
      --backend-service=HTTP_PROXY_ILB \
      --region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    

    其中,ILB_HTTP_TCP_TARGET_PROXY 是您要为 HTTP ILB 创建的目标 TCP 代理的名称。

  2. 如需为 SSH ILB 创建目标 TCP 代理,请运行以下命令。

    gcloud compute target-tcp-proxies create ILB_SSH_TCP_TARGET_PROXY \
      --backend-service=SSH_PROXY_ILB \
      --region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    

    其中,ILB_SSH_TP_TARGET_PROXY 是您要为 SSH ILB 创建的目标 TCP 代理的名称。

创建转发规则以将流量路由到 ILB

  1. 如需创建用于将流量路由到 HTTP ILB 的转发规则,请运行以下命令。

    gcloud compute forwarding-rules create HTTP_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --ports 443 \
        --target-tcp-proxy=ILB_HTTP_TCP_TARGET_PROXY \
        --target-tcp-proxy-region=INSTANCE_LOCATION \
        --network-tier PREMIUM \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=NETWORK \
        --subnet=SUBNET \
        --subnet-region=INSTANCE_LOCATION
    

    其中,HTTP_PROXY_FORWARD 是您要创建的转发规则的名称。

  2. 如需创建用于将流量路由到 SSH ILB 的转发规则,请运行以下命令。

    gcloud compute forwarding-rules create SSH_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --ports 22 \
        --target-tcp-proxy=ILB_SSH_TCP_TARGET_PROXY \
        --target-tcp-proxy-region=INSTANCE_LOCATION \
        --network-tier PREMIUM \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=NETWORK \
        --subnet=SUBNET \
        --subnet-region=INSTANCE_LOCATION
    

    其中,SSH_PROXY_FORWARD 是您要创建的转发规则的名称。

创建专用 DNS 记录

设置转发规则后,您需要在专用 Cloud DNS 区域中为每个实例的主机名注册 DNS 记录。

  1. 如需获取 HTTP 转发规则的 IP 地址,请运行以下命令。

    gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION
    

    其中,HTTP_PROXY_FORWARD 是您为 HTTP 转发规则指定的名称。

  2. 如需注册 API 主机名,请运行以下命令。

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-api.INSTANCE_LOCATION.p.sourcemanager.dev. \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
        --rrdatas=HTTP_LB_IP
    

    替换以下内容:

    • INSTANCE_ID:替换为您的实例 ID。
    • INSTANCE_PROJECT_NUMBER:替换为您的实例的 Google Cloud 项目编号。
    • INSTANCE_LOCATION:替换为您的实例的区域。
    • INSTANCE_PROJECT_ID:替换为您的实例的 Google Cloud 项目 ID。
    • ZONE_NAME:替换为您为代管式区域指定的名称。
    • HTTP_LB_IP:是 gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD 的输出。
  3. 如需注册 Git HTTP 主机名,请运行以下命令。

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev. \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
        --rrdatas=HTTP_LB_IP
    
  4. 如需注册网页界面的 HTML 主机名,请运行以下命令。

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER.INSTANCE_LOCATION.p.sourcemanager.dev.\
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
      --rrdatas=HTTP_LB_IP
    
  5. 如需获取 SSH 转发规则的 IP 地址,请运行以下命令。

    gcloud compute forwarding-rules describe SSH_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION
    

    其中,SSH_PROXY_FORWARD 是您为 SSH 转发规则指定的名称。

  6. 如需注册 Git SSH 主机名,请运行以下命令。

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-ssh.INSTANCE_LOCATION.p.sourcemanager.dev. \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
        --rrdatas=SSH_LB_IP
    

    其中,SSH_LB_IPgcloud compute forwarding-rules describe SSH_PROXY_FORWARD 的输出。

在实例中创建代码库

您可以使用堡垒主机在 Private Service Connect 实例中访问和创建代码库。

  1. 按照创建堡垒主机虚拟机中的说明,使用 cloud-platform 范围 创建堡垒主机虚拟机。

  2. 运行以下命令以创建代码库。

    curl \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://INSTANCE_ID-PROJECT_NUMBER-api.INSTANCE_LOCATION.p.sourcemanager.dev/v1/projects/PROJECT_NUMBER/locations/INSTANCE_LOCATION/repositories?repository_id=REPOSITORY_ID \
    -d '{}'
    

    替换以下内容:

    • INSTANCE_ID:替换为 Secure Source Manager 实例的名称。
    • PROJECT_NUMBER:替换为实例的项目编号。 Google Cloud
    • INSTANCE_LOCATION:替换为实例的位置。
    • REPOSITORY_ID:替换为您要为代码库指定的名称。

    系统会在 Private Service Connect 实例中创建一个代码库。

测试从 Cloud Build 对 Secure Source Manager 的访问权限

如需确认一切正常运行,您可以使用以下构建配置文件测试连接并从 Secure Source Manager 拉取源代码。 构建配置文件假定您使用 Cloud Logging 存储构建日志。如果您使用的是用户创建的 Cloud Storage 存储桶,请参阅 使用配置文件执行构建,了解如何修改构建配置文件。

在使用以下 YAML 文件之前,请替换以下内容:

  • CA_POOL_NAME:替换为您在创建 Private Service Connect 实例时使用的 CA 池名称。
  • CA_PROJECT_ID:替换为您用于创建 Google Cloud CA 池的 项目。
  • INSTANCE_LOCATION:替换为实例的位置。
  • INSTANCE_ID:替换为实例的名称。
  • INSTANCE_PROJECT_NUMBER:替换为实例的 Google Cloud 项目 编号。
  • REPOSITORY_ID:替换为您为代码库指定的名称。
  • SA_PROJECT_ID:替换为您在 Cloud Build 中使用的服务帐号的项目 ID。
  • SERVICE_ACCOUNT:替换为您在 Cloud Build 中使用的服务帐号的电子邮件地址。
steps:
  - name: gcr.io/cloud-builders/gcloud
    args:
      - privateca
      - pools
      - get-ca-certs
      - CA_POOL_NAME
      - '--project'
      - CA_PROJECT_ID
      - '--location'
      - INSTANCE_LOCATION
      - '--output-file=cacert.pem'
  - name: gcr.io/cloud-builders/git
    args:
      - config
      - '--global'
      - 'credential.https://INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev.helper'
      - gcloud.sh
  - name: gcr.io/cloud-builders/git
    args:
      - config
      - '--global'
      - http.sslCAInfo
      - cacert.pem
  - name: gcr.io/cloud-builders/git
    env:
      - GIT_TRACE=1
      - GIT_CURL_VERBOSE=1
    args:
      - clone
      - >-
        https://INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev/INSTANCE_PROJECT_ID/REPOSITORY_ID
      - https-clone
serviceAccount: 'projects/SA_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT'
options:
  logging: CLOUD_LOGGING_ONLY

后续步骤

  • 如需自动执行来自 Secure Source Manager 的构建,请按照 创建触发器文件中的说明操作。