このページでは、Bitbucket Cloud ホストを Cloud Build に接続する方法について説明します。
始める前に
-
Enable the Cloud Build, Secret Manager, and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
- ソースコードが Bitbucket Cloud リポジトリにあることを確認します。
- Bitbucket Cloud Source リポジトリに
Dockerfileまたは Cloud Build 構成ファイルがあることを確認します。 - Google Cloud CLI をインストールして
gcloudコマンドを使用します。
必要な IAM 権限
接続に必要な権限が に付与されるようにするため、ユーザー アカウントに対する Cloud Build 接続管理者(cloudbuild.connectionAdmin)IAM ロールを に付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
管理者は、カスタムロールや他の事前定義ロールを使用して、必要な権限を付与することもできます。
Bitbucket Cloud アクセス トークンを作成する
Bitbucket Cloud に次の 2 つのアクセス トークンを作成します。
- 管理者アクセス トークン - リポジトリの接続と切断に使用します。
- 読み取りアクセス トークン - Cloud Build にソースコードへのアクセスを許可します。
これらのトークンを作成する手順は次のとおりです。
Bitbucket Cloud にログインします。
Bitbucket Cloud の手順に従って、リポジトリ、プロジェクト またはワークスペースにリンクするアクセス トークンを作成します。
次の権限を付与します。
管理者アクセス トークン:
- リポジトリ: 読み取りと管理者
- pull リクエスト: 読み取り
- Webhook: 読み取り と 書き込み
読み取りアクセス トークン:
- リポジトリ: 読み取り
次の手順で使用するためにトークンをコピーします。
Bitbucket Cloud ホストに接続する
コンソール
次の手順で、Cloud Build を Bitbucket Cloud ホストに接続します。
Google Cloud コンソールで [リポジトリ] ページを開きます。
[リポジトリ] ページが表示されます。
プロジェクト セレクタで、 Google Cloud プロジェクトを選択します。
ページ上部の [第 2 世代] タブを選択します。
[ホスト接続の作成] をクリックして、新しいホストを Cloud Build に接続します。
ソース プロバイダとして Bitbucket を選択します。
[接続の構成] セクションで、次の情報を入力します。
[リージョン]: 接続のリージョンを選択します。
[名前]: 接続の名前を入力します。
[ホストの詳細] セクションで、ホストタイプとして [Bitbucket Cloud] を選択します。
ワークスペース: Bitbucket Cloud リポジトリのワークスペース ID を入力します。
アクセス トークン: 以前に作成した管理者アクセス トークンを入力します。
読み取りアクセス トークン: 先ほど作成した読み取りアクセス トークンを入力します。
[接続] をクリックします。
新しい接続が [リポジトリ] ページに表示されます。
gcloud
認証情報を保存するには、次の手順を行います。
次のコマンドを実行して、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 で読み取りアクセス トークンのシークレットに付ける名前です。
次のコマンドを実行して、Secret Manager で Webhook シークレットを作成します。ここで、WEBHOOK_SECRET_NAME は Webhook シークレットに付ける名前です。
echo -n ${ex.(random-uuid)} | gcloud secrets create WEBHOOK_SECRET_NAME --data-file=-シークレットがすべて同じプロジェクト内にない場合は、次のコマンドを実行して 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 シークレットの名前です。
次のコマンドを使用して、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ここで
Terraform
Terraform を使用して Bitbucket Cloud ホストを Cloud Build に接続できます。
以下の例では、コード スニペットで次のことを行います。
- Terraform Google プロバイダを構成します。
- Bitbucket トークンを保存する Secret Manager のシークレットを作成します。
- シークレットにアクセスするために必要な権限を 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 は、
webhook、repository、repository:admin、pullrequestのアクセス範囲を持つトークンの名前です。 - 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 は接続の名前です。
- WORKSPACE_ID は、Bitbucket Cloud リポジトリのワークスペース ID です。
古い Bitbucket Cloud アクセス トークンまたは期限切れの Bitbucket Cloud アクセス トークンをローテーションする
Bitbucket Cloud アクセス トークンが期限切れになると、Cloud Build ホスト接続が Bitbucket Cloud リポジトリから切断されます。そのため、次のような状況でエラーが発生します。
Bitbucket Cloud リポジトリの 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メッセージが表示されます。
接続の古いトークンまたは有効期限切れのトークンをローテーションするには、次の操作を行います。
ホスト接続に関連付けられているシークレットを見つけます。
次のコマンドを実行します。
gcloud builds connections describe CONNECTION_PATH --region=REGIONここで
- CONNECTION_PATH は、Cloud Build の Bitbucket Cloud ホスト接続のパスです。形式は
projects/PROJECT_ID/locations/REGION/connections/CONNECTION_NAMEです。 - REGION は、接続のリージョンです。
- CONNECTION_PATH は、Cloud Build の Bitbucket Cloud ホスト接続のパスです。形式は
コマンドの出力で、ユーザー トークン フィールドの値を探します。
readAuthorizerCredential.userTokenSecretVersionはReadトークンの Secret Manager 名を示し、authorizerCredential.userTokenSecretVersionはAdminトークンの Secret Manager 名を示します。これらの名前は Secret Manager にシークレットとして保存されます。
Bitbucket Cloud で各アクセス トークンをローテーションします。
Cloud Build ホスト接続に接続されている Bitbucket Cloud リポジトリに移動します。
Bitbucket のドキュメントの手順に沿って、アクセス トークンをローテーションします。トークンをローテーションすると、Bitbucket Cloud は新しい認証情報で新しいトークンを作成し、そのトークンの以前のバージョンを無効にします。ローテーションされたトークンには、元のトークンと同じ権限とスコープがあります。
ローテーションされたトークンの ID をコピーします。
トークンごとに新しいシークレット バージョンを作成します。
Google Cloud コンソールで [Secret Manager] ページを開きます。
ローテーションしたトークンごとに、ステップ 1 で特定したシークレット名を見つけて [アクション] をクリックし、[新しいバージョンを追加] をクリックします。
[新しいバージョンを追加] ウィンドウで、ローテーションされたトークンの ID を入力し、[新しいバージョンを追加] をクリックします。
次のステップ
- Bitbucket Cloud リポジトリに接続する方法を学習する。
- ビルド結果を表示する方法を学習する。
- Compute Engine で Blue/Green デプロイを実行する方法を学習する。