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.

    Enable the APIs

Permissões do IAM obrigatórias

Para receber as permissões necessárias para se conectar, peça ao administrador para conceder a você 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.

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: permite 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
    • 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

Para conectar o Cloud Build ao host do Bitbucket Cloud, siga estas etapas:

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

    Abrir a página Repositórios

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

  2. No seletor de projetos, selecione seu projeto do 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 a 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 espaço de trabalho do seu 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. Para armazenar seus tokens de acesso no Secret Manager no projetoGoogle 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 é o token de acesso de administrador.
      • ADMIN_SECRET_NAME é o nome que você quer dar ao secret do token de acesso do administrador no Secret Manager.
      • READ_TOKEN é o 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 comando abaixo, 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 segredos não estiverem todos 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 secreto de 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 secret do token de acesso de leitura.
    • WEBHOOK_SECRET_NAME é o nome do secret do webhook.

Terraform

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

No exemplo abaixo, 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 segredos.
  • 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 seu Google Cloud projeto.
  • ADMIN_TOKEN_NAME é o nome do token com webhook, repository, repository:admin e acesso de escopo pullrequest.
  • ADMIN_TOKEN_VALUE é o valor de ADMIN_TOKEN_NAME.
  • READ_TOKEN_NAME é o nome do token com escopo repository:read.
  • READ_TOKEN_VALUE é o valor de 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 da sua conexão.
  • CONNECTION_NAME é o nome da conexão.
  • WORKSPACE_ID é o ID do Workspace do repositório do Bitbucket Cloud.

A seguir