本頁說明如何將 Bitbucket Server 主機連線至 Cloud Build。連結至 Bitbucket Server 主機後,Bitbucket Server 存放區就會與 Cloud Build 整合。這樣一來,您就可以設定建構觸發條件,從 Bitbucket Server 建構存放區,以及在私人網路中從 Bitbucket Server 建構存放區。
事前準備
啟用 Cloud Build、Secret Manager 和 Compute Engine API。
啟用 API 時所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。
- 在 Bitbucket Server 存放區中準備好原始碼。
- 在 Bitbucket Server 來源存放區中,擁有
Dockerfile或 Cloud Build 設定檔。 - 如果尚未安裝 Bitbucket Server 執行個體,請參閱 Bitbucket Server 安裝指南瞭解操作說明。
必要 IAM 權限
如要取得連線至 Bitbucket Server 主機所需的權限,請要求管理員授予您使用者帳戶的「Cloud Build 連線管理員」 (roles/cloudbuild.connectionAdmin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
如果 Bitbucket Server 執行個體託管於私人網路,請參閱「在私人網路中從 Bitbucket Server 建構存放區」,瞭解設定主機連線時所需的其他 IAM 角色。
建立個人存取權杖
為 Bitbucket Server 執行個體建立主機連線前,請在 Bitbucket Server 中建立個人存取權杖,方法如下:
登入 Bitbucket Server 執行個體。
按照操作說明為使用者帳戶建立 HTTP 存取權杖。
建立具備「存放區管理員」範圍的存取權杖,用於連結及取消連結存放區。
建立具備「repository read」範圍的存取權杖,確保 Cloud Build 存放區可以存取存放區中的原始碼。
請妥善保存符記值。您將使用這些憑證連線至 Bitbucket Server 存放區。
連線至 Bitbucket Server 主機
控制台
如要將 Bitbucket Server 主機連結至 Cloud Build,請按照下列步驟操作:
在 Google Cloud 控制台中開啟「Repositories」(存放區) 頁面。
選取頁面頂端的「第 2 代」分頁標籤。
在頂端列的專案選取器中,選取您的 Google Cloud 專案。
按一下「建立主機連線」,將新主機連結至 Cloud Build。
在左側面板中,選取「Bitbucket」做為來源供應商。
在「設定連線」部分,輸入下列資訊:
「Region」(區域):選取連線的區域。您必須指定區域。連結無法在全球通用。
名稱:輸入連線名稱。
在「主機詳細資料」部分,選取或輸入下列資訊:
Bitbucket 主機:選取 Bitbucket Data Center 做為主機。
主機網址:輸入主機網址。
選用:如要管理用於加密 Bitbucket Server 存放區存取權杖的金鑰,請前往「Encryption」(加密) 部分,然後選擇 Cloud Key Management Service 金鑰。詳情請參閱「為 Secret Manager 啟用客戶管理的加密金鑰」。
在「網路」部分,選取下列其中一個選項:
公開網際網路:如果執行個體可透過公開網際網路存取,請選取這個選項。
私人網路:如果執行個體是託管在私人網路上,請選取這個選項。然後設定下列項目:
CA 憑證:自行簽署的憑證。按一下「瀏覽」,從本機開啟憑證。
憑證大小不得超過 10 KB,且應為 PEM 格式 (
.pem、.cer或.crt)。如果將這個欄位留空,Cloud Build 會使用預設憑證集中的憑證。在「服務目錄服務」下方,選取服務地點:
- 在「CURRENT_PROJECT」專案中
- 在其他專案中
- 手動輸入
輸入下列資訊:
專案:如果您選取「位在其他專案」或「手動輸入」,請輸入或從下拉式選單選取專案 ID。 Google Cloud
區域:這個欄位會預先選取連線的區域。為服務指定的區域必須與連線相關聯的區域相符。
命名空間:選取服務的命名空間。
服務:選取命名空間中的服務名稱。
在「HTTP access tokens」部分,輸入下列資訊:
管理員存取權杖:輸入範圍為 repository admin 的權杖。這個權杖用於連結及取消連結存放區。
讀取存取權杖:輸入具有「repository read」範圍存取權的權杖。Cloud Build 觸發條件會使用這個權杖存取存放區中的原始碼。
按一下「連線」。
按一下「連線」按鈕後,系統會將個人存取權杖安全地儲存在 Secret Manager。連線至 Bitbucket Server 主機後,Cloud Build 會代您建立 Webhook 密鑰。您可以在「Secret Manager」頁面查看及管理密鑰。
gcloud
執行下列指令,在 Secret Manager 中建立 Webhook 密鑰,其中 WEBHOOK_SECRET 是您要為 Webhook 密鑰指定的名稱:
cat /proc/sys/kernel/random/uuid | tr -d '\n' | gcloud secrets create WEBHOOK_SECRET --data-file=-如果您將密鑰儲存在與建立主機連線所用專案不同的 Google Cloud 專案中,請執行下列指令,授予專案 Cloud Build 服務代理的存取權:
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 Server 主機連結至 Cloud Build。
執行下列指令,建立 Bitbucket Server 連線:
gcloud builds connections create bitbucketserver 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:
Terraform
您可以使用 Terraform,將 Bitbucket Server 主機連結至 Cloud Build。
在以下範例中,程式碼片段會執行下列操作:
- 設定 Terraform Google provider。
- 建立 Secret Manager 密鑰,用於儲存 Bitbucket 權杖。
- 將存取密鑰的必要權限授予 Cloud Build 服務代理。
建立 Bitbucket Server 連線。
// 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_server_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_VALUE 是 ADMIN_TOKEN_NAME 的值。
- READ_TOKEN_NAME 是具有
repository:read範圍的權杖名稱。 - READ_TOKEN_VALUE 是 READ_TOKEN_NAME 的值。
- WEBHOOK_SECRET_NAME 是 Webhook 密鑰的名稱。
- WEBHOOK_SECRET_VALUE 是 WEBHOOK_SECRET_NAME 的值。
- REGION 是連線的地區。
- CONNECTION_NAME 是 Cloud Build 中 Bitbucket Server 主機連線的名稱。
- BITBUCKET_URI 是 Bitbucket Data Center 執行個體的 URI。