Menghubungkan ke host Bitbucket Cloud

Halaman ini menjelaskan cara menghubungkan host Bitbucket Cloud ke Cloud Build.

Sebelum memulai

  • Aktifkan Cloud Build, Secret Manager, dan Compute Engine API, jika ada yang belum diaktifkan.

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan izin serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.

    Aktifkan API

Izin IAM yang diperlukan

Untuk memastikan memiliki izin yang diperlukan untuk terhubung, minta administrator Anda untuk memberikan peran IAM Cloud Build Connection Admin (cloudbuild.connectionAdmin) kepada di akun pengguna Anda. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Administrator Anda mungkin juga dapat memberikan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Membuat token akses Bitbucket Cloud

Buat dua token akses berikut di Bitbucket Cloud:

  • Token akses admin - untuk menghubungkan dan memutuskan hubungan repositori.
  • Token akses baca - untuk mengizinkan Cloud Build mengakses kode sumber Anda.

Untuk membuat token ini, ikuti langkah-langkah berikut:

  1. Login ke Bitbucket Cloud.

  2. Ikuti petunjuk Bitbucket Cloud untuk membuat token akses yang ditautkan ke repositori, project, atau ruang kerja Anda.

    Berikan izin berikut:

    • Token akses admin:

      • Repositori: Baca dan Admin
      • Permintaan Pull: Baca
      • Webhook: Baca dan Tulis
    • Token akses baca:

      • Repositori: Baca
  3. Salin token Anda untuk digunakan dalam prosedur berikut.

Menghubungkan ke host Bitbucket Cloud

Konsol

Hubungkan Cloud Build ke host Bitbucket Cloud dengan menyelesaikan langkah-langkah berikut:

  1. Buka halaman Repositori di Google Cloud konsol.

    Buka halaman Repositori

    Anda akan melihat halaman Repositories.

  2. Di pemilih project, pilih project Google Cloud Anda.

  3. Di bagian atas halaman, pilih tab Generasi ke-2.

  4. Klik Create host connection untuk menghubungkan host baru ke Cloud Build.

  5. Di panel kiri, pilih Bitbucket sebagai penyedia sumber.

  6. Di bagian Configure Connection, masukkan informasi berikut:

    • Region: Pilih region untuk koneksi Anda.

    • Name: Masukkan nama untuk koneksi Anda.

  7. Di bagian Detail host, masukkan informasi berikut:

    • Pilih Bitbucket Cloud sebagai jenis host Anda.

    • Workspace: Masukkan ID ruang kerja untuk repositori Cloud Bitbucket Anda.

  8. Opsional: Jika Anda ingin mengelola kunci enkripsi yang digunakan untuk mengenkripsi token akses untuk repositori Bitbucket Cloud Anda, buka bagian Encryption dan pilih kunci Cloud Key Management Service. Untuk mengetahui informasi selengkapnya, lihat Mengaktifkan kunci enkripsi yang dikelola pelanggan untuk Secret Manager.

  9. Di bagian Access tokens, masukkan:

  10. Klik Hubungkan.

    Koneksi baru akan muncul di halaman Repositori.

gcloud

  1. Selesaikan langkah-langkah berikut untuk menyimpan kredensial Anda:

    1. Simpan token akses Anda di Secret Manager di project Google Cloud Anda dengan menjalankan perintah berikut:

      echo -n ADMIN_TOKEN | gcloud secrets create ADMIN_SECRET_NAME --data-file=-
      
      echo -n READ_TOKEN | gcloud secrets create READ_SECRET_NAME --data-file=-
      

      Dengan:

      • ADMIN_TOKEN adalah token akses admin Anda.
      • ADMIN_SECRET_NAME adalah nama yang ingin Anda berikan ke secret token akses admin Anda di Secret Manager.
      • READ_TOKEN adalah token akses baca Anda.
      • READ_SECRET_NAME adalah nama yang ingin Anda berikan ke secret token akses baca di Secret Manager.
    2. Buat secret webhook di Secret Manager dengan menjalankan perintah berikut, dengan WEBHOOK_SECRET_NAME adalah nama yang ingin Anda berikan ke secret webhook Anda:

      echo -n ${ex.(random-uuid)} | gcloud secrets create WEBHOOK_SECRET_NAME --data-file=-
      
    3. Jika semua rahasia Anda tidak berada dalam project yang sama, berikan akses ke agen layanan Cloud Build Anda dengan menjalankan perintah berikut:

      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"
      

      Dengan:

      • PROJECT_ID adalah Google Cloud project ID Anda.
      • ADMIN_SECRET_NAME adalah nama rahasia token admin Anda.
      • READ_SECRET_NAME adalah nama rahasia token baca Anda.
      • WEBHOOK_SECRET_NAME adalah nama rahasia webhook Anda.
  2. Hubungkan Cloud Build ke host Bitbucket Cloud Anda menggunakan perintah berikut:

    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
    

    Dengan:

    • CONNECTION_NAME adalah nama yang ingin Anda berikan ke koneksi ke host Bitbucket Cloud Anda.
    • WORKSPACE_ID adalah ID Workspace untuk repositori Bitbucket Cloud Anda.
    • PROJECT_ID adalah Google Cloud project ID Anda.
    • REGION adalah region untuk koneksi host Anda.
    • ADMIN_SECRET_NAME adalah nama rahasia token admin Anda.
    • READ_SECRET_NAME adalah nama rahasia token akses baca Anda.
    • WEBHOOK_SECRET_NAME adalah nama rahasia webhook Anda.

