Conectarse a un host de Bitbucket Cloud

En esta página se explica cómo conectar un host de Bitbucket Cloud a Cloud Build.

Antes de empezar

  • 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

Permisos de gestión de identidades y accesos necesarios

Para obtener los permisos que necesitas para conectarte, pide a tu administrador que te conceda el rol de gestión de identidades y accesos de administrador de conexiones de Cloud Build (cloudbuild.connectionAdmin) en tu cuenta de usuario. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Crear tokens de acceso de Bitbucket Cloud

Crea los dos tokens de acceso siguientes en Bitbucket Cloud:

  • Token de acceso de administrador: para conectar y desconectar repositorios.
  • Token de acceso de lectura: permite que Cloud Build acceda a tu código fuente.

Para crear estos tokens, sigue estos pasos:

  1. Inicia sesión en Bitbucket Cloud.

  2. Sigue las instrucciones de Bitbucket Cloud para crear tokens de acceso vinculados a tu repositorio, proyecto o espacio de trabajo.

    Concede los siguientes permisos:

    • Token de acceso de administrador:

      • Repositorios: Lectura y Administrar
      • Solicitudes de extracción: leer
      • Webhooks: lectura y escritura
    • Token de acceso de lectura:

      • Repositorios: Leer
  3. Copia tus tokens para usarlos en los procedimientos siguientes.

Conectarse a un host de Bitbucket Cloud

Consola

Conecta Cloud Build a tu host de Bitbucket Cloud siguiendo estos pasos:

  1. Abre la página Repositorios en la consola de Google Cloud .

    Abre la página Repositorios.

    Verás la página Repositorios.

  2. En el selector de proyectos, selecciona tu Google Cloud proyecto.

  3. En la parte superior de la página, selecciona la pestaña 2.ª gen..

  4. Haz clic en Crear conexión de host para conectar un host nuevo a Cloud Build.

  5. Selecciona Bitbucket como proveedor de la fuente.

  6. En la sección Configurar conexión, introduce la siguiente información:

    1. Región: selecciona una región para tu conexión.

    2. Nombre: introduce un nombre para la conexión.

    3. En la sección Detalles del host, selecciona Bitbucket Cloud como tipo de host.

    4. Espacio de trabajo: introduce el ID del espacio de trabajo de tu repositorio de Bitbucket Cloud.

    5. Token de acceso: introduce el token de acceso de administrador que has creado anteriormente.

    6. Token de acceso de lectura: introduce el token de acceso de lectura que has creado anteriormente.

  7. Haz clic en Conectar.

    La nueva conexión aparecerá en la página Repositorios.

gcloud

  1. Sigue estos pasos para almacenar tus credenciales:

    1. Almacena tus tokens de acceso en Secret Manager en tuGoogle Cloud proyecto ejecutando los siguientes comandos:

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

      Donde:

      • ADMIN_TOKEN es tu token de acceso de administrador.
      • ADMIN_SECRET_NAME es el nombre que quieres dar al secreto de tu token de acceso de administrador en Secret Manager.
      • READ_TOKEN es tu token de acceso de lectura.
      • READ_SECRET_NAME es el nombre que quieres dar al secreto del token de acceso de lectura en Secret Manager.
    2. Crea un secreto de webhook en Secret Manager ejecutando el siguiente comando, donde WEBHOOK_SECRET_NAME es el nombre que quieres dar al secreto de webhook:

      echo -n ${ex.(random-uuid)} | gcloud secrets create WEBHOOK_SECRET_NAME --data-file=-
      
    3. Si tus secretos no están en el mismo proyecto, concede acceso a tu agente de servicio de Cloud Build ejecutando lo siguiente:

      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"
      

      Donde:

      • PROJECT_ID es el Google Cloud ID de tu proyecto.
      • ADMIN_SECRET_NAME es el nombre de tu secreto de token de administrador.
      • READ_SECRET_NAME es el nombre de tu secreto de token de lectura.
      • WEBHOOK_SECRET_NAME es el nombre de tu secreto de webhook.
  2. Conecta Cloud Build a tu host de Bitbucket Cloud con el siguiente 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
    

    Donde:

    • CONNECTION_NAME es el nombre que quieres dar a la conexión con tu host de Bitbucket Cloud.
    • WORKSPACE_ID es el ID de espacio de trabajo de tu repositorio de Bitbucket Cloud.
    • PROJECT_ID es el Google Cloud ID de tu proyecto.
    • REGION es la región de tu conexión de host.
    • ADMIN_SECRET_NAME es el nombre del secreto de tu token de administrador.
    • READ_SECRET_NAME es el nombre de tu secreto de token de acceso de lectura.
    • WEBHOOK_SECRET_NAME es el nombre de tu secreto de webhook.

Terraform

Puedes conectar tu host de Bitbucket Cloud a Cloud Build mediante Terraform.

En el siguiente ejemplo, el fragmento de código hace lo siguiente:

  • Configura el proveedor de Google de Terraform.
  • Crea un secreto de Secret Manager para almacenar los tokens de Bitbucket.
  • Concede los permisos necesarios al agente de servicio de Cloud Build para acceder a los secretos.
  • Crea una conexión de 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
        ]
    }
    

Donde:

  • PROJECT_ID es el Google Cloud ID de tu proyecto.
  • PROJECT_NUMBER es el número de tu proyecto Google Cloud .
  • ADMIN_TOKEN_NAME es el nombre de tu token con acceso a los ámbitos webhook, repository, repository:admin y pullrequest.
  • ADMIN_TOKEN_VALUE es el valor de tu ADMIN_TOKEN_NAME.
  • READ_TOKEN_NAME es el nombre de tu token con el ámbito repository:read.
  • READ_TOKEN_VALUE es el valor de tu READ_TOKEN_NAME.
  • WEBHOOK_SECRET_NAME es el nombre de tu secreto de webhook.
  • WEBHOOK_SECRET_VALUE es el valor de tu WEBHOOK_SECRET_NAME.
  • REGION es la región de tu conexión.
  • CONNECTION_NAME es el nombre de tu conexión.
  • WORKSPACE_ID es el ID de Workspace de tu repositorio de Bitbucket Cloud.

Siguientes pasos