二十八分钟,带你用gitlab向企业微信发出灵魂拷问
例如:
是不是想着想着,就下班了呢?哈哈。由于像灵魂拷问这样的神问题数量有限,
下面也有播报新闻版的,这样就不怕提交次数多了看见重复的拷问~
材料准备
gitlab一个,企业微信一个,能随意部署应用的机器一台(用来翻译webhook)。
WebHook
webhook拿大白话来说就是事后事件。当一个动作完成后,钩子函数也好,事件下发也好,
总而言之,就是让我这个动作做完了,要通知告诉下一个人。例如当你测试给你提了一个新bug的时候,可以利用webhook发送消息给oa去@你处理。当有人提交代码之后,可以集成Jenkins自动构建。
如何在gitlab配置WebHook
-
本文以我使用的GitLab Community Edition 11.8.1 版本为例,介绍如何配置一个当代码push完成后的webhook事件
-
打开integrations,在URL中配置好webhook地址,和需要触发推送的分支。一般dev分支提交很频繁,没有必要推送消息。可以根据实际情况动态选择。
-
格式转换,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翻译应用
-
利用idea自动生成一个SpringBoot应用,虽然有点大材小用,但是方便,快捷~
整个应用的结构如图,就两个类,一个controller监听gitlab的消息,一个HttpUtil工具类用来请求新闻接口,获取新闻简讯给每一次的push消息。 -
本来是手动搬运了一堆灵魂拷问来生成消息的,但是小伙伴们的代码提交三下五除二就把这些灵魂拷问给用完了。然后找了几个笑话的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”即可获取;