Terraform

Anda dapat menghubungkan host Bitbucket Cloud ke Cloud Build menggunakan Terraform.

Dalam contoh berikut, cuplikan kode melakukan hal berikut:

  • Mengonfigurasi penyedia Google Terraform.
  • Membuat secret Secret Manager untuk menyimpan token Bitbucket.
  • Memberikan izin yang diperlukan ke agen layanan Cloud Build untuk mengakses secret.
  • Membuat koneksi 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
        ]
    }
    

Dengan:

  • PROJECT_ID adalah Google Cloud project ID Anda.
  • PROJECT_NUMBER adalah nomor project Google Cloud Anda.
  • ADMIN_TOKEN_NAME adalah nama token Anda dengan akses cakupan webhook, repository, repository:admin, dan pullrequest.
  • ADMIN_TOKEN_VALUE adalah nilai ADMIN_TOKEN_NAME.
  • READ_TOKEN_NAME adalah nama token Anda dengan cakupan repository:read.
  • READ_TOKEN_VALUE adalah nilai READ_TOKEN_NAME.
  • WEBHOOK_SECRET_NAME adalah nama rahasia webhook Anda.
  • WEBHOOK_SECRET_VALUE adalah nilai WEBHOOK_SECRET_NAME.
  • REGION adalah region untuk koneksi Anda.
  • CONNECTION_NAME adalah nama koneksi Anda.
  • WORKSPACE_ID adalah ID Workspace untuk repositori Bitbucket Cloud Anda.

Mengganti token akses Bitbucket Cloud yang lama atau telah habis masa berlakunya

Ganti token akses Anda agar koneksi host Cloud Build dapat mempertahankan koneksinya ke repositori Bitbucket Cloud Anda. Jika token akses Bitbucket Cloud Anda berakhir masa berlakunya, koneksi host Cloud Build Anda akan terputus dari repositori Bitbucket Cloud-nya. Jika hal ini terjadi, Anda tidak dapat menonaktifkan koneksi atau menautkan repositori hingga Anda mengganti token yang sudah habis masa berlakunya. Selain itu, Anda akan melihat error dalam situasi berikut:

  • Halaman Detail koneksi untuk koneksi Anda menampilkan pesan error yang menyatakan Connection is disconnected due to an invalid or expired access token.

  • Jika Anda mencoba menautkan repositori ke koneksi yang memiliki token yang sudah tidak berlaku, Anda akan melihat pesan Token akses tidak valid. Mengklik Lihat koneksi akan mengarahkan Anda ke halaman Detail koneksi untuk koneksi dengan token yang sudah tidak berlaku.

Cloud Build memungkinkan Anda mengganti token akses dengan memasukkan nilai token baru dan menyimpannya di Secret Manager dalam versi secret terbaru untuk token tersebut. Untuk merotasi token akses Anda, lakukan hal berikut:

  1. Ganti setiap token akses di Bitbucket Cloud:

    1. Buka repositori Bitbucket Cloud yang terhubung ke koneksi host Cloud Build Anda.

    2. Ikuti petunjuk dalam dokumentasi Bitbucket untuk merotasi token akses. Saat Anda merotasi token, Bitbucket Cloud akan membuat token baru dengan kredensial baru dan membatalkan validasi token versi sebelumnya. Token yang dirotasi memiliki izin dan cakupan yang sama dengan token asli.

    3. Salin ID token yang dirotasi.

  2. Perbarui token akses Anda di Cloud Build:

    1. Buka halaman Detail koneksi untuk koneksi Anda.

    2. Pilih Perbarui token akses.

    3. Di menu Token rotation, masukkan token baru Anda di kolom API access token dan Read access token.

    4. (Opsional): Jika Anda ingin koneksi Anda selalu menggunakan versi terbaru secret untuk token Anda, pilih Update connection to always use latest version. Membiarkan opsi ini tidak dipilih dapat berguna jika koneksi Anda menggunakan nomor versi rahasia tertentu.

    5. Pilih Perbarui untuk menyimpan perubahan.

      Cloud Build menyimpan token akses baru sebagai versi terbaru secret Anda di Secret Manager.

Untuk mengetahui informasi selengkapnya, lihat Token akses dan Meningkatkan keamanan di Bitbucket: Memperkenalkan masa berlaku untuk token akses dalam dokumentasi Bitbucket Cloud.

Langkah berikutnya