Crie uma associação a um anfitrião do Bitbucket Cloud

Esta página explica como associar um anfitrião do Bitbucket Cloud ao Cloud Build.

Antes de começar

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

    Enable the APIs

Autorizações de IAM necessárias

Para receber as autorizações de que precisa para estabelecer ligação, peça ao seu administrador para lhe conceder a função de IAM Administrador de ligações do Cloud Build (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.

Crie tokens de acesso do Bitbucket Cloud

Crie as seguintes duas chaves de acesso no Bitbucket Cloud:

  • Token de acesso de administrador: para ligar e desligar repositórios.
  • Chave de acesso de leitura: para permitir que o Cloud Build aceda ao seu código fonte.

Para criar estes tokens, siga estes passos:

  1. Inicie sessão no Bitbucket Cloud.

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

    Conceda as seguintes autorizações:

    • Chave de acesso de administrador:

      • Repositórios: leitura e administração
      • Pedidos de envio: leitura
      • Webhooks: Leitura e Escrita
    • Chave de acesso de leitura:

      • Repositórios: leitura
  3. Copie os seus tokens para utilização nos procedimentos seguintes.

Crie uma associação a um anfitrião do Bitbucket Cloud

Consola

Associe o Cloud Build ao seu anfitrião do Bitbucket Cloud concluindo os passos seguintes:

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

    Abra a página Repositórios

    É apresentada a página Repositórios.

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

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

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

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

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

    3. Na secção Detalhes do anfitrião, selecione Bitbucket Cloud como o tipo de anfitrião.

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

    5. Chave de acesso: introduza a chave de acesso de administrador criada anteriormente.

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

  7. Clique em Ligar.

    A nova associação é apresentada na página Repositórios.

gcloud

  1. Conclua os passos seguintes para armazenar as suas credenciais:

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

      Onde:

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

      echo -n ${ex.(random-uuid)} | gcloud secrets create WEBHOOK_SECRET_NAME --data-file=-
      
    3. Se os seus 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"
      

      Onde:

      • PROJECT_ID é o seu Google Cloud ID do projeto.
      • ADMIN_SECRET_NAME é o nome do segredo do token de administrador.
      • READ_SECRET_NAME é o nome do seu segredo do token de leitura.
      • WEBHOOK_SECRET_NAME é o nome do segredo do webhook.
  2. Ligue o Cloud Build ao seu anfitrião do Bitbucket Cloud através do 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
    

    Onde:

    • CONNECTION_NAME é o nome que quer dar à ligação ao seu anfitrião do Bitbucket Cloud.
    • WORKSPACE_ID é o ID do espaço de trabalho do seu repositório do Bitbucket Cloud.
    • PROJECT_ID é o seu Google Cloud ID do projeto.
    • REGION é a região da sua ligação de anfitrião.
    • ADMIN_SECRET_NAME é o nome do segredo do token de administrador.
    • READ_SECRET_NAME é o nome do segredo da chave de acesso de leitura.
    • WEBHOOK_SECRET_NAME é o nome do segredo do webhook.

Terraform

Pode associar o seu anfitrião do Bitbucket Cloud 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 Secret do Secret Manager para armazenar os tokens do Bitbucket.
  • Concede as autorizações necessárias ao agente de serviço do Cloud Build para aceder a segredos.
  • Cria uma ligação do 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
        ]
    }
    

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 acesso ao âmbito de 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 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 é o nome da sua associação.
  • WORKSPACE_ID é o ID do espaço de trabalho do seu repositório do Bitbucket Cloud.

O que se segue?