Configurer des notifications SMTP

Cloud Build peut vous informer des mises à jour de votre compilation en vous envoyant des notifications aux canaux souhaités, tels que Slack ou votre serveur SMTP. Cette page explique comment configurer les notifications à l'aide du système d'alerte SMTP.

Avant de commencer

  • Activer les API Cloud Build, Compute Engine, Cloud Run, Pub/Sub, and Secret Manager.

    Activer les API

Systèmes d'alerte Cloud Build

Cloud Build envoie toutes les mises à jour des événements de compilation, ainsi que les métadonnées de compilation, à Pub/Sub sur le thème cloud-builds. Les systèmes d'alerte Cloud Build peuvent être configurés pour écouter ce sujet, filtrer les messages reçus et envoyer des messages à votre service.

Les systèmes d'alerte Cloud Build sont des images Docker pouvant être exécutées en tant que conteneurs sur Cloud Run. Lorsqu'ils sont interrogés par une application d'abonné, les systèmes d'alerte Cloud Build utilisent des abonnements Push pour distribuer les messages au service configuré. Tous les systèmes d'alerte utilisent une spécification YAML commune stockée dans Cloud Storage pour la configuration.

Cloud Build fournit et gère des images de système d'alerte déployables dans le dépôt cloud-build-notifiers. Le tableau suivant répertorie les systèmes d'alerte disponibles :

Système d'alerte Description
bigquery écrit les données de build dans une table BigQuery
http envoie une charge utile JSON à un autre point de terminaison HTTP
slack publie des messages dans un canal Slack à l'aide d'un webhook Slack
smtp envoie des e-mails via un serveur SMTP

Configurer des notifications par e-mail

Pour envoyer des notifications par e-mail, vous devez disposer d'un serveur SMTP en cours d'exécution et accéder à un compte sur ce serveur, en indiquant le nom d'utilisateur et le mot de passe du compte qui servira à l'envoi de notifications. Assurez-vous que les quotas de distribution de votre serveur SMTP sont suffisants pour traiter le volume d'e-mails que vous comptez générer.

La section suivante explique comment configurer manuellement les notifications par e-mail à l'aide du système d'alerte SMTP. Si vous préférez automatiser la configuration, consultez la page Automatiser la configuration des notifications.

