Conectar-se a um host do Bitbucket Data Center

Nesta página, explicamos como conectar um host do Bitbucket Data Center ao Cloud Build. A conexão a um host do Bitbucket Data Center integra seus repositórios do Bitbucket Data Center ao Cloud Build. Dessa forma, você pode configurar gatilhos de build para criar repositórios do Bitbucket Data Center e criar repositórios do Bitbucket Data Center em uma rede privada.

Antes de começar

  • Enable the Cloud Build and Secret Manager 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

Permissões do IAM obrigatórias

Para receber as permissões necessárias para se conectar ao host do Bitbucket Data Center, peça ao administrador para conceder a você o papel do IAM de Administrador de conexão do Cloud Build (roles/cloudbuild.connectionAdmin) na sua conta de usuário. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias usando papéis personalizados ou outros papéis predefinidos.

Se a instância do Bitbucket Data Center estiver hospedada em uma rede particular, consulte Criar repositórios do Bitbucket Data Center em uma rede particular para saber mais sobre os papéis adicionais do IAM necessários para configurar uma conexão de host.

Criar tokens de acesso pessoal

Antes de criar uma conexão de host para sua instância do Bitbucket Data Center, faça o seguinte para criar tokens de acesso pessoal no Bitbucket Data Center:

  1. Faça login na sua instância do Bitbucket Data Center.

  2. Siga as instruções para criar tokens de acesso HTTP para sua conta de usuário.

    1. Crie um token de acesso com o escopo administrador do repositório para usar na conexão e desconexão de repositórios.

    2. Crie um token de acesso com o escopo leitura do repositório para garantir que os repositórios do Cloud Build possam acessar o código-fonte nos repositórios.

  3. Salve os valores de token com segurança. Você vai usá-los para se conectar ao repositório do Bitbucket Data Center.

Conectar-se a um host do Bitbucket Data Center

Console

Para conectar seu host do Bitbucket Data Center ao Cloud Build:

  1. Abra a página Repositórios no console do Google Cloud .

    Abrir a página Repositórios

  2. Na parte de cima da página, selecione a guia 2ª geração.

  3. No seletor de projetos, na barra superior, selecione seu projeto Google Cloud .

  4. Clique em Criar conexão de host para conectar um novo host ao Cloud Build.

  5. No painel à esquerda, selecione Bitbucket como seu provedor de origem.

  6. Na seção Configurar conexão, insira as seguintes informações:

    1. Região: selecione uma região para sua conexão. É necessário especificar uma região. Sua conexão não pode existir globalmente.

    2. Nome: insira um nome para a conexão.

  7. Na seção Detalhes do host, selecione ou insira as seguintes informações:

    1. Host do Bitbucket: selecione Data Center do Bitbucket como seu host.

    2. URL do host: insira o URL do host do Bitbucket Data Center.

  8. Na seção Rede, selecione uma das seguintes opções:

    1. Internet pública: selecione essa opção se a instância estiver acessível usando a Internet pública.

    2. Rede particular: selecione essa opção se a instância estiver hospedada em uma rede particular.

      1. Certificado de CA: seu certificado autoassinado. Clique em Procurar para abrir o certificado da sua máquina local.

        O certificado não pode exceder 10 KB e precisa estar no formato PEM (.pem, .cer ou .crt). Se você deixar esse campo em branco, o Cloud Build usará um certificado do conjunto padrão de certificados.

      2. Na seção Serviço do Service Directory, selecione o local do seu serviço. Você pode aceitar o ID do projeto preenchido previamente ou especificar outro projeto.

        1. Selecione o projeto do seu serviço. Você pode aceitar o projeto pré-preenchido, escolher Em outro projeto para procurar ou escolher Inserir manualmente.

          Se você escolher Inserir manualmente, insira as seguintes informações:

          • Projeto: insira ou selecione seu ID do projeto Google Cloudno menu suspenso.

          • Região: esse campo pré-seleciona a região da sua conexão. A região especificada para o serviço precisa corresponder à região associada à conexão.

        2. Namespace: selecione o namespace do seu serviço.

        3. Serviço: selecione o nome do serviço no seu namespace.

  9. Na seção Tokens de acesso HTTP, insira as seguintes informações:

    1. Token de acesso de administrador: insira o token com o acesso ao escopo de administrador do repositório. Esse token é usado para conectar e desconectar repositórios.

    2. Token de acesso de leitura: insira o token com acesso ao escopo de leitura do repositório. Os gatilhos do Cloud Build usam esse token para acessar o código fonte nos repositórios.

  10. Clique em Conectar.

    Depois de clicar no botão Conectar, seus tokens de acesso pessoal serão armazenados com segurança no Secret Manager. Depois de se conectar ao host do Bitbucket Data Center, o Cloud Build cria um webhook secret em seu nome. Você pode acessar e gerenciar seus secrets na página do Secret Manager.

