连接到 Bitbucket 数据中心主机

本页介绍了如何将 Bitbucket 数据中心主机连接到 Cloud Build。

准备工作

  • Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  • 在 Bitbucket 数据中心代码库中准备好源代码。
  • Bitbucket 数据中心源代码库中包含 DockerfileCloud Build 配置文件
  • 如果您尚未安装 Bitbucket 数据中心实例,请参阅安装 Bitbucket 数据中心
  • 如需使用此页面上的 gcloud 命令,请安装 Google Cloud CLI

必需的 IAM 权限

  • 如需获得连接 Bitbucket 数据中心主机所需的权限,请让管理员为您授予用户账号的 Cloud Build Connection Admin (roles/cloudbuild.connectionAdmin) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限。

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

连接到 Bitbucket 数据中心主机

在为 Bitbucket 数据中心实例创建主机连接之前,您必须完成以下步骤,在 Bitbucket 数据中心中创建个人访问令牌:

  1. 登录您的 Bitbucket 数据中心实例。

  2. 按照相关说明为您的用户账号创建 HTTP 访问令牌

    1. 创建一个具有代码库管理员范围的访问令牌,用于与代码库建立连接和断开连接。

    2. 创建一个具有代码库读取范围的访问令牌,以确保 Cloud Build 代码库可以访问代码库中的源代码。

控制台

如需将 Bitbucket 数据中心主机连接到 Cloud Build,请执行以下操作:

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

    打开“代码库”页面

    您将看到代码库页面。

  2. 在页面顶部,选择第 2 代标签页。

  3. 在顶部栏的项目选择器中,选择您的 Google Cloud 项目。

  4. 点击创建主机连接,将新主机连接到 Cloud Build。

  5. 在左侧面板中,选择 Bitbucket 作为源代码提供商。

  6. 配置连接部分中,输入以下信息:

    1. 区域:为您的连接选择区域。您必须指定一个地区。您的连接不能全局存在。

    2. 名称:输入连接的名称。

  7. 主机详细信息部分,选择或输入以下信息:

    1. Bitbucket 主机:选择 Bitbucket 数据中心作为主机。

    2. 主机网址:输入 Bitbucket 数据中心主机的网址

  8. 网络部分中,选择以下选项之一:

    1. 公共互联网:如果您的实例可通过公共互联网访问,请选择此选项。

    2. 专用网络:如果您的实例托管在专用网络上,请选择此选项。

      1. CA 证书:您的自签名证书。点击浏览,从本地机器打开证书。

        您的证书大小不得超过 10 KB,并且应采用 PEM 格式(.pem.cer.crt)。如果您将此字段留空,Cloud Build 将使用一组默认证书中的证书。

      2. Service Directory 服务部分,选择服务的位置。您可以接受预先填充的项目 ID,也可以指定其他项目。

        1. 选择您的服务对应的项目。您可以接受预先填充的项目,选择在其他项目中进行浏览,或选择手动输入

          如果您选择此选项,请输入以下信息:

          • Project(项目):输入或从下拉菜单中选择您的 Google Cloud项目 ID。

          • 区域:此字段会预先选择连接所在的区域。为您的服务指定的区域必须与与您的连接关联的区域一致。

        2. 命名空间:选择服务的命名空间。

        3. 服务:选择您命名空间中的服务名称。

  9. HTTP 访问令牌部分中,输入以下信息:

    1. 管理员访问令牌:输入具有 repository admin 范围访问权限的令牌。此令牌用于与代码库建立连接和断开连接。

    2. 读取访问令牌:输入具有 repository read 范围访问权限的令牌。Cloud Build 触发器使用此令牌访问代码库中的源代码。

  10. 点击连接

    点击 Connect(连接)按钮后,您的个人访问令牌会安全地存储在 Secret Manager 中。连接到 Bitbucket 数据中心主机后,Cloud Build 会代表您创建一个网络钩子密钥。您可以在 Secret Manager 页面上查看和管理 Secret。

gcloud

  1. 将令牌存储在 Secret Manager 中

  2. 运行以下命令在 Secret Manager 中创建网络钩子 Secret,其中 WEBHOOK_SECRET 是您要为网络钩子 Secret 指定的名称:

      cat /proc/sys/kernel/random/uuid | tr -d '\n' | gcloud secrets create WEBHOOK_SECRET --data-file=-
    
  3. 如果您将 Secret 存储在与计划用于创建主机连接的项目不同的项目中,请运行以下命令,向您的项目授予对 Cloud Build 服务代理的访问权限: Google Cloud

    PN=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
    CLOUD_BUILD_SERVICE_AGENT="service-${PN}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${CLOUD_BUILD_SERVICE_AGENT}" \ \
        --role="roles/secretmanager.admin"
    

    其中:

    • PROJECT_ID 是您的 Google Cloud 项目 ID。