Pour configurer les notifications par e-mail, procédez comme suit :

  1. Stockez le mot de passe du compte de messagerie de l'expéditeur dans Secret Manager :

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

      Ouvrir la page Secret Manager

    2. Cliquez sur Créer un secret.

    3. Attribuez un nom à votre secret.

    4. Sous Valeur du secret, ajoutez le mot de passe du compte de messagerie de l'expéditeur.

    5. Pour enregistrer votre secret, cliquez sur Créer un secret.

  2. Bien que votre compte de service Cloud Run dispose du rôle d'éditeur pour votre projet, le rôle Éditeur n'est pas suffisant pour accéder à votre secret dans Secret Manager. Vous devez autoriser votre compte de service Cloud Run à accéder à votre secret:

    1. Accédez à la page IAM dans Google Cloud Console

      Ouvrir la page IAM

    2. Recherchez le compte de service Compute Engine par défaut associé à votre projet :

      Votre compte de service Compute Engine par défaut ressemble à ceci :

      project-number-compute@developer.gserviceaccount.com
      

      Prenez note du compte de service Compute Engine par défaut.

    3. Ouvrez la page Secret Manager dans Google Cloud Console :

      Ouvrir la page Secret Manager

    4. Cliquez sur le nom contenant le secret du mot de passe de votre compte de messagerie.

    5. Dans l'onglet Autorisations, cliquez sur Ajouter un membre.

    6. Ajoutez le compte de service par défaut Compute Engine associé à votre projet en tant que membre.

    7. Sélectionnez l'autorisation Accesseur de secrets du gestionnaire de secrets comme rôle.

    8. Cliquez sur Enregistrer.

  3. Autorisez votre compte de service Cloud Run à lire et écrire dans des buckets Cloud Storage :

    1. Accédez à la page IAM dans Google Cloud Console

      Ouvrir la page IAM

    2. Recherchez le compte de service Compute Engine par défaut associé à votre projet :

      Votre compte de service Compute Engine par défaut ressemble à ceci :

      project-number-compute@developer.gserviceaccount.com
      
    3. Cliquez sur l'icône en forme de crayon sur la ligne contenant votre compte de service Compute Engine par défaut. L'onglet Modifier les autorisations s'affiche.

    4. Cliquez sur Ajouter un autre rôle.

    5. Ajoutez le rôle suivant :

      • Lecteur des objets Storage
    6. Cliquez sur Enregistrer.

  4. Rédigez un fichier de configuration du système d'alerte pour configurer votre système d'alerte SMTP et filtrer les événements de compilation :

    Dans l'exemple de fichier de configuration du système d'alerte suivant, le champ filter utilise Common Expression Language avec la variable disponible, build, pour filtrer les événements de compilation à l'état SUCCESS :

    apiVersion: cloud-build-notifiers/v1
    kind: SMTPNotifier
    metadata:
      name: example-smtp-notifier
    spec:
      notification:
        filter: build.status == Build.Status.SUCCESS
        delivery:
          server: server-host-name
          port: "port"
          sender: sender-email
          from: from-email
          recipients:
            - recipient-email
            # optional: more emails here
          password:
            secretRef: smtp-password
      secrets:
      - name: smtp-password
        value: projects/project-id/secrets/secret-name/versions/latest
    

    Où :

    • server-host-name est l'adresse de votre serveur SMTP.
    • port est le port qui gère les requêtes SMTP. Cette valeur doit être spécifiée sous forme de chaîne.
    • sender-email est l'adresse e-mail du compte de l'expéditeur, visible par le paramètre server-host-name spécifié.
    • from-email est l'adresse e-mail visible par les destinataires.
    • recipient-email est une liste d'une ou de plusieurs adresses e-mail destinées à recevoir les messages de l'expéditeur.
    • smtp-password est la variable de configuration utilisée dans cet exemple pour faire référence au mot de passe du compte de messagerie de l'expéditeur stocké dans Secret Manager. Le nom de la variable que vous spécifiez ici doit correspondre au champ name sous secrets.
    • project-id est l'ID de votre projet Cloud.
    • secret-name est le nom de votre secret contenant le mot de passe du compte de messagerie de l'expéditeur.

    Pour afficher cet exemple, consultez le fichier de configuration du système d'alerte pour le système d'alerte SMTP.

    Pour en savoir plus sur les champs supplémentaires que vous pouvez filtrer, consultez la ressource Build. Pour consulter d'autres exemples de filtrage, consultez la section Utiliser le CEL pour filtrer les événements de compilation.

  5. Importez votre fichier de configuration du système d'alerte dans un bucket Cloud Storage :

    1. Si vous n'avez pas de bucket Cloud Storage, exécutez la commande suivante pour créer un bucket, où bucket-name est le nom que vous souhaitez attribuer au bucket, sous réserve des règles de dénomination.

      gsutil mb gs://bucket-name/
      
    2. Importez le fichier de configuration du système d'alerte dans votre bucket :

      gsutil cp config-file-name gs://bucket-name/config-file-name
      

      Où :

      • bucket-name est le nom du bucket.
      • config-file-name est le nom de votre fichier de configuration.
  6. Déployez votre système d'alerte dans Cloud Run :

     gcloud run deploy service-name \
       --image=us-east1-docker.pkg.dev/gcb-release/cloud-build-notifiers/smtp:latest \
       --update-env-vars=CONFIG_PATH=config-path,PROJECT_ID=project-id
    

    Où :

    • service-name correspond au nom du service Cloud Run dans lequel vous déployez l'image.
    • config-path correspond au chemin d'accès au fichier de configuration du système d'alerte pour votre système d'alerte SMTP gs://bucket-name/config-file-name.
    • project-id est l'ID de votre projet Cloud.

    La commande gcloud run deploy extrait la dernière version de l'image hébergée à partir d'Artifact Registry de Cloud Build. Cloud Build est compatible avec les images de système d'alerte pendant neuf mois. Après neuf mois, Cloud Build supprime la version de l'image. Si vous souhaitez utiliser une version d'image précédente, vous devez spécifier la version sémantique complète du tag de l'image dans l'attribut image de votre commande gcloud run deploy. Les versions et tags d'images précédents sont disponibles dans Artifact Registry.

  7. Accordez des autorisations Pub/Sub pour créer des jetons d'authentification dans votre projet :

     gcloud projects add-iam-policy-binding project-id \
       --member=serviceAccount:service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com \
       --role=roles/iam.serviceAccountTokenCreator
    

    Où :

    • project-id est l'ID de votre projet Cloud.
    • project-number est le numéro de votre projet Cloud.
  8. Créez un compte de service pour représenter l'identité de votre abonnement Pub/Sub :

    gcloud iam service-accounts create cloud-run-pubsub-invoker \
      --display-name "Cloud Run Pub/Sub Invoker"
    

    Vous pouvez utiliser cloud-run-pubsub-invoker ou utiliser un nom unique dans votre projet Google Cloud.

  9. Accordez au compte de service cloud-run-pubsub-invoker l'autorisation Cloud Run Invoker :

    gcloud run services add-iam-policy-binding service-name \
       --member=serviceAccount:cloud-run-pubsub-invoker@project-id.iam.gserviceaccount.com \
       --role=roles/run.invoker
    

    Où :

    • service-name correspond au nom du service Cloud Run dans lequel vous déployez l'image.
    • project-id est l'ID de votre projet Cloud.
  10. Créez le sujet cloud-builds pour recevoir des messages de mise à jour de compilation pour votre système d'alerte :

    gcloud pubsub topics create cloud-builds
    
  11. Créez un abonné push Pub/Sub pour votre système d'alerte :

     gcloud pubsub subscriptions create subscriber-id \
       --topic=cloud-builds \
       --push-endpoint=service-url \
       --push-auth-service-account=cloud-run-pubsub-invoker@project-id.iam.gserviceaccount.com
    

    Où :

    • subscriber-id est le nom que vous souhaitez donner à votre abonnement.
    • service-url est l'URL générée par Cloud Run pour votre nouveau service.
    • project-id est l'ID de votre projet Cloud.

