Bitbucket データセンター ホストに接続する

このページでは、Bitbucket データセンター ホストを Cloud Build に接続する方法について説明します。Bitbucket データセンター ホストに接続すると、Bitbucket データセンター リポジトリが Cloud Build と統合されます。これにより、Bitbucket データセンターからリポジトリをビルドするようにビルドトリガーを構成したり、プライベート ネットワーク内の Bitbucket データセンターからリポジトリをビルドするようにビルドトリガーを構成したりできます。

始める前に

  • Enable the Cloud Build and Secret Manager APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

必要な IAM 権限

Bitbucket データセンター ホストに接続するために必要な権限を取得するには、ユーザー アカウントに対する Cloud Build 接続管理者 roles/cloudbuild.connectionAdmin)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

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

Bitbucket データセンター インスタンスがプライベート ネットワークでホストされている場合は、プライベート ネットワークで Bitbucket データセンターからリポジトリをビルドするを参照して、ホスト接続の構成に必要な追加の IAM ロールを確認してください。

個人用アクセス トークンを作成する

Bitbucket データセンター インスタンスのホスト接続を作成する前に、次の手順で Bitbucket データセンターに個人用アクセス トークンを作成します。

  1. Bitbucket データセンター インスタンスにログインします。

  2. 手順に沿って、ユーザー アカウントの HTTP アクセス トークンを作成します。

    1. スコープがリポジトリ管理者のアクセス トークンを作成し、リポジトリの接続と切断に使用します。

    2. スコープがリポジトリの読み取りのアクセス トークンを作成して、Cloud Build リポジトリがリポジトリ内のソースコードにアクセスできるようにします。

  3. トークン値を安全に保存します。これらのトークンを使用して、Bitbucket データセンター リポジトリに接続します。

Bitbucket データセンター ホストに接続する

コンソール

Bitbucket データセンター ホストを Cloud Build に接続するには:

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

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

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

  3. 上部のバーにあるプロジェクト セレクタで、 Google Cloud プロジェクトを選択します。

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

  5. 左側のパネルで、ソース プロバイダとして Bitbucket を選択します。

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

    1. [リージョン]: 接続のリージョンを選択します。リージョンを指定する必要があります。接続をグローバルにはできません。

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

  7. [ホストの詳細] セクションで、次の情報を選択または入力します。

    1. Bitbucket ホスト: ホストとして [Bitbucket データセンター] を選択します。

    2. [ホスト URL]: Bitbucket データセンター ホストの URL を入力します。

  8. [ネットワーキング] セクションで次のいずれかのオプションを選択します。

    1. 公共のインターネット: 公共のインターネットを使用してインスタンスにアクセスできる場合は、このオプションを選択します。

    2. プライベート ネットワーク: インスタンスがプライベート ネットワークでホストされている場合は、このオプションを選択します。

      1. CA 証明書: 自己署名証明書。[参照] をクリックして、ローカルマシンから証明書を開きます。

        証明書のサイズは 10 KB 以下の PEM 形式(.pem.cer、または .crt)にする必要があります。このフィールドを空白のままにすると、Cloud Build はデフォルトの証明書セットの証明書を使用します。

      2. [Service Directory サービス] セクションで、サービスのロケーションを選択します。あらかじめ入力されたプロジェクト ID をそのまま使用することも、別のプロジェクトを指定することもできます。

        1. サービスのプロジェクトを選択します。あらかじめ入力されたプロジェクトをそのまま使用するか、[別のプロジェクト] を選択して参照するか、[手動で入力] を選択します。

          [手動で入力] を選択した場合は、次の情報を入力します。

          • プロジェクト: プルダウン メニューから Google Cloudプロジェクト ID を入力または選択します。

          • リージョン: このフィールドでは、接続のリージョンが事前に選択されています。サービス用に指定されるリージョンは、接続に関連付けられたリージョンと一致する必要があります。

        2. 名前空間: サービスの名前空間を選択します。

        3. サービス: 名前空間内のサービス名を選択します。

  9. [HTTP アクセス トークン] セクションで、次の情報を入力します。

    1. 管理者アクセス トークン: リポジトリ管理者スコープ アクセスを持つトークンを入力します。このトークンは、リポジトリの接続と切断に使用されます。

    2. 読み取りアクセス トークン: リポジトリ読み取りスコープ アクセスを持つトークンを入力します。Cloud Build トリガーは、このトークンを使用してリポジトリ内のソースコードにアクセスします。

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

    [接続] ボタンをクリックすると、個人用アクセス トークンが Secret Manager に安全に保存されます。Bitbucket データセンター ホストに接続すると、Cloud Build がユーザーに代わって Webhook シークレットを作成します。シークレットは、Secret Manager ページで確認および管理できます。

