Se connecter à un hôte Bitbucket Cloud

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

Avant de commencer

  • Activez les API Cloud Build, Secret Manager et Compute Engine.

    Rôles requis pour activer les API

    Pour activer les API, vous devez disposer de l'autorisation serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation via le rôle Propriétaire (roles/owner). Sinon, vous pouvez l'obtenir via le rôle Administrateur d'utilisation du service (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.

    Activer les API

  • 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 dispose d'un fichier Dockerfile ou d'un fichier de configuration Cloud Build.
  • Installez 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 d'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 autoriser Cloud Build à 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 Administration
      • 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

Connectez Cloud Build à votre hôte Bitbucket Cloud en procédant comme suit :

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

    Ouvrir la page "Dépôts"

    La page Dépôts s'affiche.

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

  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. Dans le panneau de gauche, sélectionnez Bitbucket comme fournisseur source.

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

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

    • Nom : saisissez un nom pour votre connexion.

  7. Dans la section Détails de l'hôte, saisissez les informations suivantes :

    • Sélectionnez Bitbucket Cloud comme type d'hôte.

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

  8. Facultatif : Si vous souhaitez gérer les clés de chiffrement utilisées pour chiffrer les jetons d'accès de vos dépôts Bitbucket Cloud, accédez à la section Chiffrement et choisissez une clé Cloud Key Management Service. Pour en savoir plus, consultez Activer les clés de chiffrement gérées par le client pour Secret Manager.

  9. Dans la section Jetons d'accès, saisissez les informations suivantes :

  10. Cliquez sur Se connecter.

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

gcloud

  1. Procédez comme suit pour stocker vos identifiants :

    1. Stockez vos jetons d'accès dans Secret Manager dans votre Google Cloud projet 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 correspond à votre jeton d'accès administrateur.
      • ADMIN_SECRET_NAME correspond au nom que vous souhaitez attribuer à votre secret de jeton d'accès administrateur dans Secret Manager.
      • READ_TOKEN correspond à votre jeton d'accès en lecture.
      • READ_SECRET_NAME correspond au nom que vous souhaitez attribuer à 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 attribuer à 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 correspond à l'ID de votre Google Cloud projet.
      • ADMIN_SECRET_NAME correspond au nom de votre secret de jeton administrateur.
      • READ_SECRET_NAME correspond au nom de votre secret de jeton en lecture.
      • WEBHOOK_SECRET_NAME correspond au 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 correspond au nom que vous souhaitez attribuer à la connexion à votre hôte Bitbucket Cloud.
    • WORKSPACE_ID correspond à l'ID d'espace de travail de votre dépôt Bitbucket Cloud.
    • PROJECT_ID correspond à l'ID de votre Google Cloud projet.
    • REGION correspond à la région de votre connexion hôte.
    • ADMIN_SECRET_NAME correspond au nom de votre secret de jeton administrateur.
    • READ_SECRET_NAME correspond au nom de votre secret de jeton d'accès en lecture.
    • WEBHOOK_SECRET_NAME correspond au 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 Terraform pour Google.
  • 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 correspond à l'ID de votre Google Cloud projet.
  • PROJECT_NUMBER correspond au Google Cloud numéro de votreprojet.
  • ADMIN_TOKEN_NAME correspond au nom de votre jeton avec le niveau d’accès webhook, repository, repository:admin et pullrequest.
  • ADMIN_TOKEN_VALUE correspond à la valeur de votre ADMIN_TOKEN_NAME.
  • READ_TOKEN_NAME correspond au nom de votre jeton avec repository:read niveau d'accès.
  • READ_TOKEN_VALUE correspond à la valeur de votre READ_TOKEN_NAME.
  • WEBHOOK_SECRET_NAME correspond au nom de votre secret de webhook.
  • WEBHOOK_SECRET_VALUE correspond à la valeur de votre WEBHOOK_SECRET_NAME.
  • REGION correspond à la région de votre connexion.
  • CONNECTION_NAME correspond au nom de votre connexion.
  • WORKSPACE_ID correspond à l'ID d'espace de travail de votre dépôt Bitbucket Cloud.

Effectuer la rotation des jetons d'accès Bitbucket Cloud anciens ou expirés

Effectuez la rotation de vos jetons d'accès afin que votre connexion hôte Cloud Build puisse maintenir sa connexion à votre dépôt Bitbucket Cloud. Si votre jeton d'accès Bitbucket Cloud expire, votre connexion hôte Cloud Build est déconnectée de son dépôt Bitbucket Cloud. Dans ce cas, vous ne pouvez pas désactiver la connexion ni associer de dépôt tant que vous n'avez pas effectué la rotation du jeton expiré. De plus, des erreurs s'affichent dans les circonstances suivantes :

  • La page Détails des connexions de votre connexion affiche un message d'erreur indiquant Connection is disconnected due to an invalid or expired access token.

  • Si vous tentez d'associer un dépôt à une connexion dont le jeton a expiré, le message Jeton d'accès non valide s'affiche. En cliquant sur Afficher la connexion , vous accédez à la page Détails de la connexion pour la connexion dont le jeton a expiré.

Cloud Build vous permet d'effectuer la rotation des jetons d'accès en saisissant de nouvelles valeurs de jeton et en les enregistrant dans Secret Manager dans la dernière version secrète de ces jetons. Pour effectuer la rotation de vos jetons d'accès, procédez comme suit :

  1. Effectuez la rotation de 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 effectuer la rotation d'un jeton d'accès. Lorsque vous effectuez la rotation d'un jeton, Bitbucket Cloud crée un jeton avec de nouveaux identifiants et invalide la version précédente de ce jeton. Votre jeton dont la rotation a été effectuée dispose des mêmes autorisations et du même niveau d'accès que le jeton d'origine.

    3. Copiez les ID de vos jetons dont la rotation a été effectuée.

  2. Mettez à jour votre jeton d'accès dans Cloud Build :

    1. Accédez à la page Détails de la connexion pour votre connexion.

    2. Sélectionnez Mettre à jour les jetons d'accès.

    3. Dans le menu Rotation des jetons, saisissez vos nouveaux jetons dans les champs Jeton d'accès à l'API et Jeton d'accès en lecture.

    4. (Facultatif) Si vous souhaitez que votre connexion utilise toujours la dernière version du secret pour vos jetons, sélectionnez Mettre à jour la connexion pour toujours utiliser la dernière version. Il peut être utile de laisser cette option désélectionnée si votre connexion utilise un numéro de version secret spécifique.

    5. Sélectionnez Mettre à jour pour enregistrer vos modifications.

      Cloud Build enregistre les nouveaux jetons d'accès en tant que dernière version de votre secret dans Secret Manager.

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.

Étape suivante