Cómo conectarse a un host de Bitbucket Data Center

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

Antes de comenzar

  • Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  • Ten listo tu código fuente en un repositorio de Bitbucket Data Center.
  • Tener un Dockerfile o un archivo de configuración de Cloud Build en tu repositorio de código fuente de Bitbucket Data Center
  • Si no instalaste una instancia de Bitbucket Data Center, consulta Cómo instalar Bitbucket Data Center para obtener instrucciones.
  • Para usar los comandos de gcloud de esta página, instala Google Cloud CLI.

Permisos de IAM obligatorios

  • Para obtener los permisos que necesitas para conectar tu host de Bitbucket Data Center, pídele a tu administrador que te otorgue el rol de IAM de Administrador de conexión de Cloud Build (roles/cloudbuild.connectionAdmin) en la cuenta de usuario. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso.

También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.

Cómo conectarse a un host de Bitbucket Data Center

Antes de crear una conexión de host para tu instancia de Bitbucket Data Center, debes crear tokens de acceso personal en Bitbucket Data Center. Para ello, completa los siguientes pasos:

  1. Accede a tu instancia de Bitbucket Data Center.

  2. Sigue las instrucciones para crear tokens de acceso HTTP para tu cuenta de usuario.

    1. Crea un token de acceso con el permiso de administrador de repositorios para usarlo en la conexión y desconexión de repositorios.

    2. Crea un token de acceso con el permiso de lectura del repositorio para asegurarte de que los repositorios de Cloud Build puedan acceder al código fuente en los repositorios.

Console

Para conectar tu host de Bitbucket Data Center a Cloud Build, haz lo siguiente:

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

    Abrir la página repositorios

    Verás la página Repositorios.

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

  3. En el selector de proyectos de la barra superior, selecciona tu proyecto de Google Cloud.

  4. Haz clic en Create host connection para conectar un host nuevo a Cloud Build.

  5. En el panel izquierdo, selecciona Bitbucket como proveedor de origen.

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

    1. Región: Selecciona una región para tu conexión. Debes especificar una región. Tu conexión no puede existir a nivel global.

    2. Nombre: Ingresa un nombre para tu conexión.

  7. En la sección Detalles del host, selecciona o ingresa la siguiente información:

    1. Host de Bitbucket: Selecciona Bitbucket Data Center como host.

    2. URL del host: Ingresa la URL de tu host de Bitbucket Data Center.

  8. En la sección Herramientas de redes, selecciona una de las siguientes opciones:

    1. Internet pública: Selecciona esta opción si se puede acceder a tu instancia a través de Internet pública.

    2. Red privada: Selecciona esta opción si tu instancia se aloja en una red privada.

      1. Certificado de AC: Es tu certificado autofirmado. Haz clic en Explorar para abrir el certificado desde tu máquina local.

        El certificado no debe tener un tamaño superior a 10 KB y debe estar en formato PEM (.pem, .cer o .crt). Si dejas este campo en blanco, Cloud Build usará un certificado del conjunto predeterminado de certificados.

      2. En la sección Servicio de directorio de servicios, selecciona la ubicación de tu servicio. Puedes aceptar el ID del proyecto prepropagado o especificar uno diferente.

        1. Selecciona el proyecto de tu servicio. Puedes aceptar el proyecto prepropagado, elegir En otro proyecto para explorarlo o elegir Ingresar manualmente.

          Si eliges esta opción, ingresa la siguiente información:

          • Project: Ingresa o selecciona el ID de tu Google Cloud proyecto en el menú desplegable.

          • Región: En este campo, se preselecciona la región de la conexión. La región especificada para tu servicio debe coincidir con la región asociada con tu conexión.

        2. Espacio de nombres: Selecciona el espacio de nombres de tu servicio.

        3. Servicio: Selecciona el nombre del servicio en tu espacio de nombres.

  9. En la sección Tokens de acceso HTTP, ingresa la siguiente información:

    1. Token de acceso de administrador: Ingresa el token con el acceso de permiso de administrador de repositorios. Este token se usa para conectar y desconectar repositorios.

    2. Token de acceso de lectura: Ingresa el token con el acceso al permiso de lectura de repositorios. Los activadores de Cloud Build usan este token para acceder al código fuente en los repositorios.

  10. Haz clic en Conectar.

    Después de hacer clic en el botón Connect, tus tokens de acceso personal se almacenarán de forma segura en Secret Manager. Después de conectarte al host de Bitbucket Data Center, Cloud Build crea un secreto de webhook en tu nombre. Puedes ver y administrar tus secretos en la página Secret Manager.

