写点什么

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

用户头像
📿
关注
发布于: 2021 年 04 月 06 日
二十八分钟,带你用gitlab向企业微信发出灵魂拷问

例如:




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


材料准备

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

WebHook

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

如何在 gitlab 配置 WebHook

  1. 本文以我使用的 GitLab Community Edition 11.8.1 版本为例,介绍如何配置一个当代码 push 完成后的 webhook 事件


  1. 打开 integrations,在 URL 中配置好 webhook 地址,和需要触发推送的分支。一般 dev 分支提交很频繁,没有必要推送消息。可以根据实际情况动态选择。


  1. 格式转换,gitlab 的 push webhook 格式如下,和企业微信 api 能接收的肯定是不一样的。所以需要在中间做一层转换,或者加上一些自定义的东西。在后面会讲到。


{   "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

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

和微信一样,可以先拉两个人建一个群,然后再把他们两个踢掉。这样,你就得到了一个只有你一个人的群了。然后就可以右键群聊,添加机器人,进行随意的测试了~



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

webhook 翻译应用

  1. 利用 idea 自动生成一个 SpringBoot 应用,虽然有点大材小用,但是方便,快捷~整个应用的结构如图,就两个类,一个 controller 监听 gitlab 的消息,一个 HttpUtil 工具类用来请求新闻接口,获取新闻简讯给每一次的 push 消息。


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


        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 消息到企业微信



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


发布于: 2021 年 04 月 06 日阅读数: 69
用户头像

📿

关注

还未添加个人签名 2021.01.30 加入

欢迎公众微信公众号:小熊的进阶之路

评论

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