将 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,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 拥有此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获取此权限。 了解如何授予角色。

    启用 API

所需的角色

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

配置服务账号

为了在 Cloud Build 中遵循最小权限原则,您可以配置 Cloud Build 以使用具有足够权限来执行构建的服务账号。

如果您未指定服务账号,Cloud Build 可能会自动选择一个服务账号来代表您执行 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
    

设置构建日志

如果您为 build 指定了自己的服务账号,则必须将 build 日志存储在 Cloud Logging 或用户创建的 Cloud Storage 存储桶中。您无法将日志存储在默认日志存储桶中。

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

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

创建专用 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. 如需创建对等互连 DNS 网域以与 Cloud Build 连接,请运行以下命令。

    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:替换为您的实例的项目 ID。 Google Cloud
    • 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_IP 是 gcloud 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 的访问权限

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

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

  • CA_POOL_NAME:您在创建 Private Service Connect 实例时使用的 CA 池名称。
  • CA_PROJECT_ID:与您用于创建 CA 池的项目。 Google Cloud
  • 将 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 的 build,请按照创建触发器文件中的说明操作。