gcloud

  1. Secret Manager にトークンを保存します

  2. 次のコマンドを実行して、Secret Manager で Webhook シークレットを作成します。ここで、WEBHOOK_SECRET は Webhook シークレットに付ける名前です。

      cat /proc/sys/kernel/random/uuid | tr -d '\n' | gcloud secrets create WEBHOOK_SECRET --data-file=-
    
  3. ホスト接続の作成に使用するように計画するプロジェクトとは異なる 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 データセンター ホストを 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 は、Cloud Build の Bitbucket データセンター ホスト接続の名前です。
    • HOST_URI は、Bitbucket データセンター インスタンスの URI です。
    • PROJECT_ID は Google Cloud プロジェクト ID です。
    • REGION は、接続のリージョンです。
    • ADMIN_TOKEN は、リポジトリ管理者スコープを持つトークンの名前です。
    • READ_TOKEN は、リポジトリ読み取りスコープを持つトークンの名前です。
    • SECRET_VERSION はシークレットのバージョンです。
    • WEBHOOK_SECRET は Webhook シークレットです。

Terraform

Terraform を使用して Bitbucket データセンター ホストを Cloud Build に接続できます。

次の例では、コード スニペットで次のことを行います。

  • Terraform Google プロバイダを構成します。
  • Bitbucket トークンを保存する Secret Manager のシークレットを作成します。
  • シークレットにアクセスするために必要な権限を Cloud Build サービス エージェントに付与します。
  • 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 シークレットの名前です。
  • WEBHOOK_SECRET_VALUEWEBHOOK_SECRET_NAME の値です。
  • REGION は、接続のリージョンです。
  • CONNECTION_NAME は、Cloud Build の Bitbucket データセンター ホスト接続の名前です。
  • BITBUCKET_URI は、Bitbucket データセンター インスタンスの URI です。

古い Bitbucket データセンター アクセス トークンまたは期限切れの Bitbucket データセンター アクセス トークンをローテーションする

Bitbucket データセンター アクセス トークンの有効期限が切れると、Cloud Build ホスト接続が Bitbucket データセンター リポジトリから切断されます。そのため、次のような状況でエラーが発生します。

  • Bitbucket データセンター リポジトリの Cloud Build 接続をリンクしようとすると、Failed to fetch repositories to link. Check that Cloud Build is still authorized to access data from the selected connection メッセージが表示されます。

  • [トリガー] ページで [実行] をクリックすると、[トリガーを実行] ページが開き、Failed to list branches. You can still enter one manually メッセージが表示されます。

接続の古いトークンまたは有効期限切れのトークンをローテーションするには、次の操作を行います。

  1. ホスト接続に関連付けられているシークレットを見つけます。

    1. 次のコマンドを実行します。

      gcloud builds connections describe CONNECTION_PATH --region=REGION
      

      ここで

      • CONNECTION_PATH は、Cloud Build の Bitbucket データセンター ホスト接続のパスです(形式: projects/PROJECT_ID/locations/REGION/connections/CONNECTION_NAME)。
      • REGION は、接続のリージョンです。
    2. コマンドの出力で、ユーザー トークン フィールドの値を探します。readAuthorizerCredential.userTokenSecretVersionRead トークンの Secret Manager 名を示し、authorizerCredential.userTokenSecretVersionAdmin トークンの Secret Manager 名を示します。これらの名前は Secret Manager にシークレットとして保存されます。

  2. Bitbucket データセンターで各アクセス トークンをローテーションします。

    1. Cloud Build ホスト接続に接続されている Bitbucket データセンター リポジトリに移動します。

    2. Bitbucket のドキュメントの手順に沿って、アクセス トークンをローテーションします。トークンをローテーションすると、Bitbucket Data Center は新しい認証情報で新しいトークンを作成し、そのトークンの以前のバージョンを無効にします。ローテーションされたトークンには、元のトークンと同じ権限とスコープがあります。

    3. ローテーションされたトークンの ID をコピーします。

  3. トークンごとに新しいシークレット バージョンを作成します。

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

      [シークレット マネージャー] ページを開く

    2. ローテーションしたトークンごとに、ステップ 1 で特定したシークレット名を見つけて [アクション] をクリックし、[新しいバージョンを追加] をクリックします。

    3. [新しいバージョンを追加] ウィンドウで、ローテーションされたトークンの ID を入力し、[新しいバージョンを追加] をクリックします。

詳細については、Bitbucket Data Center のドキュメントのアクセス トークンBitbucket のセキュリティ強化: アクセス トークンの有効期限の導入をご覧ください。

次のステップ