Verbindung zu einem Bitbucket Cloud-Host herstellen

Auf dieser Seite wird beschrieben, wie Sie einen Bitbucket Cloud-Host mit Cloud Build verbinden.

Hinweis

  • Aktivieren Sie die APIs Cloud Build, Secret Manager und Compute Engine, falls sie noch nicht aktiviert sind.

    Rollen, die zum Aktivieren von APIs erforderlich sind

    Zum Aktivieren von APIs benötigen Sie die Berechtigung serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Rolle „Inhaber“ (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollen

    APIs aktivieren

  • Der Quellcode muss sich in einem Bitbucket Cloud-Repository befinden.
  • Das Bitbucket Cloud-Quell-Repository muss entweder ein Dockerfile oder eine Cloud Build-Konfigurationsdatei enthalten.
  • Installieren Sie die Google Cloud CLI, um gcloud-Befehle zu verwenden.

Erforderliche IAM-Berechtigungen

Damit die erforderlichen Berechtigungen zum Herstellen einer Verbindung hat, bitten Sie Ihren Administrator, die IAM-Rolle „Cloud Build Connection Admin“ (cloudbuild.connectionAdmin) für Ihr Nutzerkonto zuzuweisen. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Ihr Administrator kann Ihnen die erforderlichen Berechtigungen möglicherweise auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erteilen.

Bitbucket Cloud-Zugriffstokens erstellen

Erstellen Sie die folgenden beiden Zugriffstokens in Bitbucket Cloud:

  • Administratorzugriffstoken zum Verbinden und Trennen von Repositories.
  • Lesezugriffstoken, damit Cloud Build auf Ihren Quellcode zugreifen kann.

So erstellen Sie diese Tokens:

  1. Melden Sie sich in Bitbucket Cloud an.

  2. Folgen Sie der Anleitung für Bitbucket Cloud, um Zugriffstokens zu erstellen, die mit Ihrem Repository, Projekt oder Arbeitsbereich verknüpft sind.

    Erteilen Sie die folgenden Berechtigungen:

    • Admin-Zugriffstoken:

      • Repositories: Lesen und Administrator
      • Pull-Anfragen: Lesen
      • Webhooks: Lesen und Schreiben
    • Zugriffstoken mit Leseberechtigungen:

      • Repositories: Lesen
  3. Kopieren Sie Ihre Tokens, um sie in den folgenden Verfahren zu verwenden.

Verbindung zu einem Bitbucket Cloud-Host herstellen

Console

So verbinden Sie Cloud Build mit Ihrem Bitbucket Cloud-Host:

  1. Öffnen Sie in der Google Cloud Console die Seite Repositories.

    Zur Seite „Repositories“

    Die Seite Repositories wird angezeigt.

  2. Wählen Sie in der Projektauswahl Ihr Google Cloud -Projekt aus.

  3. Wählen Sie oben auf der Seite den Tab 2. Generation aus.

  4. Klicken Sie auf Hostverbindung erstellen, um einen neuen Host mit Cloud Build zu verbinden.

  5. Wählen Sie im linken Bereich Bitbucket als Quellanbieter aus.

  6. Geben Sie im Abschnitt Verbindung konfigurieren die folgenden Informationen ein:

    • Region: Wählen Sie eine Region für Ihre Verbindung aus.

    • Name: Geben Sie einen Namen für die Verbindung ein.

  7. Geben Sie im Abschnitt Hostdetails die folgenden Informationen ein:

    • Wählen Sie Bitbucket Cloud als Hosttyp aus.

    • Arbeitsbereich: Geben Sie die Arbeitsbereichs-ID für Ihr Bitbucket Cloud-Repository ein.

  8. Optional: Wenn Sie die Verschlüsselungsschlüssel verwalten möchten, die zum Verschlüsseln der Zugriffstokens für Ihre Bitbucket Cloud-Repositories verwendet werden, rufen Sie den Bereich Verschlüsselung auf und wählen Sie einen Cloud Key Management Service-Schlüssel aus. Weitere Informationen finden Sie unter Kundenverwaltete Verschlüsselungsschlüssel für Secret Manager aktivieren.

  9. Geben Sie im Abschnitt Zugriffstokens Folgendes ein:

    • Admin access token (Administratorzugriffstoken): Geben Sie das zuvor erstellte Administratorzugriffstoken ein.

    • Lesezugriffstoken: Geben Sie das zuvor erstellte Lesezugriffstoken ein.

  10. Klicken Sie auf Verbinden.

    Die neue Verbindung wird auf der Seite Repositories angezeigt.

gcloud

  1. So speichern Sie Ihre Anmeldedaten:

    1. Speichern Sie Ihre Zugriffstokens in Secret Manager in IhremGoogle Cloud -Projekt, indem Sie die folgenden Befehle ausführen:

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

      Wobei:

      • ADMIN_TOKEN ist Ihr Admin-Zugriffstoken.
      • ADMIN_SECRET_NAME ist der Name, den Sie dem Secret für das Administratorzugriffstoken in Secret Manager geben möchten.
      • READ_TOKEN ist Ihr Lesezugriffstoken.
      • READ_SECRET_NAME ist der Name, den Sie dem Secret für das Lesezugriffstoken in Secret Manager geben möchten.
    2. Erstellen Sie ein Webhook-Secret in Secret Manager, indem Sie den folgenden Befehl ausführen. Dabei ist WEBHOOK_SECRET_NAME der Name, den Sie Ihrem Webhook-Secret geben möchten:

      echo -n ${ex.(random-uuid)} | gcloud secrets create WEBHOOK_SECRET_NAME --data-file=-
      
    3. Wenn sich Ihre Secrets nicht alle im selben Projekt befinden, gewähren Sie dem Cloud Build-Dienst-Agent Zugriff, indem Sie Folgendes ausführen:

      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"
      

      Wobei:

      • PROJECT_ID ist die Google Cloud Projekt-ID.
      • ADMIN_SECRET_NAME ist der Name Ihres Admin-Token-Secrets.
      • READ_SECRET_NAME ist der Name Ihres Secrets für das Lesetoken.
      • WEBHOOK_SECRET_NAME ist der Name Ihres Webhook-Secrets.
  2. Verbinden Sie Cloud Build mit Ihrem Bitbucket Cloud-Host mit dem folgenden Befehl:

    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
    

    Wobei:

    • CONNECTION_NAME ist der Name, den Sie der Verbindung zu Ihrem Bitbucket Cloud-Host geben möchten.
    • WORKSPACE_ID ist die Workspace-ID für Ihr Bitbucket Cloud-Repository.
    • PROJECT_ID ist die Google Cloud Projekt-ID.
    • REGION ist die Region für Ihre Hostverbindung.
    • ADMIN_SECRET_NAME ist der Name Ihres Administrator-Token-Secrets.
    • READ_SECRET_NAME ist der Name Ihres Secrets für das Lesezugriffstoken.
    • WEBHOOK_SECRET_NAME ist der Name Ihres Webhook-Secrets.

Terraform

Sie können Ihren Bitbucket Cloud-Host mit Cloud Build verbinden, indem Sie Terraform verwenden.

Im folgenden Beispiel führt das Code-Snippet Folgendes aus:

  • Konfiguriert den Terraform Google-Anbieter.
  • Erstellt ein Secret Manager-Secret zum Speichern der Bitbucket-Tokens.
  • Gewährt dem Cloud Build-Dienst-Agent die erforderlichen Berechtigungen für den Zugriff auf Secrets.
  • Erstellt eine Bitbucket Cloud-Verbindung.

    // 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
        ]
    }
    