gcloud

  1. Armazene seus tokens no Secret Manager.

  2. Crie um secret de webhook no Secret Manager executando o comando a seguir, em que WEBHOOK_SECRET é o nome que você quer dar ao secret de webhook:

      cat /proc/sys/kernel/random/uuid | tr -d '\n' | gcloud secrets create WEBHOOK_SECRET --data-file=-
    
  3. Se você armazenar seus segredos em um projeto Google Cloud diferente daquele que planeja usar para criar uma conexão de host, execute o seguinte comando para conceder ao seu projeto acesso ao agente de serviço do 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"
    

    Em que:

    • PROJECT_ID é o ID do projeto Google Cloud .

Agora você pode conectar seu host do Bitbucket Data Center ao Cloud Build.

  1. Execute o comando a seguir para criar uma conexão do 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 é um nome para sua conexão de host do data center do Bitbucket no Cloud Build.
    • HOST_URI é o URI da sua instância do Bitbucket Data Center.
    • PROJECT_ID é o Google Cloud ID do projeto.
    • REGION é a região da sua conexão.
    • ADMIN_TOKEN é o nome do token com escopo de administrador do repositório.
    • READ_TOKEN é o nome do token com escopo de leitura do repositório.
    • SECRET_VERSION é a versão do seu secret.
    • WEBHOOK_SECRET é o secret do webhook.

Terraform

É possível conectar seu host do Bitbucket Data Center ao Cloud Build usando o Terraform.

No exemplo a seguir, o snippet de código faz o seguinte:

  • Configura o provedor do Google para Terraform.
  • Cria um secret do Secret Manager para armazenar os tokens do Bitbucket.
  • Concede as permissões necessárias ao agente de serviço do Cloud Build para acessar secrets.
  • Cria uma conexão do 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
        ]
    }
    

Em que:

  • PROJECT_ID é o Google Cloud ID do projeto.
  • PROJECT_NUMBER é o número do projeto Google Cloud .
  • ADMIN_TOKEN_NAME é o nome do seu token com escopo repository:admin.
  • ADMIN_TOKEN_VALUE é o valor do seu ADMIN_TOKEN_NAME.
  • READ_TOKEN_NAME é o nome do seu token com escopo repository:read.
  • READ_TOKEN_VALUE é o valor do seu READ_TOKEN_NAME.
  • WEBHOOK_SECRET_NAME é o nome do secret do webhook.
  • WEBHOOK_SECRET_VALUE é o valor do seu WEBHOOK_SECRET_NAME.
  • REGION é a região da conexão.
  • CONNECTION_NAME é um nome para sua conexão de host do data center do Bitbucket no Cloud Build.
  • BITBUCKET_URI é o URI da sua instância do Bitbucket Data Center.

Fazer a rotação de tokens de acesso antigos ou expirados do Bitbucket Data Center

Se o token de acesso do Bitbucket Data Center expirar, a conexão do host do Cloud Build será desconectada do repositório do Bitbucket Data Center. Como resultado, você vai encontrar erros nas seguintes circunstâncias:

  • Quando você tenta vincular um repositório do Bitbucket Data Center a uma conexão do Cloud Build, uma mensagem Failed to fetch repositories to link. Check that Cloud Build is still authorized to access data from the selected connection aparece.

  • Na página Acionadores, quando você clica em Executar, a página Executar acionador é aberta e mostra uma mensagem Failed to list branches. You can still enter one manually.

Para fazer a rotação de um token antigo ou expirado da sua conexão, faça o seguinte:

  1. Encontre os secrets associados à conexão do host:

    1. Execute este comando:

      gcloud builds connections describe CONNECTION_PATH --region=REGION
      

      Em que:

      • CONNECTION_PATH é o caminho da conexão do host do Bitbucket Data Center no Cloud Build, no formato projects/PROJECT_ID/locations/REGION/connections/CONNECTION_NAME.
      • REGION é a região da sua conexão.
    2. Na saída do comando, procure os valores dos campos do token de usuário. readAuthorizerCredential.userTokenSecretVersion mostra o nome do Secret Manager do token Read, e authorizerCredential.userTokenSecretVersion mostra o nome do Secret Manager do token Admin. Esses nomes são armazenados como secrets no Secret Manager.

  2. Gire cada token de acesso no Bitbucket Data Center:

    1. Acesse o repositório do Bitbucket Data Center conectado à sua conexão de host do Cloud Build.

    2. Siga as instruções na documentação do Bitbucket para fazer a rotação de um token de acesso. Quando você faz a rotação de um token, o Bitbucket Data Center cria um novo token com novas credenciais e invalida a versão anterior. O token rotacionado tem as mesmas permissões e escopo do token original.

    3. Copie o ID do token rotacionado.

  3. Crie uma nova versão do secret para cada token:

    1. Abra a página do Secret Manager no console Google Cloud :

      Abrir a página "Gerenciador de secrets"

    2. Para cada token que você girou, encontre o nome do secret identificado na etapa 1, clique em Ações e em Adicionar nova versão.

    3. Na janela Adicionar nova versão, insira o ID do token rotacionado e clique em Adicionar nova versão.

Para mais informações, consulte Tokens de acesso e Como aumentar a segurança no Bitbucket: apresentação da expiração para tokens de acesso na documentação do Bitbucket Data Center.

A seguir