Configurar notificações SMTP

O Cloud Build pode notificar você sobre atualizações de build enviando notificações para os canais selecionados, como o Slack ou seu servidor SMTP. Esta página explica como configurar notificações usando o notificador SMTP.

Antes de começar

  • Ative as APIs Cloud Build, Compute Engine, Cloud Run, Pub/Sub e Secret Manager.

    Funções necessárias para ativar APIs

    Para ativar as APIs, é necessário ter o papel do IAM de administrador de uso do serviço (roles/serviceusage.serviceUsageAdmin), que contém a permissão serviceusage.services.enable. Saiba como conceder papéis.

    Ativar as APIs

Como configurar notificações por e-mail

Para enviar notificações por e-mail, você precisará de um servidor SMTP em execução e acesso a uma conta nesse servidor, incluindo o nome de usuário e a senha da conta que será usada para enviar notificações. Você pode usar qualquer servidor SMTP, mas vai precisar de acesso ao nome e à porta dele. Por exemplo, o nome do servidor do Gmail é smtp.gmail.com e a porta é 587. Certifique-se de que as cotas de envio do servidor SMTP sejam compatíveis com o volume de e-mail esperado.

A seção a seguir explica como configurar manualmente as notificações por e-mail usando o notificador do SMTP. Se você quiser automatizar a configuração, consulte Como automatizar a configuração de notificações.