gcloud

  1. Almacena tus tokens en Secret Manager.

  2. Para crear un secreto de webhook en Secret Manager, ejecuta el siguiente comando, en el que WEBHOOK_SECRET es el nombre que deseas asignar a tu secreto de webhook:

      cat /proc/sys/kernel/random/uuid | tr -d '\n' | gcloud secrets create WEBHOOK_SECRET --data-file=-
    
  3. Si almacenas tus secretos en un Google Cloud proyecto diferente al que planeas usar para crear una conexión con el host, ejecuta el siguiente comando para otorgarle a tu proyecto acceso al agente de servicio de Cloud Build:

    PN=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
    CLOUD_BUILD_SERVICE_AGENT="service-${PN}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${CLOUD_BUILD_SERVICE_AGENT}" \ \
        --role="roles/secretmanager.admin"
    

    Aquí:

    • PROJECT_ID es el Google Cloud ID de tu proyecto.

Ahora puedes conectar tu host de Bitbucket Data Center a Cloud Build.

  1. Ejecuta el siguiente comando para crear una conexión de Bitbucket Data Center:

    gcloud builds connections create bitbucket-data-center CONNECTION_NAME \
        --host-uri=HOST_URI \
        --project=PROJECT_ID \
        --region=REGION \
        --authorizer-token-secret-version=projects/PROJECT_ID/secrets/ADMIN_TOKEN/versions/SECRET_VERSION \
        --read-authorizer-token-secret-version=projects/PROJECT_ID/secrets/READ_TOKEN/versions/SECRET_VERSION \
        --webhook-secret-secret-version=projects/PROJECT_ID/secrets/WEBHOOK_SECRET/versions/SECRET_VERSION
     ```
    
    Where:
    
    • CONNECTION_NAME es el nombre de tu conexión.
    • HOST_URI es el URI de tu instancia de Bitbucket Data Center.
    • PROJECT_ID es el Google Cloud ID de tu proyecto.
    • REGION es la región de tu conexión.
    • ADMIN_TOKEN es el nombre de tu token con permiso de administrador de repositorios.
    • READ_TOKEN es el nombre de tu token con permiso de lectura de repositorios.
    • SECRET_VERSION es la versión de tu secreto.
    • WEBHOOK_SECRET es el secreto de tu webhook.

Terraform

Puedes conectar tu host de Bitbucket Data Center a Cloud Build con 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.
  • Otorga los permisos necesarios al agente de servicio de Cloud Build para acceder a los secretos.
  • Crea una conexión de Bitbucket Data Center.

    // 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 resource
    resource "google_cloudbuildv2_connection" "my-connection" {
        project = "PROJECT_ID"
        location = "REGION"
        name = "CONNECTION_NAME"
    
        bitbucket_data_center_config {
            host_uri = "BITBUCKET_URI"
            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
        ]
    }
    

Aquí:

  • PROJECT_ID es el Google Cloud ID de tu proyecto.
  • PROJECT_NUMBER es el Google Cloud número de proyecto.
  • ADMIN_TOKEN_NAME es el nombre de tu token con el permiso repository:admin.
  • ADMIN_TOKEN_VALUE es el valor de tu ADMIN_TOKEN_NAME.
  • READ_TOKEN_NAME es el nombre de tu token con el permiso repository:read.
  • READ_TOKEN_VALUE es el valor de tu READ_TOKEN_NAME.
  • WEBHOOK_SECRET_NAME es el nombre del secreto de tu 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.
  • BITBUCKET_URI es el URI de tu instancia de Bitbucket Data Center.

¿Qué sigue?