Wobei:

  • PROJECT_ID ist die Google Cloud Projekt-ID.
  • PROJECT_NUMBER ist die Nummer Ihres Google Cloud -Projekts.
  • ADMIN_TOKEN_NAME ist der Name Ihres Tokens mit Zugriff auf die Bereiche webhook, repository, repository:admin und pullrequest.
  • ADMIN_TOKEN_VALUE ist der Wert Ihres ADMIN_TOKEN_NAME.
  • READ_TOKEN_NAME ist der Name Ihres Tokens mit dem Bereich repository:read.
  • READ_TOKEN_VALUE ist der Wert Ihres READ_TOKEN_NAME.
  • WEBHOOK_SECRET_NAME ist der Name Ihres Webhook-Secrets.
  • WEBHOOK_SECRET_VALUE ist der Wert Ihres WEBHOOK_SECRET_NAME.
  • REGION ist die Region für Ihre Verbindung.
  • CONNECTION_NAME ist der Name Ihrer Verbindung.
  • WORKSPACE_ID ist die Workspace-ID für Ihr Bitbucket Cloud-Repository.

Alte oder abgelaufene Bitbucket Cloud-Zugriffstokens rotieren

Rotieren Sie Ihre Zugriffstokens, damit die Cloud Build-Hostverbindung die Verbindung zu Ihrem Bitbucket Cloud-Repository aufrechterhalten kann. Wenn Ihr Bitbucket Cloud-Zugriffstoken abläuft, wird die Cloud Build-Hostverbindung zu Ihrem Bitbucket Cloud-Repository getrennt. In diesem Fall können Sie die Verbindung erst deaktivieren oder ein Repository verknüpfen, wenn Sie das abgelaufene Token rotieren. Außerdem werden in den folgenden Fällen Fehler angezeigt:

  • Auf der Seite Verbindungsdetails für Ihre Verbindung wird die Fehlermeldung Connection is disconnected due to an invalid or expired access token angezeigt.

  • Wenn Sie versuchen, ein Repository mit einer Verbindung zu verknüpfen, für die ein abgelaufenes Token verwendet wird, wird die Meldung Ungültiges Zugriffstoken angezeigt. Wenn Sie auf Verbindung ansehen klicken, gelangen Sie zur Seite Verbindungsdetails für die Verbindung mit dem abgelaufenen Token.

