連結至 Bitbucket Cloud 主機

本頁說明如何將 Bitbucket Cloud 主機連線至 Cloud Build。

事前準備

  • Enable the Cloud Build, Secret Manager, and Compute Engine APIs.

    Enable the APIs

  • 確認原始碼位於 Bitbucket Cloud 存放區。
  • 確認 Bitbucket Cloud 原始碼存放區有 DockerfileCloud Build 設定檔
  • 安裝 Google Cloud CLI,即可使用 gcloud 指令。

必要 IAM 權限

如要取得連線所需的權限,請要求管理員為您的使用者帳戶授予 Cloud Build 連線管理員 (cloudbuild.connectionAdmin) 身分與存取權管理角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

建立 Bitbucket Cloud 存取權杖

在 Bitbucket Cloud 中建立下列兩個存取權杖:

  • 管理員存取權杖 - 用於連結及取消連結存放區。
  • 讀取存取權杖 - 允許 Cloud Build 存取原始碼。

如要建立這些權杖,請按照下列步驟操作:

  1. 登入 Bitbucket Cloud

  2. 按照 Bitbucket Cloud 的指示,建立連結至存放區專案工作區的存取權杖。

    授予下列權限:

    • 管理員存取權杖:

      • 存放區:讀取管理員
      • 提取要求:讀取
      • Webhook:讀取寫入
    • 讀取存取權杖:

      • 存放區:讀取
  3. 複製權杖,以供後續程序使用。

連線至 Bitbucket Cloud 主機

主控台

如要將 Cloud Build 連結至 Bitbucket Cloud 主機,請完成下列步驟:

  1. 在 Google Cloud 控制台中開啟「Repositories」(存放區) 頁面。

    開啟「Repositories」(存放區) 頁面

    畫面會顯示「Repositories」(存放區) 頁面。

  2. 在專案選取器中,選取 Google Cloud 專案。

  3. 選取頁面頂端的「第 2 代」分頁標籤。

  4. 按一下「建立主機連線」,將新主機連結至 Cloud Build。

  5. 選取「Bitbucket」Bitbucket做為來源供應商。

  6. 在「設定連線」區段中,輸入下列資訊:

    1. 「區域」:選取連線的區域。

    2. 名稱:輸入連線名稱。

    3. 在「主機詳細資料」部分,選取「Bitbucket Cloud」做為主機類型。

    4. 工作區:輸入 Bitbucket Cloud 存放區的工作區 ID

    5. 存取權杖:輸入先前建立的管理員存取權杖。

    6. 讀取存取權杖:輸入先前建立的讀取存取權杖。

  7. 按一下「連線」

    新連線會顯示在「存放區」頁面中。

gcloud

  1. 請完成下列步驟來儲存憑證:

    1. 執行下列指令,將存取權杖儲存在專案的 Secret Manager 中:Google Cloud

      echo -n ADMIN_TOKEN | gcloud secrets create ADMIN_SECRET_NAME --data-file=-
      
      echo -n READ_TOKEN | gcloud secrets create READ_SECRET_NAME --data-file=-
      

      其中:

      • ADMIN_TOKEN 是您的管理員存取權杖。
      • ADMIN_SECRET_NAME 是您要在 Secret Manager 中為管理存取權權杖密鑰指定的名稱。
      • READ_TOKEN 是您的讀取存取權杖。
      • READ_SECRET_NAME 是您要在 Secret Manager 中為讀取存取權權杖密鑰命名的名稱。
    2. 執行下列指令,在 Secret Manager 中建立 Webhook 密鑰,其中 WEBHOOK_SECRET_NAME 是您要為 Webhook 密鑰指定的名稱:

      echo -n ${ex.(random-uuid)} | gcloud secrets create WEBHOOK_SECRET_NAME --data-file=-
      
    3. 如果您的密鑰並非全都在同一個專案中,請執行下列指令,授予 Cloud Build 服務代理程式存取權:

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

      其中:

      • PROJECT_ID 是您的 Google Cloud 專案 ID
      • ADMIN_SECRET_NAME 是管理員權杖密碼的名稱。
      • READ_SECRET_NAME 是讀取權杖密鑰的名稱。
      • WEBHOOK_SECRET_NAME 是 Webhook 密鑰的名稱。
  2. 使用下列指令,將 Cloud Build 連結至 Bitbucket Cloud 主機:

    gcloud builds connections create bitbucket-cloud CONNECTION_NAME \
        --workspace=WORKSPACE_ID \
        --project=PROJECT_ID \
        --region=REGION \
        --authorizer-token-secret-version=projects/PROJECT_ID/secrets/ADMIN_SECRET_NAME/versions/latest \
        --read-authorizer-token-secret-version=projects/PROJECT_ID/secrets/READ_SECRET_NAME/versions/latest \
        --webhook-secret-secret-version=projects/PROJECT_ID/secrets/WEBHOOK_SECRET_NAME/versions/1
    

    其中:

    • CONNECTION_NAME 是您要為 Bitbucket Cloud 主機連線指定的名稱。
    • WORKSPACE_ID 是 Bitbucket Cloud 存放區的 Workspace ID。
    • PROJECT_ID 是您的 Google Cloud 專案 ID
    • REGION 是主機連線的區域
    • ADMIN_SECRET_NAME 是管理員權杖密鑰的名稱。
    • READ_SECRET_NAME 是讀取存取權權杖密碼的名稱。
    • WEBHOOK_SECRET_NAME 是 Webhook 密鑰的名稱。

Terraform

您可以使用 Terraform,將 Bitbucket Cloud 主機連至 Cloud Build。

在以下範例中,程式碼片段會執行下列操作:

  • 設定 Terraform Google 供應商。
  • 建立 Secret Manager 密鑰,用於儲存 Bitbucket 權杖。
  • 將存取密鑰的必要權限授予 Cloud Build 服務代理。
  • 建立 Bitbucket Cloud 連線。

    // 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 and add the repository resource
    resource "google_cloudbuildv2_connection" "my-connection" {
        project = "PROJECT_ID"
        location = "REGION"
        name = "CONNECTION_NAME"
    
        bitbucket_cloud_config {
            workspace = "WORKSPACE_ID"
            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 是權杖的名稱,具有 webhookrepositoryrepository:adminpullrequest 範圍的存取權。
  • ADMIN_TOKEN_VALUEADMIN_TOKEN_NAME 的值。
  • READ_TOKEN_NAME 是具有 repository:read 範圍的權杖名稱。
  • READ_TOKEN_VALUEREAD_TOKEN_NAME 的值。
  • WEBHOOK_SECRET_NAME 是 Webhook 密鑰的名稱。
  • WEBHOOK_SECRET_VALUEWEBHOOK_SECRET_NAME 的值。
  • REGION 是連線的地區
  • CONNECTION_NAME 是連線名稱。
  • WORKSPACE_ID 是 Bitbucket Cloud 存放區的 Workspace ID。

後續步驟