Se connecter à un hôte Bitbucket Cloud

Cette page explique comment connecter un hôte Bitbucket Cloud à Cloud Build.

Avant de commencer

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  • Assurez-vous que le code source se trouve dans un dépôt Bitbucket Cloud.
  • Assurez-vous que le dépôt source Bitbucket Cloud contient un fichier Dockerfile ou Cloud Build.
  • Installez la Google Cloud CLI pour utiliser les commandes gcloud.

Autorisations IAM requises

Pour vous assurer que dispose des autorisations nécessaires pour se connecter, demandez à votre administrateur de lui attribuer le rôle IAM Administrateur de connexion Cloud Build (cloudbuild.connectionAdmin) sur votre compte utilisateur. Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Votre administrateur peut également attribuer les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Créer des jetons d'accès Bitbucket Cloud

Créez les deux jetons d'accès suivants dans Bitbucket Cloud :

  • Jeton d'accès administrateur : pour connecter et déconnecter des dépôts.
  • Jeton d'accès en lecture : pour permettre à Cloud Build d'accéder à votre code source.

Pour créer ces jetons, procédez comme suit :

  1. Connectez-vous à Bitbucket Cloud.

  2. Suivez les instructions de Bitbucket Cloud pour créer des jetons d'accès associés à votre dépôt, projet ou espace de travail.

    Accordez les autorisations suivantes :

    • Jeton d'accès administrateur :

      • Dépôts : Lecture et Administrateur
      • Demandes d'extraction : Lecture
      • Webhooks : Lecture et Écriture
    • Jeton d'accès en lecture :

      • Dépôts : Lecture
  3. Copiez vos jetons pour les utiliser dans les procédures suivantes.

Se connecter à un hôte Bitbucket Cloud

Console

Pour connecter Cloud Build à votre hôte Bitbucket Cloud, procédez comme suit :

  1. Ouvrez la page Dépôts dans la console Google Cloud .

    Ouvrir la page "Dépôts"

    La page Dépôts s'affiche.

  2. Dans le sélecteur de projet, sélectionnez votre projet Google Cloud .

  3. En haut de la page, sélectionnez l'onglet 2e génération.

  4. Cliquez sur Créer une connexion hôte pour connecter un nouvel hôte à Cloud Build.

  5. Sélectionnez Bitbucket comme fournisseur de source.

  6. Dans la section Configurer la connexion, saisissez les informations suivantes :

    1. Région : sélectionnez une région pour votre connexion.

    2. Nom : saisissez un nom pour votre connexion.

    3. Dans la section Détails de l'hôte, sélectionnez Bitbucket Cloud comme type d'hôte.

    4. Espace de travail : saisissez l'ID de l'espace de travail pour votre dépôt Bitbucket Cloud.

    5. Jeton d'accès : saisissez le jeton d'accès administrateur que vous avez créé précédemment.

    6. Jeton d'accès en lecture : saisissez le jeton d'accès en lecture que vous avez créé précédemment.

  7. Cliquez sur Se connecter.

    La nouvelle connexion s'affiche sur la page Dépôts.

gcloud

  1. Pour stocker vos identifiants, procédez comme suit :

    1. Stockez vos jetons d'accès dans Secret Manager dans votre projetGoogle Cloud en exécutant les commandes suivantes :

      echo -n ADMIN_TOKEN | gcloud secrets create ADMIN_SECRET_NAME --data-file=-
      
      echo -n READ_TOKEN | gcloud secrets create READ_SECRET_NAME --data-file=-
      

      Où :

      • ADMIN_TOKEN est votre jeton d'accès administrateur.
      • ADMIN_SECRET_NAME correspond au nom que vous souhaitez donner à votre secret de jeton d'accès administrateur dans Secret Manager.
      • READ_TOKEN est votre jeton d'accès en lecture.
      • READ_SECRET_NAME est le nom que vous souhaitez donner à votre secret de jeton d'accès en lecture dans Secret Manager.
    2. Créez un secret de webhook dans Secret Manager en exécutant la commande suivante, où WEBHOOK_SECRET_NAME correspond au nom que vous souhaitez donner à votre secret de webhook :

      echo -n ${ex.(random-uuid)} | gcloud secrets create WEBHOOK_SECRET_NAME --data-file=-
      
    3. Si vos secrets ne se trouvent pas tous dans le même projet, accordez l'accès à votre agent de service Cloud Build en exécutant la commande suivante :

      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"
      

      Où :

      • PROJECT_ID est l'ID de votre projet Google Cloud .
      • ADMIN_SECRET_NAME est le nom de votre secret de jeton d'administrateur.
      • READ_SECRET_NAME est le nom de votre secret de jeton de lecture.
      • WEBHOOK_SECRET_NAME est le nom de votre secret de webhook.
  2. Connectez Cloud Build à votre hôte Bitbucket Cloud à l'aide de la commande suivante :

    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
    

    Où :

    • CONNECTION_NAME est le nom que vous souhaitez attribuer à la connexion à votre hôte Bitbucket Cloud.
    • WORKSPACE_ID est l'ID d'espace de travail de votre dépôt Bitbucket Cloud.
    • PROJECT_ID est l'ID de votre projet Google Cloud .
    • REGION est la région de votre connexion hôte.
    • ADMIN_SECRET_NAME est le nom de votre secret de jeton d'administrateur.
    • READ_SECRET_NAME est le nom du secret de votre jeton d'accès en lecture.
    • WEBHOOK_SECRET_NAME est le nom de votre secret de webhook.