Mit Cloud Build können Sie Zugriffstokens rotieren, indem Sie neue Tokenwerte eingeben und sie in Secret Manager in der neuesten Secret-Version für diese Tokens speichern. So rotieren Sie Ihre Zugriffstokens:

  1. Rotieren Sie jedes Zugriffstoken in Bitbucket Cloud:

    1. Rufen Sie das Bitbucket Cloud-Repository auf, das mit Ihrer Cloud Build-Hostverbindung verbunden ist.

    2. Folgen Sie der Anleitung in der Bitbucket-Dokumentation, um ein Zugriffstoken zu rotieren. Wenn Sie ein Token rotieren, erstellt Bitbucket Cloud ein neues Token mit neuen Anmeldedaten und macht die vorherige Version dieses Tokens ungültig. Das rotierte Token hat dieselben Berechtigungen und denselben Bereich wie das ursprüngliche Token.

    3. Kopieren Sie die IDs der rotierten Tokens.

  2. Aktualisieren Sie Ihr Zugriffstoken in Cloud Build:

    1. Rufen Sie die Seite Verbindungsdetails für Ihre Verbindung auf.

    2. Wählen Sie Zugriffstokens aktualisieren aus.

    3. Geben Sie im Menü Token-Rotation Ihre neuen Tokens in die Felder API-Zugriffstoken und Token mit Leseberechtigung ein.

    4. Optional: Wenn für Ihre Verbindung immer die aktuelle Version des Secrets für Ihre Tokens verwendet werden soll, wählen Sie Verbindung aktualisieren, damit immer die aktuelle Version verwendet wird aus. Wenn Sie diese Option nicht auswählen, kann das hilfreich sein, wenn für Ihre Verbindung eine bestimmte Version der Geheimnisnummer verwendet wird.

    5. Wählen Sie Aktualisieren aus, um die Änderungen zu speichern.

      Cloud Build speichert die neuen Zugriffstokens als aktuelle Version Ihres Secrets in Secret Manager.

Weitere Informationen finden Sie in der Bitbucket Cloud-Dokumentation unter Zugriffstokens und Enhancing security in Bitbucket: Introducing expiry for access tokens (Sicherheit in Bitbucket verbessern: Einführung des Ablaufs von Zugriffstokens).

Nächste Schritte