Para configurar notificações por e-mail:

  1. Armazene a senha da conta de e-mail do remetente no Secret Manager. No caso do Gmail, use a senha de app em vez da senha de login da conta.

    1. Abra a página do Secret Manager no console Google Cloud :

      Abra a página do Secret Manager

    2. Clique em Criar secret.

    3. Insira um nome para o secret.

    4. Em Valor do secret, adicione a senha da conta de e-mail do remetente.

    5. Para salvar o secret, clique em Criar secret.

  2. Embora a conta de serviço do Cloud Run possa ter o papel de Editor para o projeto, o papel de Editor não é suficiente para acessar o secret no Secret Manager. Para conceder à sua conta de serviço do Cloud Run acesso ao secret, faça o seguinte:

    1. Acesse a página do IAM no console Google Cloud :

      Abrir a página do IAM

    2. Localize a conta de serviço padrão do Compute Engine associada ao seu projeto:

      Sua conta de serviço padrão do Compute Engine será semelhante a esta:

      project-number-compute@developer.gserviceaccount.com
      

      Anote a conta de serviço padrão do Compute Engine.

    3. Abra a página do Secret Manager no console Google Cloud :

      Abra a página do Secret Manager

    4. Clique no nome do secret que contém o secret da senha da conta de e-mail do remetente.

    5. Na guia Permissões, clique em Adicionar membro.

    6. Adicione a conta de serviço padrão do Compute Engine associada ao projeto como membro.

    7. Selecione a permissão Acessador de secrets do Secret Manager como papel.

    8. Clique em Salvar.

  3. Conceda permissão à conta de serviço do Cloud Run para ler dos buckets do Cloud Storage:

    1. Acesse a página do IAM no console Google Cloud :

      Abrir a página do IAM

    2. Localize a conta de serviço padrão do Compute Engine associada ao seu projeto:

      Sua conta de serviço padrão do Compute Engine será semelhante a esta:

      project-number-compute@developer.gserviceaccount.com
      
    3. Clique no ícone de lápis na linha que contém sua conta de serviço padrão do Compute Engine. A guia acesso de edição vai aparecer.

    4. Clique em Adicionar outro papel.

    5. Adicione o seguinte papel:

      • Leitor de objetos do Storage
    6. Clique em Salvar.

  4. Grave um arquivo de configuração do notificador para configurar o notificador SMTP e filtrar os eventos de build:

    No exemplo de arquivo de configuração do notificador de exemplo, o campo filter usa Common Expression Language com a variável disponível, build, para filtrar os eventos de build com um status SUCCESS:

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

    Em que:

    • buildStatus é um parâmetro definido pelo usuário. Esse parâmetro assume o valor de $(build.status), o status do build.
    • bucket-name é o nome do bucket.
    • server-host-name é o endereço do seu servidor SMTP.
    • port é a porta que processará as solicitações de SMTP. Esse valor precisa ser especificado como uma string.
    • sender-email é o endereço de e-mail da conta do remetente que é vista pelo server-host-name especificado.
    • from-email é o endereço de e-mail visto pelos destinatários.
    • recipient-email é uma lista de um ou mais endereços de e-mail para receber mensagens do remetente.
    • smtp-password é a variável de configuração usada neste exemplo para fazer referência à senha da conta de e-mail do remetente armazenada no Gerenciador de secrets. O nome da variável especificado aqui precisa corresponder ao campo name em secrets.
    • project-id é o ID do projeto do Google Cloud .
    • secret-name é o nome do secret que contém a senha da conta de e-mail do remetente.
    • O campo uri faz referência ao arquivo smtp.html. Esse arquivo se refere a um modelo HTML hospedado no Cloud Storage e representa seu e-mail de notificação.

    Para ver o exemplo, consulte o arquivo de configuração do notificador para o notificador SMTP.

    Para ver outros campos que podem ser filtrados, consulte o recurso Build. Para ver mais exemplos de filtragem, consulte Como usar a CEL para filtrar eventos do build.

  5. Faça o upload do arquivo de configuração do notificador em um bucket do Cloud Storage:

    1. Se você não tiver um bucket do Cloud Storage, execute o seguinte comando para criar um bucket, em que bucket-name é o nome que você quer dar ao bucket, sujeito aos requisitos de nomenclatura.

      gcloud storage buckets create gs://bucket-name/
      
    2. Faça o upload do arquivo de configuração do notificador para o bucket:

      gcloud storage cp config-file-name gs://bucket-name/config-file-name
      

      Onde:

      • bucket-name é o nome do bucket.
      • config-file-name é o nome do seu arquivo de configuração.
  6. Implante o notificador no Cloud Run.

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

    Onde:

    • service-name é o nome do serviço do Cloud Run em que você está implantando a imagem;
    • config-path é o caminho para o arquivo de configuração do notificador do notificador de SMTP, gs://bucket-name/config-file-name.
    • project-id é o ID do projeto do Google Cloud .

    O comando gcloud run deploy extrai a versão mais recente da imagem hospedada do Registro de artefatos de propriedade do Cloud Build. O Cloud Build oferece suporte a imagens do notificador por nove meses. Após nove meses, o Cloud Build exclui a versão da imagem. Se quiser usar uma versão de imagem anterior, você precisará especificar a versão semântica completa da tag de imagem no atributo image do seu comando gcloud run deploy. Versões e tags de imagem anteriores podem ser encontradas no Artifact Registry.

  7. Conceda permissões do Pub/Sub para criar tokens de autenticação no seu projeto Google Cloud :

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

    Em que:

    • project-id é o ID do projeto do Google Cloud .
    • project-number é o número do projeto Google Cloud .
  8. Crie uma conta de serviço para representar sua identidade de assinatura do Pub/Sub:

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

    Você pode usar cloud-run-pubsub-invoker ou um nome exclusivo no seu projeto Google Cloud .

  9. Conceda à conta de serviço cloud-run-pubsub-invoker a permissão Invoker do Cloud Run:

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

    Em que:

    • service-name é o nome do serviço do Cloud Run em que você está implantando a imagem;

    • project-id é o ID do projeto do Google Cloud .

  10. Crie o tópico cloud-builds para receber mensagens de atualização da build para seu notificador:

    gcloud pubsub topics create cloud-builds
    

    Você também pode definir um nome de tópico personalizado no arquivo de configuração do build para que as mensagens sejam enviadas para ele. Nesse caso, você criaria um tópico com o mesmo nome personalizado:

    gcloud pubsub topics create topic-name
    

    Para mais informações, consulte Tópicos do Pub/Sub para notificações de build.

  11. Crie um assinante de push do Pub/Sub para seu notificador:

     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
    

    Em que:

    • subscriber-id é o nome que você quer dar à sua assinatura.
    • service-url é o URL gerado pelo Cloud Run para o novo serviço.
    • project-id é o ID do projeto do Google Cloud .

Agora as notificações do seu projeto do Cloud Build estão configuradas. Na próxima vez que invocar um build, o recipients especificado receberá um e-mail com uma notificação caso o build corresponda ao filtro que você configurou.

