Connettersi a un host Bitbucket Cloud

Questa pagina spiega come connettere un host Bitbucket Cloud a Cloud Build.

Prima di iniziare

  • Abilita le API Cloud Build, Secret Manager e Compute Engine.

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente hai già questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore utilizzo servizi (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.

    Abilita le API

Autorizzazioni IAM obbligatorie

Per assicurarti che disponga delle autorizzazioni necessarie per la connessione, chiedi all'amministratore di concedere il ruolo IAM Amministratore connessione Cloud Build (cloudbuild.connectionAdmin) al tuo account utente. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

L'amministratore potrebbe anche essere in grado di concedere le autorizzazioni richieste tramite ruoli personalizzati o altri ruoli predefiniti.

Crea token di accesso Bitbucket Cloud

Crea i seguenti due token di accesso in Bitbucket Cloud:

  • Token di accesso amministrativo: per connettere e disconnettere i repository.
  • Token di accesso in lettura: per consentire a Cloud Build di accedere al codice sorgente.

Per creare questi token:

  1. Accedi a Bitbucket Cloud.

  2. Segui le istruzioni di Bitbucket Cloud per creare token di accesso collegati al repository, progetto o al workspace.

    Concedi le seguenti autorizzazioni:

    • Token di accesso amministrativo:

      • Repository: Lettura e Amministrazione
      • Richieste di pull: Lettura
      • Webhook: Lettura e Scrittura
    • Token di accesso in lettura:

      • Repository: Lettura
  3. Copia i token da utilizzare nelle procedure seguenti.

Connettiti a un host Bitbucket Cloud

Console

Connetti Cloud Build al tuo host Bitbucket Cloud completando i seguenti passaggi:

  1. Apri la pagina Repository nella Google Cloud console.

    Apri la pagina Repository

    Viene visualizzata la pagina Repository.

  2. Nel selettore dei progetti, seleziona il tuo Google Cloud progetto.

  3. Nella parte superiore della pagina, seleziona la scheda 2ª gen..

  4. Fai clic su Crea connessione host per connettere un nuovo host a Cloud Build.

  5. Nel riquadro a sinistra, seleziona Bitbucket come provider di origine.

  6. Nella sezione Configura connessione, inserisci le seguenti informazioni:

    • Regione: seleziona una regione per la connessione.

    • Nome: inserisci un nome per la connessione.

  7. Nella sezione Dettagli host, inserisci le seguenti informazioni:

    • Seleziona Bitbucket Cloud come tipo di host.

    • Workspace: inserisci l'ID workspace per il repository Bitbucket Cloud.

  8. (Facoltativo) Se vuoi gestire le chiavi di crittografia utilizzate per criptare i token di accesso per i repository Bitbucket Cloud, vai alla sezione Crittografia e scegli una chiave Cloud Key Management Service. Per saperne di più, consulta Abilitare le chiavi di crittografia gestite dal cliente per Secret Manager.

  9. Nella sezione Token di accesso, inserisci quanto segue:

  10. Fai clic su Connetti.

    La nuova connessione viene visualizzata nella pagina Repository.

gcloud

  1. Completa i seguenti passaggi per archiviare le credenziali:

    1. Archivia i token di accesso in Secret Manager nel tuo Google Cloud progetto eseguendo i seguenti comandi:

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

      Dove:

      • ADMIN_TOKEN è il token di accesso amministrativo.
      • ADMIN_SECRET_NAME è il nome che vuoi assegnare a l secret del token di accesso amministrativo in Secret Manager.
      • READ_TOKEN è il token di accesso in lettura.
      • READ_SECRET_NAME è il nome che vuoi assegnare al secret del token di accesso in lettura in Secret Manager.
    2. Crea un secret webhook in Secret Manager eseguendo il seguente comando, dove WEBHOOK_SECRET_NAME è il nome che vuoi assegnare al secret webhook:

      echo -n ${ex.(random-uuid)} | gcloud secrets create WEBHOOK_SECRET_NAME --data-file=-
      
    3. Se i secret non si trovano tutti nello stesso progetto, concedi l'accesso al service agent Cloud Build eseguendo il seguente comando:

      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"
      

      Dove:

      • PROJECT_ID è l'ID del tuo Google Cloud progetto.
      • ADMIN_SECRET_NAME è il nome del secret del token amministrativo.
      • READ_SECRET_NAME è il nome del secret del token di lettura.
      • WEBHOOK_SECRET_NAME è il nome del tuo secret webhook.
  2. Connetti Cloud Build al tuo host Bitbucket Cloud utilizzando il seguente comando:

    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
    

    Dove:

    • CONNECTION_NAME è il nome che vuoi assegnare alla connessione al tuo host Bitbucket Cloud.
    • WORKSPACE_ID è l'ID workspace per il repository Bitbucket Cloud.
    • PROJECT_ID è l'ID del tuo Google Cloud progetto.
    • REGION è la regione per la connessione host.
    • ADMIN_SECRET_NAME è il nome del secret del token amministrativo.
    • READ_SECRET_NAME è il nome del secret del token di accesso in lettura.
    • WEBHOOK_SECRET_NAME è il nome del secret webhook.

Terraform

Puoi connettere l'host Bitbucket Cloud a Cloud Build utilizzando Terraform.

Nell'esempio seguente, lo snippet di codice esegue le seguenti operazioni:

  • Configura il provider Google Terraform.
  • Crea un secret Secret Manager per archiviare i token Bitbucket.
  • Concede le autorizzazioni necessarie al service agent Cloud Build per accedere ai secret.
  • Crea una connessione 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
        ]
    }
    

