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 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. Conclua as etapas a seguir 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 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 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 secret do 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 sua conexão.
  • CONNECTION_NAME é o nome da conexão.
  • WORKSPACE_ID é o ID do espaço de trabalho do repositório do Bitbucket Cloud.

A seguir