Como usar a CEL para filtrar eventos de build

O Cloud Build usa a CEL com a variável build nos campos listados no recurso Build para acessar os campos associados ao evento de build, como o ID do gatilho, a lista de imagens ou os valores de substituição. Use a string filter para filtrar eventos de build no arquivo de configuração do build usando qualquer campo listado no recurso Build. Para encontrar a sintaxe exata associada ao seu campo, consulte o arquivo cloudbuild.proto.

Como filtrar por ID do acionador

Para filtrar por ID de gatilho, especifique o valor do ID do gatilho no campo filter usando build.build_trigger_id, em que trigger-id é o ID do gatilho como uma string:

filter: build.build_trigger_id == trigger-id

Como filtrar por status

Para filtrar por status, especifique o status do build que você quer filtrar no campo filter usando build.status.

O exemplo a seguir mostra como filtrar eventos de build com um status SUCCESS usando o campo filter:

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

Também é possível filtrar builds com status variados. O exemplo a seguir mostra como filtrar eventos de build com um status SUCCESS, FAILURE ou TIMEOUT usando o campo filter:

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

Para ver valores de status adicionais pelos quais você pode filtrar, consulte Status na referência do recurso do Build.

Como filtrar por tag

Para filtrar por tag, especifique o valor da tag no campo filter usando build.tags, em que tag-name é o nome da tag:

filter: tag-name in build.tags

É possível filtrar com base no número de tags especificadas no evento de build usando size. No exemplo a seguir, o campo filter filtra eventos de build que têm exatamente duas tags especificadas, uma delas como v1:

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

Como filtrar por imagens

Para filtrar por imagens, especifique o valor da imagem no campo filter usando build.images, em que image-name é o nome completo da imagem conforme listado no Artifact Registry, como us-east1-docker.pkg.dev/my-project/docker-repo/image-one:

filter: image-name in build.images

No exemplo a seguir, o filter filtra eventos de build com us-east1-docker.pkg.dev/my-project/docker-repo/image-one ou us-east1-docker.pkg.dev/my-project/docker-repo/image-two especificados como nomes de imagem:

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

Como filtrar por tempo

É possível filtrar eventos de build com base no tempo de criação, horário de início ou horário de término de um build especificando uma das seguintes opções no campo filter: build.create_time, build.start_time ou build.finish_time.

No exemplo a seguir, o campo filter usa timestamp para filtrar eventos de build com um horário de solicitação para criar o build em 20 de julho de 2020, às 6h:

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

Também é possível filtrar eventos de build por comparações de tempo. No exemplo a seguir, o campo filter usa timestamp para filtrar eventos de versão com um horário de início entre 6 de julho de 2020, às 6h, e 30 de julho de 2020, às 6h.

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

Para saber mais sobre como os fusos horários são expressos em CEL, consulte a definição de linguagem para fusos horários.

Para filtrar por duração de um build, use duration para comparar carimbos de data/hora. No exemplo a seguir, o campo filter usa duration para filtrar eventos de build com um build executado por pelo menos cinco minutos:

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

Como filtrar por substituição

É possível filtrar por substituição especificando a variável de substituição no campo filter usando build.substitutions. No exemplo a seguir, o campo filter lista versões que contêm a variável de substituição substitution-variable e verifica se o substitution-variable corresponde ao substitution-value especificado:

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

Em que:

  • substitution-variable é o nome da variável de substituição.
  • substitution-value é o nome do valor de substituição.

Também é possível filtrar por padrão os valores das variáveis de substituição. No exemplo a seguir, o campo filter lista os builds que têm o nome da ramificação master e os builds que têm o nome de repositório github.com/user/my-example-repo. As variáveis de substituição padrão BRANCH_NAME e REPO_NAME são transmitidas como chaves para o build.substitutions:

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

Se você quiser filtrar strings usando expressões regulares, use a função integrada matches. No exemplo abaixo, o campo filter filtra as criações com status FALHA ou TEMPO LIMITE e também tem uma variável de substituição de versão TAG_NAME com um valor correspondente à expressão regular 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}$")

Para ver uma lista de valores de substituição padrão, consulte Como usar substituições padrão.

A seguir