将 Cloud Build 连接到 Private Service Connect 实例

您可以使用 Cloud Build 专用池将 Cloud Build 连接到 Secure Source Manager Private Service Connect 实例。

准备工作

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

    Enable the APIs

所需的角色

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

配置服务账号

为了在 Cloud Build 中遵循最低权限原则,您可以将 Cloud Build 配置为使用仅具有执行 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
    

设置 build 日志

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

如需将构建日志存储在 Cloud Logging 中,请向您的 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 概览

配置 Virtual Private Cloud (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 beta 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 beta 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 的访问权限

如需确认一切正常运行,您可以使用以下 build 配置文件来测试连接性并从 Secure Source Manager 中拉取源代码。构建配置文件假定您使用 Cloud Logging 来存储构建日志。如果您使用的是用户创建的 Cloud Storage 存储桶,请参阅使用配置文件执行 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,请按照创建触发器文件中的说明操作。