Nesta página, explicamos como conectar um host do Bitbucket Cloud ao Cloud Build.
Antes de começar
Ative as APIs Cloud Build, Secret Manager e Compute Engine, se alguma delas ainda não estiver ativada.
Funções necessárias para ativar APIs
Para ativar APIs, você precisa da permissão
serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão com o papel de Proprietário (roles/owner). Caso contrário, é possível receber essa permissão com o papel de Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.
- Verifique se o código-fonte está em um repositório do Bitbucket Cloud.
- Verifique se o repositório de origem do Bitbucket Cloud tem um arquivo
Dockerfileou um arquivo de configuração do Cloud Build. - Instale a Google Cloud CLI para usar comandos
gcloud.
Permissões do IAM obrigatórias
Para garantir que tenha as permissões
necessárias para se conectar,
peça ao administrador para conceder o papel do IAM
Administrador da conexão do Cloud Build (cloudbuild.connectionAdmin)
a 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.
Seu 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:
Faça login no Bitbucket Cloud.
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
Copie os 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:
Abra a página Repositórios no console do Google Cloud .
A página Repositórios vai aparecer.
No seletor de projetos, selecione seu projeto Google Cloud .
Na parte de cima da página, selecione a guia 2ª geração.
Clique em Criar conexão de host para conectar um novo host ao Cloud Build.
No painel à esquerda, selecione Bitbucket como seu provedor de origem.
Na seção Configurar conexão, insira as seguintes informações:
Região: selecione uma região para sua conexão.
Nome: insira um nome para a conexão.
Na seção Detalhes do host, insira as seguintes informações:
Selecione Bitbucket Cloud como o tipo de host.
Espaço de trabalho: insira o ID do espaço de trabalho do repositório do Bitbucket Cloud.
Opcional: se você quiser gerenciar as chaves de criptografia usadas para criptografar os tokens de acesso dos seus repositórios do Bitbucket Cloud, acesse a seção Criptografia e escolha uma chave do Cloud Key Management Service. Para mais informações, consulte Ativar chaves de criptografia gerenciadas pelo cliente para o Secret Manager.
Na seção Tokens de acesso, insira o seguinte:
Token de acesso de administrador: insira o token de acesso de administrador criado anteriormente.
Token de acesso de leitura: insira o token de acesso de leitura criado anteriormente.
Clique em Conectar.
A nova conexão aparece na página Repositórios.
gcloud
Siga estas etapas para armazenar suas credenciais:
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.
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=-Se os 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 ID do projeto do Google Cloud .
- 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.
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/1Em que:
- CONNECTION_NAME é o nome que você quer dar à conexão com seu host do Bitbucket Cloud.
- WORKSPACE_ID é o ID do espaço de trabalho do seu repositório do Bitbucket Cloud.
- PROJECT_ID é o ID do projeto do Google Cloud .
- 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 ao agente de serviço do Cloud Build as permissões necessárias 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 é o número do projeto Google Cloud .
- ADMIN_TOKEN_NAME é o nome do seu token com acesso aos escopos
webhook,repository,repository:adminepullrequest. - 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 sua conexão.
- WORKSPACE_ID é o ID do espaço de trabalho do repositório do Bitbucket Cloud.
Girar tokens de acesso antigos ou expirados do Bitbucket Cloud
Faça a rotação dos tokens de acesso para que a conexão de host do Cloud Build mantenha a conexão com seu repositório 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. Quando isso acontece, não é possível desativar a conexão nem vincular um repositório até girar o token expirado. Além disso, você vai encontrar erros nas seguintes circunstâncias:
A página Detalhes da conexão da sua conexão mostra uma mensagem de erro indicando
Connection is disconnected due to an invalid or expired access token.Se você tentar vincular um repositório a uma conexão com um token expirado, a mensagem Token de acesso inválido vai aparecer. Ao clicar em Ver conexão, você acessa a página Detalhes da conexão da conexão com o token expirado.
O Cloud Build permite girar tokens de acesso inserindo novos valores de token e salvando-os no Secret Manager na versão mais recente do secret para esses tokens. Para fazer a rotação dos tokens de acesso, faça o seguinte:
Gire cada token de acesso no Bitbucket Cloud:
Acesse o repositório do Bitbucket Cloud conectado à conexão de host do Cloud Build.
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. Seu token rotacionado tem as mesmas permissões e escopo do token original.
Copie os IDs dos tokens rotacionados.
Atualize seu token de acesso no Cloud Build:
Acesse a página Detalhes da conexão da sua conexão.
Selecione Atualizar tokens de acesso.
No menu Rotação de token, insira os novos tokens nos campos Token de acesso à API e Token de acesso de leitura.
(Opcional): se você quiser que sua conexão sempre use a versão mais recente do secret para seus tokens, selecione Atualizar conexão para sempre usar a versão mais recente. Deixar essa opção desmarcada pode ser útil se sua conexão usar um número de versão secreto específico.
Selecione Atualizar para salvar as mudanças.
O Cloud Build salva os novos tokens de acesso como a versão mais recente do seu secret no Secret Manager.
A seguir
- Saiba como se conectar a um repositório do Bitbucket Cloud.
- Saiba como ver os resultados da build.
- Saiba como fazer implantações azul-verde no Compute Engine.