Crie uma associação a um anfitrião do Bitbucket Data Center

Esta página explica como associar um anfitrião do Bitbucket Data Center ao Cloud Build. A ligação a um anfitrião do Bitbucket Data Center integra os seus repositórios do Bitbucket Data Center com o Cloud Build. Desta forma, pode configurar acionadores de compilação para criar repositórios a partir do Bitbucket Data Center e criar repositórios a partir do Bitbucket Data Center numa 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

Autorizações de IAM necessárias

Para receber as autorizações de que precisa para se ligar ao seu anfitrião do Bitbucket Data Center, peça ao seu administrador para lhe conceder a função do IAM Administrador da ligação do Cloud Build (roles/cloudbuild.connectionAdmin) na sua conta de utilizador. Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Se a sua instância do Bitbucket Data Center estiver alojada numa rede privada, consulte o artigo Crie repositórios a partir do Bitbucket Data Center numa rede privada para saber mais sobre as funções do IAM adicionais necessárias para configurar uma ligação de anfitrião.

Crie tokens de acesso pessoal

Antes de criar uma associação de anfitrião para a sua instância do Bitbucket Data Center, crie tokens de acesso pessoal no Bitbucket Data Center fazendo o seguinte:

  1. Inicie sessão na sua instância do Bitbucket Data Center.

  2. Siga as instruções para criar tokens de acesso HTTP para a sua conta de utilizador.

    1. Crie um token de acesso com o âmbito de administrador do repositório para usar na associação e desassociação de repositórios.

    2. Crie um token de acesso com o âmbito repository read para garantir que os repositórios do Cloud Build podem aceder ao código-fonte nos repositórios.

  3. Guarde os valores dos tokens em segurança. Vai usá-las para estabelecer ligação ao seu repositório do Bitbucket Data Center.

Crie uma associação a um anfitrião do Bitbucket Data Center

Consola

Para associar o anfitrião do Bitbucket Data Center ao Cloud Build:

  1. Abra a página Repositórios na Google Cloud consola.

    Abra a página Repositórios

  2. Na parte superior da página, selecione o separador 2.ª geração.

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

  4. Clique em Criar associação de anfitrião para associar um novo anfitrião ao Cloud Build.

  5. No painel do lado esquerdo, selecione Bitbucket como fornecedor de origem.

  6. Na secção Configurar associação, introduza as seguintes informações:

    1. Região: selecione uma região para a sua associação. Tem de especificar uma região. A sua associação não pode existir globalmente.

    2. Nome: introduza um nome para a associação.

  7. Na secção Detalhes do anfitrião, selecione ou introduza as seguintes informações:

    1. Anfitrião do Bitbucket: selecione Bitbucket Data Center como anfitrião.

    2. URL do anfitrião: introduza o URL do anfitrião do Bitbucket Data Center.

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

    1. Internet pública: selecione esta opção se a sua instância for acessível através da Internet pública.

    2. Rede privada: selecione esta opção se a sua instância estiver alojada numa rede privada.

      1. Certificado da AC: o seu certificado autoassinado. Clique em Procurar para abrir o certificado a partir do seu computador local.

        O certificado não pode exceder 10 KB e deve estar no formato PEM (.pem, .cer ou .crt). Se deixar este campo em branco, o Cloud Build usa um certificado do conjunto de certificados predefinido.

      2. Na secção Serviço de diretório de serviços, selecione a localização do seu serviço. Pode aceitar o ID do projeto pré-preenchido ou especificar um projeto diferente.

        1. Selecione o projeto do seu serviço. Pode aceitar o projeto pré-preenchido, escolher Noutro projeto para procurar ou escolher Introduzir manualmente.

          Se escolher Introduzir manualmente, introduza as seguintes informações:

          • Projeto: introduza ou selecione o ID do projeto no menu pendente. Google Cloud

          • Região: este campo pré-seleciona a região da sua ligação. A região especificada para o seu serviço tem de corresponder à região associada à sua ligação.

        2. Espaço de nomes: selecione o espaço de nomes do seu serviço.

        3. Serviço: selecione o nome do serviço no seu espaço de nomes.

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

    1. Chave de acesso de administrador: introduza a chave com o acesso ao âmbito do administrador do repositório. Este token é usado para ligar e desligar repositórios.

    2. Token de acesso de leitura: introduza o token com o âmbito de leitura do repositório. Os acionadores do Cloud Build usam este token para aceder ao código-fonte nos repositórios.

  10. Clique em Ligar.

    Depois de clicar no botão Associar, os seus tokens de acesso pessoal são armazenados em segurança no Secret Manager. Depois de estabelecer ligação ao anfitrião do Bitbucket Data Center, o Cloud Build cria um segredo de webhook em seu nome. Pode ver e gerir os seus segredos na página Secret Manager.

