Bitbucket Cloud ホストに接続する

このページでは、Bitbucket Cloud ホストを Cloud Build に接続する方法について説明します。

始める前に

  • Cloud Build, Secret Manager, and Compute Engine API を有効にします。

    API を有効にする

必要な IAM 権限

接続に必要な権限を取得するには、ユーザー アカウントに対する Cloud Build 接続管理者(cloudbuild.connectionAdmin)IAM ロールを付与するように管理者に依頼してください。ロールの付与の詳細については、アクセス権の管理に関する記事をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

Bitbucket Cloud アクセス トークンを作成する

Bitbucket Cloud に次の 2 つのアクセス トークンを作成します。

  • 管理者アクセス トークン - リポジトリの接続と切断に使用します。
  • 読み取りアクセス トークン - Cloud Build にソースコードへのアクセスを許可します。

これらのトークンを作成する手順は次のとおりです。

  1. Bitbucket Cloud にログインします。

  2. Bitbucket Cloud の手順に従って、リポジトリプロジェクト またはワークスペースにリンクするアクセス トークンを作成します。

    次の権限を付与します。

    • 管理者アクセス トークン:

      • リポジトリ: 読み取り管理者
      • pull リクエスト: 読み取り
      • Webhook: 読み取り書き込み
    • 読み取りアクセス トークン:

      • リポジトリ: 読み取り
  3. 次の手順で使用するためにトークンをコピーします。

Bitbucket Cloud ホストに接続する

コンソール

次の手順で、Cloud Build を Bitbucket Cloud ホストに接続します。

  1. Google Cloud コンソールで [リポジトリ] ページを開きます。

    [リポジトリ] ページを開く

    [リポジトリ] ページが表示されます。

  2. プロジェクト セレクタで、Google Cloud プロジェクトを選択します。

  3. ページ上部の [第 2 世代] タブを選択します。

  4. [ホスト接続の作成] をクリックして、新しいホストを Cloud Build に接続します。

  5. ソース プロバイダとして Bitbucket を選択します。

  6. [接続の構成] セクションで、次の情報を入力します。

    1. [リージョン]: 接続のリージョンを選択します。

    2. [名前]: 接続の名前を入力します。

    3. [ホストの詳細] セクションで、ホストタイプとして [Bitbucket Cloud] を選択します。

    4. ワークスペース: Bitbucket Cloud リポジトリのワークスペース ID を入力します。

    5. アクセス トークン: 以前に作成した管理者アクセス トークンを入力します。

    6. 読み取りアクセス トークン: 以前に作成した読み取りアクセス トークンを入力します。

  7. [接続] をクリックします。

    新しい接続が [リポジトリ] ページに表示されます。

gcloud

  1. 認証情報を保存するには、次の手順を行います。

    1. 次のコマンドを実行して、Google Cloud プロジェクトの Secret Manager にアクセス トークンを保存します。

      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. Secret がすべて同じプロジェクト内にない場合は、次のコマンドを実行して 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 リポジトリのワークスペース 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 プロバイダを構成します。
  • Bitbucket トークンを保存する Secret Manager のシークレットを作成します。
  • Cloud Build のプロダクトごと、プロジェクトごとのサービス アカウント(P4SA)に、シークレットにアクセスするために必要な権限を付与します。
  • 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 P4SA
    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 リポジトリのワークスペース ID です。

次のステップ