Conectar-se a um host do Bitbucket Cloud

Nesta página, explicamos como conectar um host do Bitbucket Cloud ao Cloud Build.

Antes de começar

  • 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

Permissões do IAM obrigatórias

Para garantir que tenha as permissões necessárias para se conectar, peça ao administrador para conceder a o papel do IAM de Administrador da conexão do Cloud Build (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.

O administrador também pode conceder as permissões necessárias por meio de papéis personalizados ou outros papéis predefinidos.

Criar tokens de acesso do Bitbucket Cloud

Crie os dois tokens de acesso a seguir no Bitbucket Cloud:

  • Token de acesso de administrador para conectar e desconectar repositórios.
  • Token de acesso de leitura para permitir que o Cloud Build acesse seu código-fonte.

Para criar esses tokens, siga estas etapas:

  1. Faça login no Bitbucket Cloud.

  2. Siga as instruções do Bitbucket Cloud para criar tokens de acesso vinculados ao seu repositório, projeto ou espaço de trabalho.

    Conceda as seguintes permissões:

    • Token de acesso de administrador:

      • Repositórios: Leitura e Administrador
      • Pull requests: Ler
      • Webhooks: Leitura e gravação
    • Ler token de acesso:

      • Repositórios: Leitura
  3. Copie os tokens para usar nos procedimentos a seguir.

Conectar-se a um host do Bitbucket Cloud

Console

Conecte o Cloud Build ao seu host do Bitbucket Cloud seguindo estas etapas:

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

    Abrir a página Repositórios

    Você vai ver a página Repositórios.

  2. No seletor de projetos, selecione seu projeto Google Cloud .

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

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

  5. 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.

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

    3. Na seção Detalhes do host, selecione Bitbucket Cloud como o tipo de host.

    4. Workspace: insira o ID do workspace do repositório do Bitbucket Cloud.

    5. Token de acesso: insira o token de acesso de administrador criado anteriormente.

    6. Token de acesso de leitura: insira o token de acesso de leitura criado anteriormente.

  7. Clique em Conectar.

    A nova conexão aparece na página Repositórios.

gcloud

  1. Siga estas etapas para armazenar suas credenciais:

    1. Armazene seus tokens de acesso no Secret Manager no seu projetoGoogle Cloud executando os seguintes 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=-
      

      Em que:

      • ADMIN_TOKEN é seu token de acesso de administrador.
      • ADMIN_SECRET_NAME é o nome que você quer dar ao secret do token de acesso de administrador no Secret Manager.
      • READ_TOKEN é seu token de acesso de leitura.
      • READ_SECRET_NAME é o nome que você quer dar ao secret do token de acesso de leitura no Secret Manager.
    2. Crie um secret de webhook no Secret Manager executando o seguinte comando, em que WEBHOOK_SECRET_NAME é o nome que você quer dar ao secret de webhook:

      echo -n ${ex.(random-uuid)} | gcloud secrets create WEBHOOK_SECRET_NAME --data-file=-
      
    3. Se os seus secrets não estiverem no mesmo projeto, conceda acesso ao agente de serviço do Cloud Build executando o seguinte:

      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"
      

      Em que:

      • PROJECT_ID é o Google Cloud ID do projeto.
      • ADMIN_SECRET_NAME é o nome do secret do token de administrador.
      • READ_SECRET_NAME é o nome do secret do token de leitura.
      • WEBHOOK_SECRET_NAME é o nome do secret do webhook.
  2. Conecte o Cloud Build ao host do Bitbucket Cloud usando o seguinte 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
    

    Em que:

    • CONNECTION_NAME é o nome que você quer dar à conexão com o host do Bitbucket Cloud.
    • WORKSPACE_ID é o ID do espaço de trabalho do repositório do Bitbucket Cloud.
    • PROJECT_ID é o Google Cloud ID do projeto.
    • REGION é a região da conexão do host.
    • ADMIN_SECRET_NAME é o nome do secret do token de administrador.
    • READ_SECRET_NAME é o nome do seu Secret de token de acesso de leitura.
    • WEBHOOK_SECRET_NAME é o nome do secret do webhook.

Terraform

É possível conectar seu host do Bitbucket Cloud 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 com o 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
        ]
    }
    

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 acesso ao escopo webhook, repository, repository:admin e pullrequest.
  • 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 é o nome da conexão.
  • WORKSPACE_ID é o ID do espaço de trabalho do repositório do Bitbucket Cloud.

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

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

  • Quando você tenta vincular um repositório do Bitbucket Cloud 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 sua conexão de host do Bitbucket Cloud 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 Cloud:

    1. Acesse o repositório do Bitbucket Cloud conectado à 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 Cloud 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 dos tokens de acesso na documentação do Bitbucket Cloud.

A seguir