Terraform

Vous pouvez connecter votre hôte Bitbucket Cloud à Cloud Build à l'aide de Terraform.

Dans l'exemple suivant, l'extrait de code effectue les opérations suivantes :

  • Configure le fournisseur Google Terraform.
  • Crée un secret Secret Manager pour stocker les jetons Bitbucket.
  • Accorde les autorisations nécessaires à l'agent de service Cloud Build pour accéder aux secrets.
  • Crée une connexion 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
        ]
    }
    

Où :

  • PROJECT_ID est l'ID de votre projet Google Cloud .
  • PROJECT_NUMBER est le numéro de votre projet Google Cloud .
  • ADMIN_TOKEN_NAME est le nom de votre jeton avec un accès aux niveaux webhook, repository, repository:admin et pullrequest.
  • ADMIN_TOKEN_VALUE correspond à la valeur de votre ADMIN_TOKEN_NAME.
  • READ_TOKEN_NAME est le nom de votre jeton avec le champ d'application repository:read.
  • READ_TOKEN_VALUE correspond à la valeur de votre READ_TOKEN_NAME.
  • WEBHOOK_SECRET_NAME est le nom de votre secret de webhook.
  • WEBHOOK_SECRET_VALUE correspond à la valeur de votre WEBHOOK_SECRET_NAME.
  • REGION est la région de votre connexion.
  • CONNECTION_NAME est le nom de votre connexion.
  • WORKSPACE_ID est l'ID d'espace de travail de votre dépôt Bitbucket Cloud.

Faire pivoter les jetons d'accès Bitbucket Cloud anciens ou expirés

Si votre jeton d'accès Bitbucket Cloud expire, la connexion de votre hôte Cloud Build à son dépôt Bitbucket Cloud est interrompue. Par conséquent, des erreurs s'affichent dans les cas suivants :

  • Lorsque vous essayez d'associer une connexion Cloud Build à un dépôt Bitbucket Cloud, un message Failed to fetch repositories to link. Check that Cloud Build is still authorized to access data from the selected connection s'affiche.

  • Sur la page Déclencheurs, lorsque vous cliquez sur Exécuter, la page Exécuter le déclencheur s'ouvre et affiche un message Failed to list branches. You can still enter one manually.

Pour remplacer un jeton ancien ou expiré pour votre connexion :

  1. Recherchez les secrets associés à votre connexion hôte :

    1. Exécutez la commande suivante :

      gcloud builds connections describe CONNECTION_PATH --region=REGION
      

      Où :

      • CONNECTION_PATH correspond au chemin d'accès à votre connexion hôte Bitbucket Cloud dans Cloud Build, au format projects/PROJECT_ID/locations/REGION/connections/CONNECTION_NAME.
      • REGION est la région de votre connexion.
    2. Dans le résultat de la commande, recherchez les valeurs des champs de votre jeton utilisateur. readAuthorizerCredential.userTokenSecretVersion affiche le nom Secret Manager du jeton Read, et authorizerCredential.userTokenSecretVersion affiche le nom Secret Manager du jeton Admin. Ces noms sont stockés en tant que secrets dans Secret Manager.

  2. Faites tourner chaque jeton d'accès dans Bitbucket Cloud :

    1. Accédez au dépôt Bitbucket Cloud connecté à votre connexion hôte Cloud Build.

    2. Suivez les instructions de la documentation Bitbucket pour faire pivoter un jeton d'accès. Lorsque vous effectuez une rotation d'un jeton, Bitbucket Cloud crée un jeton avec de nouvelles identifiants et invalide la version précédente de ce jeton. Votre jeton renouvelé dispose des mêmes autorisations et du même champ d'application que le jeton d'origine.

    3. Copiez l'ID de votre jeton permuté.

  3. Créez une version secrète pour chaque jeton :

    1. Ouvrez la page Secret Manager dans la console Google Cloud  :

      Ouvrir la page Secret Manager

    2. Pour chaque jeton que vous avez fait pivoter, recherchez le nom secret que vous avez identifié à l'étape 1, puis cliquez sur Actions, puis sur Ajouter une version.

    3. Dans la fenêtre Ajouter une nouvelle version, saisissez l'ID de votre jeton renouvelé, puis cliquez sur Ajouter une nouvelle version.

Pour en savoir plus, consultez Jetons d'accès et Améliorer la sécurité dans Bitbucket : présentation de l'expiration des jetons d'accès dans la documentation Bitbucket Cloud.

Étapes suivantes