Configurare le notifiche HTTP

Cloud Build può inviarti notifiche sugli aggiornamenti delle build ai canali selezionati, come Slack o il server SMTP. Questa pagina spiega come configurare le notifiche utilizzando il notificatore HTTP.

Prima di iniziare

  • Abilita le API Cloud Build, Cloud Run e Pub/Sub.

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente hai già questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore utilizzo servizi (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.

    Abilita le API

Configurazione delle notifiche HTTP

La sezione seguente spiega come configurare manualmente le notifiche HTTP utilizzando il notificatore HTTP per inviare richieste POST a un URL destinatario specificato. Se preferisci automatizzare la configurazione, consulta Automatizzazione della configurazione per le notifiche.

Per configurare le notifiche HTTP:

Per utilizzare il notificatore HTTP per inviare richieste POST a un URL destinatario specificato:

  1. Concedi al account di servizio di Cloud Run l'autorizzazione a leggere dai bucket Cloud Storage:

    1. Vai alla pagina IAM nella Google Cloud console:

      Apri la pagina IAM

    2. Individua il service account predefinito di Compute Engine associato al tuo progetto:

      Il service account predefinito di Compute Engine avrà un aspetto simile al seguente:

      PROJECT_NUMBER-compute@
      
    3. Fai clic sull'icona a forma di matita nella riga contenente il service account predefinito di Compute Engine. Verrà visualizzata la scheda Accesso in modifica.

    4. Fai clic su Aggiungi un altro ruolo.

    5. Aggiungi il seguente ruolo:

      • Storage Object Viewer
    6. Fai clic su Salva.

  2. Scrivi un file di configurazione del notificatore per configurare il notificatore HTTP e filtrare gli eventi di build:

    Nel seguente file di configurazione del notificatore di esempio, il campo filter utilizza Common Expression Language con la variabile disponibile, build, per filtrare gli eventi di build con lo stato SUCCESS:

    apiVersion: cloud-build-notifiers/v1
    kind: HTTPNotifier
    metadata:
      name: example-http-notifier
    spec:
      notification:
        filter: build.status == Build.Status.SUCCESS
        params:
          buildStatus: $(build.status)
        delivery:
          # The `http(s)://` protocol prefix is required.
          url: URL
        template:
          type: golang
          uri: gs://BUCKET_NAME/http.json
    

    Dove:

    • buildStatus è un parametro definito dall'utente. Questo parametro assume il valore di $(build.status), lo stato della build.
    • url è la variabile di configurazione utilizzata in questo esempio per specificare l'URL della richiesta.
    • BUCKET_NAME è il nome del bucket.
    • URL è l'URL che vuoi specificare come server destinatario.
    • Il campo uri fa riferimento al file http.json. Questo file fa riferimento a un modello JSON ospitato su Cloud Storage e rappresenta il payload JSON dell'endpoint webhook.

      Per visualizzare un esempio di file modello, consulta il http.json file nel repository cloud-build-notifiers.

    Per visualizzare l'esempio, consulta il file di configurazione del notificatore per il notificatore HTTP.

    Per altri campi in base ai quali puoi filtrare, consulta la risorsa Build. Per altri esempi di filtri, consulta Utilizzo di CEL per filtrare gli eventi di build.

  3. Carica il file di configurazione del notificatore in un bucket Cloud Storage:

    1. Se non hai un bucket Cloud Storage, esegui il comando seguente per creare un bucket, dove BUCKET_NAME è il nome che vuoi assegnare al bucket, soggetto ai requisiti di denominazione.

      gcloud storage buckets create gs://BUCKET_NAME/
      
    2. Carica il file di configurazione del notificatore nel bucket:

      gcloud storage cp CONFIG_FILE_NAME gs://BUCKET_NAME/CONFIG_FILE_NAME
      

      Dove:

      • BUCKET_NAME è il nome del bucket.
      • CONFIG_FILE_NAME è il nome del file di configurazione del notificatore.
  4. Esegui il deployment del notificatore in Cloud Run:

     gcloud run deploy SERVICE_NAME \
       --image=us-east1-docker.pkg.dev/gcb-release/cloud-build-notifiers/http:latest \
       --no-allow-unauthenticated \
       --update-env-vars=CONFIG_PATH=CONFIG_PATH,PROJECT_ID=PROJECT_ID
    

    Dove:

    • SERVICE_NAME è il nome del servizio Cloud Run in cui stai eseguendo il deployment dell'immagine.
    • CONFIG_PATH è il percorso del file di configurazione del notificatore per il notificatore HTTP, gs://BUCKET_NAME/CONFIG_FILE_NAME.
    • PROJECT_ID è l'ID del tuo Google Cloud progetto.

    Il comando gcloud run deploy esegue il pull dell'ultima versione dell'immagine ospitata da Artifact Registry di proprietà di Cloud Build. Cloud Build supporta le immagini del notificatore per nove mesi. Dopo nove mesi, Cloud Build elimina la versione dell'immagine. Se vuoi utilizzare una versione precedente dell'immagine, devi specificare la versione semantica completa del tag dell'immagine nell'attributo image del comando gcloud run deploy. Le versioni e i tag delle immagini precedenti sono disponibili in Artifact Registry.

  5. Crea un account di servizio per rappresentare l'identità della sottoscrizione Pub/Sub:

    gcloud iam service-accounts create SUB_IDENTITY_SERVICE_ACCOUNT \
      --display-name "SUB_IDENTITY_SERVICE_ACCOUNT_DISPLAY_NAME"
    

    Dove:

    • SUB_IDENTITY_SERVICE_ACCOUNT è un nome per il account di servizio.

    • SUB_IDENTITY_SERVICE_ACCOUNT_DISPLAY_NAME è un nome visualizzato per il account di servizio.

  6. Concedi al account di servizio di identità della sottoscrizione Pub/Sub le autorizzazioni necessarie per creare token di autenticazione nel tuo Google Cloud progetto.

    gcloud iam service-accounts add-iam-policy-binding \
        SUB_IDENTITY_SERVICE_ACCOUNT@PROJECT_ID.i \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub. \
        --role=roles/iam.serviceAccountTokenCreator
    

    Dove:

    • PROJECT_ID è l'ID del tuo Google Cloud progetto.

    • PROJECT_NUMBER è il numero del tuo progetto Google Cloud .

  7. Concedi al account di servizio SUB_IDENTITY_SERVICE_ACCOUNT il ruolo Invoker di Cloud Run:

    gcloud run services add-iam-policy-binding SERVICE_NAME \
       --member=serviceAccount:SUB_IDENTITY_SERVICE_ACCOUNT@PROJECT_ID. \
       --role=roles/run.invoker
    

    Dove:

    • SERVICE_NAME è il nome del servizio Cloud Run in cui stai eseguendo il deployment dell'immagine.

    • PROJECT_ID è l'ID del tuo Google Cloud progetto.

  8. Crea l'argomento cloud-builds per ricevere i messaggi di aggiornamento della build per il notificatore:

    gcloud pubsub topics create cloud-builds
    

    Puoi anche definire un nome di argomento personalizzato nel file di configurazione della build in modo che i messaggi vengano inviati all'argomento personalizzato. In questo caso, devi creare un argomento con lo stesso nome di argomento personalizzato:

    gcloud pubsub topics create topic-name
    

    Per saperne di più, consulta Argomenti Pub/Sub per le notifiche di build.

  9. Crea un sottoscrittore push Pub/Sub per il notificatore:

     gcloud pubsub subscriptions create subscriber-id \
       --topic=cloud-builds \
       --push-endpoint=SERVICE_URL \
       --push-auth-service-account=SUB_IDENTITY_SERVICE_ACCOUNT@PROJECT_ID.

Dove: + SUBSCRIBER_ID è il nome che vuoi assegnare alla sottoscrizione. + SERVICE_URL è l'URL generato da Cloud Run per il nuovo servizio. + PROJECT_ID è l'ID del tuo Google Cloud progetto.

Note: By default, [subscriptions expire after 31 days of inactivity](/pubsub/docs/subscription-overview#lifecycle).
You can adjust or disable the expiration period by including the
[`--expiration-period` flag](/sdk/gcloud/reference/pubsub/subscriptions/create#--expiration-period)
when creating the subscription.

Le notifiche per il tuo progetto Cloud Build sono ora configurate. La prossima volta che richiami una build, il server HTTP destinatario all'URL specificato riceverà payload JSON che corrispondono alla risorsa Build se la build corrisponde al filtro configurato.

Utilizzo di CEL per filtrare gli eventi di build

Cloud Build utilizza CEL con la variabile build nei campi elencati nella risorsa Build per accedere ai campi associati all'evento di build, come l'ID trigger, l'elenco delle immagini o i valori di sostituzione. Puoi utilizzare la filter stringa per filtrare gli eventi di build nel file di configurazione della build utilizzando qualsiasi campo elencato nella risorsa Build. Per trovare la sintassi esatta associata al campo, consulta il cloudbuild.proto file.

Filtrare in base all'ID trigger

Per filtrare in base all'ID trigger, specifica il valore dell'ID trigger nel campo filter utilizzando build.build_trigger_id, dove trigger-id è l'ID trigger come stringa:

filter: build.build_trigger_id == trigger-id

Filtrare in base allo stato

Per filtrare in base allo stato, specifica lo stato della build in base al quale vuoi filtrare nel campo filter utilizzando build.status.

L'esempio seguente mostra come filtrare gli eventi di build con lo stato SUCCESS utilizzando il campo filter:

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

Puoi anche filtrare le build con stati diversi. L'esempio seguente mostra come filtrare gli eventi di build con lo stato SUCCESS, FAILURE o TIMEOUT utilizzando il campo filter:

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

Per visualizzare altri valori di stato in base ai quali puoi filtrare, consulta Stato nella documentazione di riferimento della risorsa Build.

Filtrare in base al tag

Per filtrare in base al tag, specifica il valore del tag nel campo filter utilizzando build.tags, dove tag-name è il nome del tag:

filter: tag-name in build.tags

Puoi filtrare in base al numero di tag specificati nell'evento di build utilizzando size. Nell'esempio seguente, il campo filter filtra gli eventi di build che hanno esattamente due tag specificati, uno dei quali è v1:

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

Filtrare in base alle immagini

Per filtrare in base alle immagini, specifica il valore dell'immagine nel campo filter utilizzando build.images, dove image-name è il nome completo dell'immagine come elencato in Artifact Registry, ad esempio us-east1-docker.pkg.dev/my-project/docker-repo/image-one:

filter: image-name in build.images

Nell'esempio seguente, il campo filter filtra gli eventi di build che hanno us-east1-docker.pkg.dev/my-project/docker-repo/image-one o us-east1-docker.pkg.dev/my-project/docker-repo/image-two specificati come nomi delle immagini:

filter: "us-east1-docker.pkg.dev/my-project/docker-repo/image-one" in build.images || "us-east1-docker.pkg.dev/my-project/docker-repo/image-one" in build.images

Filtrare in base all'ora

Puoi filtrare gli eventi di build in base all'ora di creazione, all'ora di inizio o all'ora di fine di una build specificando una delle seguenti opzioni nel campo filter: build.create_time, build.start_time o build.finish_time.

Nell'esempio seguente, il campo filter utilizza timestamp per filtrare gli eventi di build con un'ora di richiesta per creare la build il 20 luglio 2020 alle 06:00:

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

Puoi anche filtrare gli eventi di build in base ai confronti temporali. Nell'esempio seguente, il campo filter utilizza timestamp per filtrare gli eventi di build con un'ora di inizio compresa tra il 20 luglio 2020 alle 06:00 e il 30 luglio 2020 alle 06:00.

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

Per saperne di più su come vengono espressi i fusi orari in CEL, consulta la definizione del linguaggio per i fusi orari.

Per filtrare in base alla durata di una build, puoi utilizzare duration per confrontare i timestamp. Nell'esempio seguente, il campo filter utilizza duration per filtrare gli eventi di build con build che vengono eseguite per almeno cinque minuti:

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

Filtrare in base alla sostituzione

Puoi filtrare in base alla sostituzione specificando la variabile di sostituzione nel campo filter utilizzando build.substitutions. Nell'esempio seguente, il campo filter elenca le build che contengono la variabile di sostituzione substitution-variable e verifica se substitution-variable corrisponde a substitution-value specificato:

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

Dove:

  • substitution-variable è il nome della variabile di sostituzione.
  • substitution-value è il nome del valore di sostituzione.

Puoi anche filtrare in base ai valori delle variabili di sostituzione predefinite. Nell'esempio seguente, il campo filter elenca le build con il nome del ramo master e le build con il nome del repository github.com/user/my-example-repo. Le variabili di sostituzione predefinite BRANCH_NAME e REPO_NAME vengono passate come chiavi a build.substitutions:

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

Se vuoi filtrare le stringhe utilizzando le espressioni regolari, puoi utilizzare la funzione integrata matches. Nell'esempio seguente, il campo filter filtra le build con lo stato FAILURE o TIMEOUT e che hanno anche una variabile di sostituzione della build TAG_NAME con un valore che corrisponde all'espressione regolare 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}$")

Per visualizzare un elenco dei valori di sostituzione predefiniti, consulta Utilizzo delle sostituzioni predefinite.

Passaggi successivi