Les notifications pour votre projet Cloud Build sont maintenant configurées. Les destinataires (recipients) spécifiés recevront une notification par e-mail la prochaine fois que vous appellerez une compilation correspondant au filtre que vous avez configuré.

Filtrer les événements de compilation à l'aide de CEL

Cloud Build utilise le CEL avec la variable, build, sur les champs répertoriés dans la ressource Compilation afin d'accéder aux champs associés à votre événement de compilation, tels que votre ID de déclencheur, votre liste d'images, ou vos valeurs de substitution. Vous pouvez utiliser la chaîne filter pour filtrer les événements de compilation de votre fichier de configuration de compilation à l'aide de n'importe quel champ répertorié dans la ressource Build. Pour trouver la syntaxe exacte associée à votre champ, consultez le fichier cloudbuild.proto.

Filtrer par ID de déclencheur

Pour filtrer par ID de déclencheur, spécifiez la valeur de votre ID de déclencheur dans le champ filter à l'aide de build.build_trigger_id, où trigger-id est votre ID de déclencheur sous forme de chaîne :

filter: build.build_trigger_id == trigger-id

Filtrer par état

Pour filtrer par état, spécifiez l'état de la compilation que vous souhaitez filtrer dans le champ filter à l'aide de build.status.

L'exemple suivant montre comment filtrer les événements de compilation dotés de l'état SUCCESS à l'aide du champ filter :

filter: build.status == Build.Status.SUCCESS

Vous pouvez également filtrer les compilations présentant des états différents. L'exemple suivant montre comment filtrer les événements de compilation dont l'état est SUCCESS, FAILURE ou TIMEOUT à l'aide du champ filter :

filter: build.status in [Build.Status.SUCCESS, Build.Status.FAILURE, Build.Status.TIMEOUT]

Pour afficher des valeurs d'état supplémentaires que vous pouvez filtrer, consultez la section État dans la documentation de référence sur les ressources de compilation.

Filtrer par tag

Pour filtrer par tag, spécifiez la valeur de votre tag dans le champ filter à l'aide de build.tags, où tag-name est le nom de votre tag :