现在,您可以继续将 Bitbucket 数据中心主机连接到 Cloud Build。

  1. 运行以下命令以创建 Bitbucket 数据中心连接:

    gcloud builds connections create bitbucket-data-center CONNECTION_NAME \
        --host-uri=HOST_URI \
        --project=PROJECT_ID \
        --region=REGION \
        --authorizer-token-secret-version=projects/PROJECT_ID/secrets/ADMIN_TOKEN/versions/SECRET_VERSION \
        --read-authorizer-token-secret-version=projects/PROJECT_ID/secrets/READ_TOKEN/versions/SECRET_VERSION \
        --webhook-secret-secret-version=projects/PROJECT_ID/secrets/WEBHOOK_SECRET/versions/SECRET_VERSION
     ```
    
    Where:
    
    • CONNECTION_NAME 是连接的名称。
    • HOST_URI 是 Bitbucket 数据中心实例的 URI。
    • PROJECT_ID 是您的 Google Cloud 项目 ID
    • REGION 是连接的区域
    • ADMIN_TOKEN 是具有 repository admin 范围的令牌的名称。
    • READ_TOKEN 是具有 repository read 范围的令牌的名称。
    • SECRET_VERSION 是您的 Secret 的版本。
    • WEBHOOK_SECRET 是您的 webhook Secret。

Terraform

您可以使用 Terraform 将 Bitbucket 数据中心主机连接到 Cloud Build。

在以下示例中,代码段会执行以下操作:

  • 配置 Terraform Google 提供程序。
  • 创建一个 Secret Manager Secret 以存储 Bitbucket 令牌。
  • 向 Cloud Build 服务代理授予必要的权限,以便其访问 Secret。
  • 创建 Bitbucket 数据中心连接。

    // Configure the Terraform Google provider
    terraform {
      required_providers {
        google = {}
      }
    }
    
    provider "google" {
      project = "PROJECT_ID"
      region = "REGION"
    }
    
    // Create secrets and grant permissions to the Cloud Build service agent
    resource "google_secret_manager_secret" "admin-token-secret" {
        project = "PROJECT_ID"
        secret_id = "ADMIN_TOKEN_NAME"
    
        replication {
            auto {}
        }
    }
    
    resource "google_secret_manager_secret_version" "admin-token-secret-version" {
        secret = google_secret_manager_secret.admin-token-secret.id
        secret_data = "ADMIN_TOKEN_VALUE"
    }
    
    resource "google_secret_manager_secret" "read-token-secret" {
        project = "PROJECT_ID"
        secret_id = "READ_TOKEN_NAME"
    
        replication {
            auto {}
        }
    }
    
    resource "google_secret_manager_secret_version" "read-token-secret-version" {
        secret = google_secret_manager_secret.read-token-secret.id
        secret_data = "READ_TOKEN_VALUE"
    }
    
    resource "google_secret_manager_secret" "webhook-secret-secret" {
        project = "PROJECT_ID"
        secret_id = "WEBHOOK_SECRET_NAME"
    
        replication {
            auto {}
        }
    }
    
    resource "google_secret_manager_secret_version" "webhook-secret-secret-version" {
        secret = google_secret_manager_secret.webhook-secret-secret.id
        secret_data = "WEBHOOK_SECRET_VALUE"
    }
    
    data "google_iam_policy" "p4sa-secretAccessor" {
        binding {
            role = "roles/secretmanager.secretAccessor"
            members = ["serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com"]
        }
    }
    
    resource "google_secret_manager_secret_iam_policy" "policy-pak" {
      project = google_secret_manager_secret.admin-token-secret.project
      secret_id = google_secret_manager_secret.admin-token-secret.secret_id
      policy_data = data.google_iam_policy.p4sa-secretAccessor.policy_data
    }
    
    resource "google_secret_manager_secret_iam_policy" "policy-rpak" {
      project = google_secret_manager_secret.read-token-secret.project
      secret_id = google_secret_manager_secret.read-token-secret.secret_id
      policy_data = data.google_iam_policy.p4sa-secretAccessor.policy_data
    }
    
    resource "google_secret_manager_secret_iam_policy" "policy-whs" {
      project = google_secret_manager_secret.webhook-secret-secret.project
      secret_id = google_secret_manager_secret.webhook-secret-secret.secret_id
      policy_data = data.google_iam_policy.p4sa-secretAccessor.policy_data
    }
    
    // Create the connection resource
    resource "google_cloudbuildv2_connection" "my-connection" {
        project = "PROJECT_ID"
        location = "REGION"
        name = "CONNECTION_NAME"
    
        bitbucket_data_center_config {
            host_uri = "BITBUCKET_URI"
            authorizer_credential {
                user_token_secret_version = google_secret_manager_secret_version.admin-token-secret-version.id
            }
            read_authorizer_credential {
                user_token_secret_version = google_secret_manager_secret_version.read-token-secret-version.id
            }
            webhook_secret_secret_version = google_secret_manager_secret_version.webhook-secret-secret-version.id
        }
    
        depends_on = [
            google_secret_manager_secret_iam_policy.policy-pak,
            google_secret_manager_secret_iam_policy.policy-rpak,
            google_secret_manager_secret_iam_policy.policy-whs
        ]
    }
    

其中:

  • PROJECT_ID 是您的 Google Cloud 项目 ID
  • PROJECT_NUMBER 是您的 Google Cloud 项目编号。
  • ADMIN_TOKEN_NAME 是具有 repository:admin 范围的令牌的名称。
  • ADMIN_TOKEN_VALUEADMIN_TOKEN_NAME 的值。
  • READ_TOKEN_NAME 是具有 repository:read 范围的令牌的名称。
  • READ_TOKEN_VALUEREAD_TOKEN_NAME 的值。
  • WEBHOOK_SECRET_NAME 是您的 Webhook Secret 的名称。
  • WEBHOOK_SECRET_VALUEWEBHOOK_SECRET_NAME 的值。
  • REGION 是连接的地区
  • CONNECTION_NAME 是连接的名称。
  • BITBUCKET_URI 是 Bitbucket 数据中心实例的 URI。

后续步骤