このページでは、Bitbucket Cloud ホストを Cloud Build に接続する方法について説明します。
始める前に
-
Enable the Cloud Build, Secret Manager, and Compute Engine APIs.
- ソースコードが 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
ここで
- 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 サービス エージェントに、シークレットにアクセスするために必要な権限を付与します。
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 リポジトリに接続する方法を学習する。
- ビルド結果を表示する方法を学習する。
- Compute Engine で Blue/Green デプロイを実行する方法を学習する。