基于webhook与群机器人做些有意思的事儿

1,368 阅读3分钟

背景

  1. 组员忘记写周报了,怎么办,每周五手动艾特所有人么...
  2. 提交了代码,需要提mr,私聊或者直接扯嗓子喊人:我刚给你提了个mr,帮我合下
  3. 每次发布需要盯着打包、部署平台进度? ..

解决方式

【自动化!自动化!自动化!】 上面的问题解决方式分为两种:定时任务和某个特定事件触发

企业微信/钉钉支持添加群机器人,机器人会对应一个webhook地址,通过调用该地址,群机器人会发送消息内容(文本/markdown格式),支持 @群里所有人或群成员;

  1. 【定时任务】服务端跑定时任务,调用群机器人webhook地址
  2. 触发特定事件(需要该事件支持自定义webhook即接口地址),后端接口调用机器人webhook地址

例如:git push支持自定义webhook,当代码有push,则会调用填写的webhook

image.png

👇简单的画了个流程图,比较好理解一点

graph LR
代码push -->|携带参数回调填写的接口| 后端接口将收到的参数组装整合成新参数--->|调用| 企业微信群机器人webhook地址

node层跑定时任务 -->|调用| 企业微信群机器人webhook地址

1)企业微信群机器人webhook地址参数格式👇 image.png

2)代码push回调的参数示例 👇,如图包含项目和本次提交的信息,我们可以做数据整合,调用企业微信群机器人的webhook地址

{
  "object_kind": "push",
  "before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
  "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
  "ref": "refs/heads/master",
  "checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
  "user_id": 4,
  "user_name": "John Smith",
  "user_username": "jsmith",
  "user_email": "john@example.com",
  "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
  "project_id": 15,
  "project":{
    "id": 15,
    "name":"Diaspora",
    "description":"",
    "web_url":"http://example.com/mike/diaspora",
    "avatar_url":null,
    "git_ssh_url":"git@example.com:mike/diaspora.git",
    "git_http_url":"http://example.com/mike/diaspora.git",
    "namespace":"Mike",
    "visibility_level":0,
    "path_with_namespace":"mike/diaspora",
    "default_branch":"master",
    "homepage":"http://example.com/mike/diaspora",
    "url":"git@example.com:mike/diaspora.git",
    "ssh_url":"git@example.com:mike/diaspora.git",
    "http_url":"http://example.com/mike/diaspora.git"
  },
  "repository":{
    "name": "Diaspora",
    "url": "git@example.com:mike/diaspora.git",
    "description": "",
    "homepage": "http://example.com/mike/diaspora",
    "git_http_url":"http://example.com/mike/diaspora.git",
    "git_ssh_url":"git@example.com:mike/diaspora.git",
    "visibility_level":0
  },
  "commits": [
    {
      "id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
      "message": "Update Catalan translation to e38cb41.",
      "timestamp": "2011-12-12T14:27:31+02:00",
      "url": "http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
      "author": {
        "name": "Jordi Mallach",
        "email": "jordi@softcatala.org"
      },
      "added": ["CHANGELOG"],
      "modified": ["app/controller/application.rb"],
      "removed": []
    },
    {
      "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
      "message": "fixed readme",
      "timestamp": "2012-01-03T23:36:29+02:00",
      "url": "http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
      "author": {
        "name": "GitLab dev user",
        "email": "gitlabdev@dv6700.(none)"
      },
      "added": ["CHANGELOG"],
      "modified": ["app/controller/application.rb"],
      "removed": []
    }
  ],
  "total_commits_count": 4
}

行动

  1. node层作为后端服务;这里推荐下egg,支持定时任务
  2. 定时任务调用企业微信的群机器人webhook地址
  3. 项目代码的push会触发push event, 回调webhook地址(预设的node服务的接口A地址);接口A处理push事件传递的参数, 调用企业微信的群机器人webhook地址
  4. 打包成功/失败后,预设脚本(curl 接口B地址), 接口B调用企业微信的群机器人地址

Q & A

Q- 你可能想说:企业微信不是没周五有周报汇报提示么,多此一举?
A- 汇报提示是统一提提示的,每个群可能有定制性,可能也有要求写日报

Q- mr和打包、部署平台打包完后不是可以设置邮件提醒么,多此一举?
A- 我周围的小伙伴对邮件的依赖没有那么强,用的比较多的是企业微信/钉钉,我这边的想法也是让这种辅助性的工具越少越好,这样开发人员的精力会更集中

结果

  1. 每周五18:40定时推送写周报的消息到群,并艾特所有

  2. 代码push会发送消息到群里并艾特提交人,并显示提交信息等

  3. 代码打包部署后,会发消息到群,并艾特所有人

总结

  1. 想着如何【偷懒】,减少重复劳动性的工作
  2. 尽可能工作自动化,给卷一卷的工作增加点乐趣