filter: tag-name in build.tags

Vous pouvez appliquer un filtre en fonction du nombre de tags spécifiés dans votre événement de compilation à l'aide de size. Dans l'exemple suivant, le champ filter filtre les événements de compilation comportant exactement deux tags spécifiés, avec un tag spécifié en tant que v1 :

filter: size(build.tags) == 2 && "v1" in build.tags

Filtrer par images

Pour filtrer par images, spécifiez la valeur de votre image dans le champ filter à l'aide de build.images, où image-name est le nom complet de votre image, tel que répertorié dans Container Registry, comme par exemple gcr.io/example/image-one :

filter: image-name in build.images

Dans l'exemple suivant, les filtres filter sont appliqués aux événements de compilation dont le nom d'image spécifié est gcr.io/example/image-one ou gcr.io/example/image-two :

filter: "gcr.io/example/image-one" in build.images || "gcr.io/example/image-two" in build.images

Filtrer par date et heure

Vous pouvez filtrer les événements de compilation en fonction de la date et l'heure de création, de début ou de fin d'une compilation en spécifiant l'une des options suivantes dans votre champ filter : build.create_time, build.start_time ou build.finish_time

Dans l'exemple suivant, le champ filter utilise timestamp pour filtrer les événements de compilation dont la date et l'heure de requête pour créer la compilation sont fixées au 20 juillet 2020 à 6h00 :

filter: build.create_time == timestamp("2020-07-20:T06:00:00Z")

Vous pouvez également filtrer les événements de compilation par comparaisons horaires. Dans l'exemple suivant, le champ filter utilise timestamp pour filtrer les événements de compilation dont le début est compris entre le 20 juillet 2020 à 6h00 et le 30 juillet 2020 à 6h00.

filter: timestamp("2020-07-20:T06:00:00Z") >= build.start_time && build.start_time <= timestamp("2020-07-30:T06:00:00Z")

Pour en savoir plus sur la façon dont les fuseaux horaires sont exprimés dans le CEL, consultez la définition de langage pour les fuseaux horaires.

Pour filtrer par durée de compilation, vous pouvez utiliser duration pour comparer les horodatages. Dans l'exemple suivant, le champ filter utilise duration pour filtrer les événements de compilation avec une compilation exécutée pendant au moins cinq minutes:

filter: build.finish_time - build.start_time >= duration("5m")

Filtrer par substitution

Vous pouvez filtrer par substitution en spécifiant la variable de substitution dans le champ filter à l'aide de build.substitutions. Dans l'exemple suivant, le champ filter répertorie les compilations contenant la variable de substitution substitution-variable et vérifie si substitution-variable correspond au substitution-value spécifié:

filter: build.substitutions[substitution-variable] == substitution-value

Où :

  • substitution-variable est le nom de votre variable de substitution.
  • substitution-value est le nom de votre valeur de substitution.

Vous pouvez également filtrer par valeur de variable de substitution par défaut. Dans l'exemple suivant, le champ filter répertorie les compilations portant le nom de branche master et les compilations portant le nom de dépôt github.com/user/my-example-repo. Les variables de substitution par défaut BRANCH_NAME et REPO_NAME sont transmises sous forme de clés à build.substitutions :

filter: build.substitutions["BRANCH_NAME"] == "master" && build.substitutions["REPO_NAME"] == "github.com/user/my-example-repo"

Si vous souhaitez filtrer les chaînes à l'aide d'expressions régulières, vous pouvez utiliser la fonction matches intégrée. Dans l'exemple ci-dessous, le champ filter filtre les compilations dont l'état est FAILURE ou TIMEOUT, et qui disposent également d'une variable de substitution de compilation TAG_NAME avec une valeur correspondant à l'expression régulière v{DIGIT}.{DIGIT}.{3 DIGITS}).

filter: build.status in [Build.Status.FAILURE, Build.Status.TIMEOUT] && build.substitutions["TAG_NAME"].matches("^v\\d{1}\\.\\d{1}\\.\\d{3}$")`

Pour afficher la liste des valeurs de substitution par défaut, consultez la section Utiliser des substitutions par défaut.

Étape suivante