gcloud

  1. Armazene os seus tokens no Secret Manager.

  2. Crie um segredo de webhook no Secret Manager executando o seguinte comando, em que WEBHOOK_SECRET é o nome que quer dar ao seu segredo de webhook:

      cat /proc/sys/kernel/random/uuid | tr -d '\n' | gcloud secrets create WEBHOOK_SECRET --data-file=-
    
  3. Se armazenar os seus segredos num Google Cloud projeto diferente do que planeia usar para criar uma associação de anfitrião, 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"
    

    Onde:

    • PROJECT_ID é o ID do seu Google Cloud projeto.

Pode continuar a associar o anfitrião do Bitbucket Data Center ao Cloud Build.

  1. Execute o seguinte comando para criar uma associaçã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 a ligação do anfitrião do Bitbucket Data Center no Cloud Build.
    • HOST_URI é o URI da sua instância do Bitbucket Data Center.
    • PROJECT_ID é o seu Google Cloud ID do projeto.
    • REGION é a região da sua ligação.
    • ADMIN_TOKEN é o nome do seu token com o âmbito de administrador do repositório.
    • READ_TOKEN é o nome do seu token com o âmbito de leitura do repositório.
    • SECRET_VERSION é a versão do seu segredo.
    • WEBHOOK_SECRET é o seu código secreto do webhook.

Terraform

Pode ligar o anfitrião do Bitbucket Data Center ao Cloud Build através do Terraform.

No exemplo seguinte, o fragmento do código faz o seguinte:

  • Configura o fornecedor Google do Terraform.
  • Cria um segredo do Secret Manager para armazenar os tokens do Bitbucket.
  • Concede as autorizações necessárias ao agente do serviço do Cloud Build para aceder a segredos.
  • Cria uma ligaçã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
        ]
    }
    

Onde:

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

Rode tokens de acesso antigos ou expirados do Bitbucket Data Center

Se o token de acesso do Bitbucket Data Center expirar, a ligação do host do Cloud Build é desassociada do respetivo repositório do Bitbucket Data Center. Como resultado, vai ver erros nas seguintes circunstâncias:

  • Quando tenta associar um repositório do Bitbucket Data Center a uma ligação do Cloud Build, é apresentada uma mensagem Failed to fetch repositories to link. Check that Cloud Build is still authorized to access data from the selected connection.

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

Para rodar um token antigo ou expirado para a sua ligação, faça o seguinte:

  1. Encontre os segredos associados à ligação do anfitrião:

    1. Execute o seguinte comando:

      gcloud builds connections describe CONNECTION_PATH --region=REGION
      

      Onde:

      • CONNECTION_PATH é o caminho da ligação do anfitrião do Bitbucket Data Center no Cloud Build, no formato projects/PROJECT_ID/locations/REGION/connections/CONNECTION_NAME.
      • REGION é a região da sua ligação.
    2. No resultado do comando, procure os valores dos campos do token de utilizador. readAuthorizerCredential.userTokenSecretVersion mostra o nome do Secret Manager do Read token e authorizerCredential.userTokenSecretVersion mostra o nome do Secret Manager do Admin token. Estes nomes são armazenados como segredos no Secret Manager.

  2. Rode cada chave de acesso no Bitbucket Data Center:

    1. Aceda ao repositório do Bitbucket Data Center associado à ligação do anfitrião do Cloud Build.

    2. Siga as instruções na documentação do Bitbucket para rodar um token de acesso. Quando roda um token, o Bitbucket Data Center cria um novo token com novas credenciais e invalida a versão anterior desse token. O token com rotação tem as mesmas autorizações e âmbito que o token original.

    3. Copie o ID do token rodado.

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

    1. Abra a página Secret Manager na Google Cloud consola:

      Abra a página Secret Manager

    2. Para cada token que rodou, encontre o nome secreto que identificou no passo 1 e clique em Ações e, de seguida, clique em Adicionar nova versão.

    3. Na janela Adicionar nova versão, introduza o ID do token rodado e, de seguida, clique em Adicionar nova versão.

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

O que se segue?