二十八分钟,带你用gitlab向企业微信发出灵魂拷问

二十八分钟,带你用gitlab向企业微信发出灵魂拷问

例如:

二十八分钟,带你用gitlab向企业微信发出灵魂拷问

二十八分钟,带你用gitlab向企业微信发出灵魂拷问

是不是想着想着,就下班了呢?哈哈。由于像灵魂拷问这样的神问题数量有限,
下面也有播报新闻版的,这样就不怕提交次数多了看见重复的拷问~

二十八分钟,带你用gitlab向企业微信发出灵魂拷问

材料准备

gitlab一个,企业微信一个,能随意部署应用的机器一台(用来翻译webhook)。

WebHook

webhook拿大白话来说就是事后事件。当一个动作完成后,钩子函数也好,事件下发也好,
总而言之,就是让我这个动作做完了,要通知告诉下一个人。例如当你测试给你提了一个新bug的时候,可以利用webhook发送消息给oa去@你处理。当有人提交代码之后,可以集成Jenkins自动构建。

如何在gitlab配置WebHook

  1. 本文以我使用的GitLab Community Edition 11.8.1 版本为例,介绍如何配置一个当代码push完成后的webhook事件
    二十八分钟,带你用gitlab向企业微信发出灵魂拷问

  2. 打开integrations,在URL中配置好webhook地址,和需要触发推送的分支。一般dev分支提交很频繁,没有必要推送消息。可以根据实际情况动态选择。
    二十八分钟,带你用gitlab向企业微信发出灵魂拷问

  3. 格式转换,gitlab的push webhook格式如下,和企业微信api能接收的肯定是不一样的。所以需要在中间做一层转换,或者加上一些自定义的东西。在后面会讲到。
    二十八分钟,带你用gitlab向企业微信发出灵魂拷问

{
   "object_kind":"push",
   "event_name":"push",
   "before":"1295d86467192337c379bc39e8fdc296c774a2bd",
   "after":"30d073745fba51fe1858caf0859abffa401955eb",
   "ref":"refs/heads/test",
   "checkout_sha":"30d073745fba51fe1858caf0859abffa401955eb",
   "message":null,
   "user_id":19,
   "user_name":"xiaoxiong",
   "user_username":"xiaoxiong",
   "user_email":"",
   "user_avatar":"http://gitlab.***.local/uploads/-/system/user/avatar/19/avatar.png",
   "project_id":65,
   "project":{
       "id":65,
       "name":"OMS",
       "description":"***",
       "web_url":"http://gitlab.***.local/product-and-sales-group/oms",
       "avatar_url":null,
       "git_ssh_url":"ssh://git@gitlab.***.local:30022/product-and-sales-group/oms.git",
       "git_http_url":"http://gitlab.***.local/product-and-sales-group/oms.git",
       "namespace":"product-and-sales-group",
       "visibility_level":0,
       "path_with_namespace":"product-and-sales-group/oms",
       "default_branch":"test",
       "ci_config_path":null,
       "homepage":"http://gitlab.***.local/product-and-sales-group/oms",
       "url":"ssh://git@gitlab.***.local:30022/product-and-sales-group/oms.git",
       "ssh_url":"ssh://git@gitlab.***.local:30022/product-and-sales-group/oms.git",
       "http_url":"http://gitlab.***.local/product-and-sales-group/oms.git"
   },
   "commits":[
       {
           "id":"30d073745fba51fe1858caf0859abffa401955eb",
           "message":"代码优化
",
           "timestamp":"2021-04-05T03:30:34Z",
           "url":"http://gitlab.***.local/product-and-sales-group/oms/commit/30d073745fba51fe1858caf0859abffa401955eb",
           "author":{
               "name":"xiaoxiong",
               "email":"xiaoxiong@***.com"
           },
           "added":[

           ],
           "modified":[
               "oms-service/src/main/java/com/****/oms/OmsServiceApp.java"
           ],
           "removed":[

           ]
       }
   ],
   "total_commits_count":1,
   "push_options":[

   ],
   "repository":{
       "name":"OMS",
       "url":"ssh://git@gitlab.***.local:30022/product-and-sales-group/oms.git",
       "description":"***",
       "homepage":"http://gitlab.***.local/product-and-sales-group/oms",
       "git_http_url":"http://gitlab.***.local/product-and-sales-group/oms.git",
       "git_ssh_url":"ssh://git@gitlab.***.local:30022/product-and-sales-group/oms.git",
       "visibility_level":0
   }
}

其他的事件参数可以参见gitlab官方文档:https://docs.gitlab.com/ee/user/project/integrations/webhooks.html

如何在企业微信中添加一个机器人

和微信一样,可以先拉两个人建一个群,然后再把他们两个踢掉。这样,你就得到了一个只有你一个人的群了。然后就可以右键群聊,添加机器人,进行随意的测试了~
二十八分钟,带你用gitlab向企业微信发出灵魂拷问
二十八分钟,带你用gitlab向企业微信发出灵魂拷问

ok,现在两边的webhook都已经探索了一遍,现在要做的就是写一个中间翻译人的应用了。让gitlab和企业微信能够听懂双方的对话~

webhook翻译应用

  1. 利用idea自动生成一个SpringBoot应用,虽然有点大材小用,但是方便,快捷~
    整个应用的结构如图,就两个类,一个controller监听gitlab的消息,一个HttpUtil工具类用来请求新闻接口,获取新闻简讯给每一次的push消息。
    二十八分钟,带你用gitlab向企业微信发出灵魂拷问

  2. 本来是手动搬运了一堆灵魂拷问来生成消息的,但是小伙伴们的代码提交三下五除二就把这些灵魂拷问给用完了。然后找了几个笑话的api,发现都不太好笑,不好笑也就算了,有的还要收费~最后用的是天行数据的IT资讯API,更新不是很及时,但也够用。
    二十八分钟,带你用gitlab向企业微信发出灵魂拷问

        try {
           if (newsQueue.isEmpty()) {
               String newsrst = HttpClientUtil.doGet("http://api.tianapi.com/it/index?key=******&num=50");
               JSONObject newsjson = JSON.parseObject(newsrst);
               for (Object object : newsjson.getJSONArray("newslist")) {
                   String news = String.format("[%s](%s)",((JSONObject)object).getString("title"),((JSONObject)object).getString("url"));
                   newsQueue.add(news);
               }
           }
           head = "【" + name + "】播报了一条新闻:" + newsQueue.poll();
       } catch (Exception e) {
           head = "【" + name + "】";
           e.printStackTrace();
       }

每次放50条新闻到队列里面,当用完了再去取新的新闻。这样新闻就不会重复了。(api接口的新闻更新有点少,如果提交次数过多,新闻更新会跟不上提交代码的速度。这样就需要多调几个api,多拿几个新闻源了。另外如果提交次数过少,也会造成新闻更新不及时。要根据实际情况来适配~)

最终效果,实现提交代码自动push消息到企业微信

二十八分钟,带你用gitlab向企业微信发出灵魂拷问

需要获取翻译应用源代码的小伙伴,可以关注公众号【小熊的进阶之路】回复“webhook”即可获取;

上一篇:19.python函数对象与闭包函数


下一篇:收集优化统计数据(Optimizer Statistics)的最佳实践方法