Dove:

  • PROJECT_ID è l'ID del tuo Google Cloud progetto.
  • PROJECT_NUMBER è il numero del tuo Google Cloud progetto.
  • ADMIN_TOKEN_NAME è il nome del token con accesso all'ambito webhook, repository, repository:admin e pullrequest.
  • ADMIN_TOKEN_VALUE è il valore di ADMIN_TOKEN_NAME.
  • READ_TOKEN_NAME è il nome del token con repository:read ambito.
  • READ_TOKEN_VALUE è il valore di READ_TOKEN_NAME.
  • WEBHOOK_SECRET_NAME è il nome del secret webhook.
  • WEBHOOK_SECRET_VALUE è il valore di WEBHOOK_SECRET_NAME.
  • REGION è la regione per la connessione.
  • CONNECTION_NAME è il nome della connessione.
  • WORKSPACE_ID è l'ID workspace per il repository Bitbucket Cloud.

Ruota i token di accesso Bitbucket Cloud vecchi o scaduti

Ruota i token di accesso in modo che la connessione host Cloud Build possa mantenere la connessione al repository Bitbucket Cloud. Se il token di accesso Bitbucket Cloud scade, la connessione host Cloud Build viene disconnessa dal repository Bitbucket Cloud. In questo caso, non puoi disattivare la connessione o collegare un repository finché non ruoti il token scaduto. Inoltre, vedrai errori nelle seguenti circostanze:

  • La pagina Dettagli connessione della connessione mostra un messaggio di errore che indica Connection is disconnected due to an invalid or expired access token.

  • Se provi a collegare un repository a una connessione con un token scaduto, viene visualizzato il messaggio Token di accesso non valido. Se fai clic su Visualizza connessione , viene visualizzata la pagina Dettagli connessione per la connessione con il token scaduto.

Cloud Build ti consente di ruotare i token di accesso inserendo nuovi valori dei token e salvandoli in Secret Manager nell'ultima versione del secret per questi token. Per ruotare i token di accesso:

  1. Ruota ogni token di accesso in Bitbucket Cloud:

    1. Vai al repository Bitbucket Cloud connesso alla connessione host Cloud Build.

    2. Segui le istruzioni riportate nella documentazione di Bitbucket per ruotare un token di accesso. Quando ruoti un token, Bitbucket Cloud crea un nuovo token con nuove credenziali e invalida la versione precedente del token. Il token ruotato ha le stesse autorizzazioni e lo stesso ambito del token originale.

    3. Copia gli ID dei token ruotati.

  2. Aggiorna il token di accesso in Cloud Build:

    1. Vai alla pagina Dettagli connessione per la connessione.

    2. Seleziona Aggiorna token di accesso.

    3. Nel menu Rotazione token, inserisci i nuovi token nei campi Token di accesso API e Token di accesso in lettura.

    4. (Facoltativo) Se vuoi che la connessione utilizzi sempre l'ultima versione del secret per i token, seleziona Aggiorna connessione per utilizzare sempre l'ultima versione. Se non selezioni questa opzione, potrebbe essere utile se la connessione utilizza un numero di versione del secret specifico.

    5. Seleziona Aggiorna per salvare le modifiche.

      Cloud Build salva i nuovi token di accesso come ultima versione del secret in Secret Manager.

Per saperne di più, consulta Token di accesso e Migliorare la sicurezza in Bitbucket: introduzione della scadenza per i token di accesso nella documentazione di Bitbucket Cloud.

Passaggi successivi