Commit 42f2d574 authored by 黎博's avatar 黎博

新增jira issue service以及定时任务

parent 40055ffd
...@@ -4,8 +4,10 @@ import cn.qg.holmes.config.ApolloPropertySourceInitializer; ...@@ -4,8 +4,10 @@ import cn.qg.holmes.config.ApolloPropertySourceInitializer;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication @SpringBootApplication
@EnableScheduling
@MapperScan(value = "cn.qg.holmes.mapper.*") @MapperScan(value = "cn.qg.holmes.mapper.*")
public class HolmesApplication { public class HolmesApplication {
......
package cn.qg.holmes.controller.jira;
import cn.qg.holmes.service.jira.JiraIssueService;
import cn.qg.holmes.utils.DingdingUtils;
import com.atlassian.jira.rest.client.api.domain.Issue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@CrossOrigin
@RestController
@RequestMapping("/jira")
public class JiraController {
@Autowired
JiraIssueService jiraIssueService;
@GetMapping("/report/project")
public void sendReportToDingdingGroup(String project, String webhook) throws Exception {
Iterable<Issue> issues = jiraIssueService.getUnsolvedIssueListByProject(project);
String markdownMsg = DingdingUtils.buildMarkdownMsgForUnsolvedIssueList(issues);
DingdingUtils.sendToDingding(markdownMsg, webhook);
}
}
...@@ -2,9 +2,7 @@ package cn.qg.holmes.service.jira; ...@@ -2,9 +2,7 @@ package cn.qg.holmes.service.jira;
import com.atlassian.jira.rest.client.api.domain.Issue; import com.atlassian.jira.rest.client.api.domain.Issue;
import java.util.List;
public interface JiraIssueService { public interface JiraIssueService {
List<Issue> getIssueByProject(String project) throws Exception; Iterable<Issue> getUnsolvedIssueListByProject(String project) throws Exception;
} }
package cn.qg.holmes.service.jira.impl; package cn.qg.holmes.service.jira.impl;
import cn.qg.holmes.service.jira.JiraIssueService; import cn.qg.holmes.service.jira.JiraIssueService;
import cn.qg.holmes.utils.DingdingUtils;
import com.atlassian.jira.rest.client.api.JiraRestClient; import com.atlassian.jira.rest.client.api.JiraRestClient;
import com.atlassian.jira.rest.client.api.JiraRestClientFactory; import com.atlassian.jira.rest.client.api.JiraRestClientFactory;
import com.atlassian.jira.rest.client.api.domain.Issue; import com.atlassian.jira.rest.client.api.domain.Issue;
...@@ -11,14 +12,15 @@ import org.springframework.stereotype.Service; ...@@ -11,14 +12,15 @@ import org.springframework.stereotype.Service;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Service @Service
public class JiraIssueServiceImpl implements JiraIssueService { public class JiraIssueServiceImpl implements JiraIssueService {
public static String url = "http://jira2.quantgroup.cn/"; public static String url = "http://jira2.quantgroup.cn/";
public static String username = ""; public static String username = "test1";
public static String password = ""; public static String password = "123456";
public static JiraRestClient createJiraRestClient() { public static JiraRestClient createJiraRestClient() {
JiraRestClientFactory jiraRestClientFactory = new AsynchronousJiraRestClientFactory(); JiraRestClientFactory jiraRestClientFactory = new AsynchronousJiraRestClientFactory();
...@@ -31,14 +33,18 @@ public class JiraIssueServiceImpl implements JiraIssueService { ...@@ -31,14 +33,18 @@ public class JiraIssueServiceImpl implements JiraIssueService {
return jiraRestClient; return jiraRestClient;
} }
/**
* 根据项目关键字获取未解决BUG列表
* @param project 项目关键字,如"YXM"
* @return
* @throws Exception
*/
@Override @Override
public List<Issue> getIssueByProject(String project) throws Exception{ public Iterable<Issue> getUnsolvedIssueListByProject(String project) throws Exception{
JiraRestClient jiraRestClient = createJiraRestClient(); JiraRestClient jiraRestClient = createJiraRestClient();
Promise<SearchResult> resultPromise = jiraRestClient.getSearchClient().searchJql("project = YXM ORDER BY key DESC"); Promise<SearchResult> resultPromise = jiraRestClient.getSearchClient().searchJql("project = " + project + " AND resolution = Unresolved ORDER BY priority DESC");
Iterable<Issue> issues = resultPromise.get().getIssues(); Iterable<Issue> issues = resultPromise.get().getIssues();
for (Issue issue: issues) { return issues;
}
return null;
} }
} }
package cn.qg.holmes.task.jira;
import cn.qg.holmes.service.jira.JiraIssueService;
import cn.qg.holmes.utils.DingdingUtils;
import com.atlassian.jira.rest.client.api.domain.Issue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* Jira BUG通知到钉钉定时任务类
*/
@Component
@Slf4j
public class JiraToDingding {
@Autowired
JiraIssueService jiraIssueService;
@Value("${sjgd.ding.url}")
private String sjgdDingUrl;
/**
* 数据工单bug统计
* @throws Exception
*/
@Scheduled(cron = "0 0 19 * * ?")
public void SJGDJiraIssueStatisticsTimedJob() throws Exception {
Iterable<Issue> issues = jiraIssueService.getUnsolvedIssueListByProject("YXM");
String markdownMsg = DingdingUtils.buildMarkdownMsgForUnsolvedIssueList(issues);
DingdingUtils.sendToDingding(markdownMsg, sjgdDingUrl);
}
}
package cn.qg.holmes.utils; package cn.qg.holmes.utils;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.atlassian.jira.rest.client.api.domain.Issue;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
@Slf4j @Slf4j
...@@ -34,6 +37,39 @@ public class DingdingUtils { ...@@ -34,6 +37,39 @@ public class DingdingUtils {
return JSON.toJSONString(markdown); return JSON.toJSONString(markdown);
} }
/**
* 根据issueList构建未解决issueList的markdown格式
* @param issues Issue的迭代器
* @return
*/
public static String buildMarkdownMsgForUnsolvedIssueList(Iterable<Issue> issues) {
Map<String, Object> markdown = new HashMap<>();
Map<String, String> contentMap = new HashMap<>();
Map<String, Object> atMap = new HashMap<>();
atMap.put("isAtAll", true);
markdown.put("at", atMap);
List<Issue> issueList = new ArrayList<>();
for (Issue issue: issues) {
issueList.add(issue);
}
markdown.put("msgtype", "markdown");
contentMap.put("title", "今日未解决BUG统计");
String content = "### 今日未解决BUG数:" + issueList.size() + "\n";
int count = 0;
for (Issue issue: issueList) {
count = count + 1;
String issueUrl = "http://jira2.quantgroup.cn/browse/" + issue.getKey();
content = content + count + "、[" + issue.getSummary().replace("\"", "") + "](" + issueUrl + ")\n";
content = content + "- 优先级:" + issue.getPriority().getName() + "\n";
content = content + "- 状态:" + issue.getStatus().getName() + "\n";
content = content + "- 经办人:" + issue.getAssignee().getDisplayName() + "\n";
content = content + "\n";
}
contentMap.put("text", content);
markdown.put("markdown", contentMap);
return JSON.toJSONString(markdown);
}
public static void main(String[] args) { public static void main(String[] args) {
String markdown = buildMarkdownMsg("YXM-1499", "【羊小咩v7.6.00】【VCC首次交易率提升专题】巴拉巴拉", "黎博", "于巧玲", "p1", "kddsp"); String markdown = buildMarkdownMsg("YXM-1499", "【羊小咩v7.6.00】【VCC首次交易率提升专题】巴拉巴拉", "黎博", "于巧玲", "p1", "kddsp");
sendToDingding(markdown, "https://oapi.dingtalk.com/robot/send?access_token=835663338d638e40daaf3ab358af741ef0680a826a962c91bedc53b149d85ee1"); sendToDingding(markdown, "https://oapi.dingtalk.com/robot/send?access_token=835663338d638e40daaf3ab358af741ef0680a826a962c91bedc53b149d85ee1");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment