使用钉钉机器人发送事件通知

运行工作流时,您可能需要在工作流运行结束或它的某个步骤完成时通知外部系统。例如邮件通知、即时消息(例如钉钉)、消息总线(例如Kafka)。本文以发送钉钉消息为例介绍如何在工作流运行中发送消息通知。

前提条件

已创建分布式工作流Argo集群,且工作流集群的VPC具有公网访问能力。

实现原理

  1. 外部系统一般通过暴露HTTP Webhook接口的方式,接受消息输入。

  2. Argo工作流支持Exit Handler机制。您可以在工作流的步骤中定义exit-handler,也可以在工作流本身定义exit-handler

  3. Exit Handler以容器的方式运行。您可以在容器中运行curl命令向外部系统发送HTTP消息,从而实现事件通知。

步骤一:创建钉钉机器人

创建钉钉机器人后会生成专属的Webhook地址,通过Webhook地址可以关联到其他服务接收通知,例如Argo工作流。

  1. 打开需要接收事件通知的钉钉群。

  2. 进入机器人设置页面。

    1. 单击钉钉群右上角的群设置图标图标.png,然后在设置面板,单击智能群助手

    2. 智能群助手面板,单击添加机器人,然后在群机器人对话框中的添加机器人区域,单击添加图标图标2.png

    3. 选择要添加的机器人区域,单击自定义,然后在机器人详情对话框,单击添加。按页面提示完成机器人设置。您必须至少选择一种安全设置,建议选择加签IP地址(段)中的至少一种,以保证安全性。

      重要

      在工作流中通过钉钉发送消息,要求工作流集群的VPC网络具有公网访问能力。您可以为工作流集群VPC配置公网NAT网关,同时将公网NAT网关的EIP地址配置到机器人的IP地址(段)中,以确保安全性。

  3. 设置完成后,复制并保存Webhook地址。image.png

步骤二:在工作流中使用钉钉机器人

使用以下YAML示例代码,创建工作流,并在工作流中使用钉钉机器人。关于创建工作流的具体操作,请参见创建工作流

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: notification-demo-
spec:
  entrypoint: say-hello
  onExit: exit-handler   # 工作流运行完成后,运行exit-handler。
  templates:
  - name: say-hello
    container:
      image: alpine:latest
      command: [sh, -c]
      args: ["echo hello"]

  - name: exit-handler
    container:
      image: curlimages/curl
      command: [sh, -c]
      # 运行curl发送钉钉消息,消息类型为链接类型,可以嵌入Argo工作流控制台链接,快速查看工作流详情。
      # 可以引用变量包括:{{workflow.name}} {{workflow.status}} {{workflow.failures}} {{workflow.workflow.duration}}。
      args: [
        "curl  -H 'Content-Type: application/json' -d '{
          \"msgtype\": \"link\",
          \"link\": {
            \"title\":\"Argo workflow notification\",
            \"text\":\"WF {{workflow.name}} {{workflow.status}}\",
            \"messageUrl\":\"https://argo.xxx.cn-zhangjiakou.alicontainer.com:2746/workflows/default/{{workflow.name}}?tab=workflow\"
          }
        }'
        https://oapi.dingtalk.com/robot/send?access_token=b97fb519129fdfce879baa4e3b905b14e6a64e8994f0ea3b11dda****"  #Webhook地址,此处替换为您钉钉群的Webhook地址。
      ]

发送的钉钉消息示例如下所示。

消息.png

相关文档

关于钉钉自定义机器人接入的具体操作,请参见自定义机器人接入