Conectar-se a um host do Bitbucket Cloud

Esta página explica como se conectar a um host do Bitbucket Cloud para o Cloud Build.

Antes de começar

  • Enable the Cloud Build, Secret Manager, and Compute Engine APIs.

    Enable the APIs

Permissões do IAM obrigatórias

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

Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de 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 a origem o 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
      • Solicitações de envio: Read
      • Webhooks: leitura e gravação.
    • Token de acesso de leitura:

      • Repositórios: Ler
  3. Copie seus tokens para usar nos procedimentos a seguir.

Conectar-se a um host do Bitbucket Cloud

Console

Conecte o Cloud Build ao host do Bitbucket Cloud concluindo as seguintes etapas:

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

    Abrir a página Repositórios

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

  2. No seletor de projetos, escolha seu projeto do Google Cloud.

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

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

  5. Selecione Bitbucket como o provedor de origem.

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

    1. Região: selecione uma região para a conexão.

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

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

    4. Espaço de trabalho: insira o ID do espaço de trabalho do seu repositório do Bitbucket Cloud.

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

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

  7. Clique em Conectar.

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

gcloud

  1. Conclua as etapas a seguir para armazenar suas credenciais:

    1. Para armazenar seus tokens de acesso no Secret Manager no seu projeto do Google Cloud, execute 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 atribuir; o secret do token de acesso de administrador no Secret Manager.
      • READ_TOKEN é o token de acesso de leitura.
      • READ_SECRET_NAME é o nome que você quer dar à conta um secret do token de acesso somente leitura no Secret Manager.
    2. Crie um secret do webhook no Secret Manager executando o seguinte comando, em que WEBHOOK_SECRET_NAME é o nome que você quer dar ao secret do webhook:

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

      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 ID do projeto do Google Cloud.
      • ADMIN_SECRET_NAME é o nome do secret do token de administrador.
      • READ_SECRET_NAME é o nome do secreto de token de leitura.
      • WEBHOOK_SECRET_NAME é o nome do chave secreta 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 ID do projeto do Google Cloud.
    • REGION é a região da conexão de host.
    • ADMIN_SECRET_NAME é o nome do secret do token de administrador.
    • READ_SECRET_NAME é o nome do secret do token de acesso de leitura.
    • WEBHOOK_SECRET_NAME é o nome do secret do webhook.

Terraform

Conecte o 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 do 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 ID do projeto do Google Cloud.
  • PROJECT_NUMBER é seu projeto do Google Cloud número
  • ADMIN_TOKEN_NAME é o nome do seu token com Acesso aos escopos webhook, repository, repository:admin e pullrequest.
  • ADMIN_TOKEN_VALUE é o valor da ADMIN_TOKEN_NAME.
  • READ_TOKEN_NAME é o nome do seu token com repository:read.
  • READ_TOKEN_VALUE é o valor da READ_TOKEN_NAME.
  • WEBHOOK_SECRET_NAME é o nome do secret do webhook.
  • WEBHOOK_SECRET_VALUE é o valor de WEBHOOK_SECRET_NAME.
  • REGION é a região para sua conexão.
  • CONNECTION_NAME é o nome da conexão.
  • WORKSPACE_ID é o ID do Workspace do repositório do Bitbucket Cloud.

A seguir