Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
holmes
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
QA
holmes
Commits
de5a9cae
Commit
de5a9cae
authored
Apr 22, 2021
by
黎博
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into auto
parents
8420d15b
42f2d574
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
175 additions
and
0 deletions
+175
-0
pom.xml
pom.xml
+14
-0
HolmesApplication.java
src/main/java/cn/qg/holmes/HolmesApplication.java
+2
-0
JiraController.java
...ain/java/cn/qg/holmes/controller/jira/JiraController.java
+26
-0
JiraIssueStatus.java
src/main/java/cn/qg/holmes/enums/JiraIssueStatus.java
+4
-0
JiraIssueService.java
...main/java/cn/qg/holmes/service/jira/JiraIssueService.java
+8
-0
JiraIssueServiceImpl.java
.../cn/qg/holmes/service/jira/impl/JiraIssueServiceImpl.java
+50
-0
JiraToDingding.java
src/main/java/cn/qg/holmes/task/jira/JiraToDingding.java
+35
-0
DingdingUtils.java
src/main/java/cn/qg/holmes/utils/DingdingUtils.java
+36
-0
No files found.
pom.xml
View file @
de5a9cae
...
@@ -122,6 +122,20 @@
...
@@ -122,6 +122,20 @@
<version>
2.5.0
</version>
<version>
2.5.0
</version>
</dependency>
</dependency>
<!-- jira: https://mvnrepository.com/artifact/io.atlassian.fugue/fugue -->
<dependency>
<groupId>
io.atlassian.fugue
</groupId>
<artifactId>
fugue
</artifactId>
<version>
4.7.2
</version>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
com.atlassian.jira
</groupId>
<artifactId>
jira-rest-java-client-core
</artifactId>
<version>
5.2.0
</version>
</dependency>
</dependencies>
</dependencies>
<build>
<build>
...
...
src/main/java/cn/qg/holmes/HolmesApplication.java
View file @
de5a9cae
...
@@ -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
{
...
...
src/main/java/cn/qg/holmes/controller/jira/JiraController.java
0 → 100644
View file @
de5a9cae
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
);
}
}
src/main/java/cn/qg/holmes/enums/JiraIssueStatus.java
0 → 100644
View file @
de5a9cae
package
cn
.
qg
.
holmes
.
enums
;
public
enum
JiraIssueStatus
{
}
src/main/java/cn/qg/holmes/service/jira/JiraIssueService.java
0 → 100644
View file @
de5a9cae
package
cn
.
qg
.
holmes
.
service
.
jira
;
import
com.atlassian.jira.rest.client.api.domain.Issue
;
public
interface
JiraIssueService
{
Iterable
<
Issue
>
getUnsolvedIssueListByProject
(
String
project
)
throws
Exception
;
}
src/main/java/cn/qg/holmes/service/jira/impl/JiraIssueServiceImpl.java
0 → 100644
View file @
de5a9cae
package
cn
.
qg
.
holmes
.
service
.
jira
.
impl
;
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.JiraRestClientFactory
;
import
com.atlassian.jira.rest.client.api.domain.Issue
;
import
com.atlassian.jira.rest.client.api.domain.SearchResult
;
import
com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory
;
import
io.atlassian.util.concurrent.Promise
;
import
org.springframework.stereotype.Service
;
import
java.net.URI
;
import
java.net.URISyntaxException
;
import
java.util.ArrayList
;
import
java.util.List
;
@Service
public
class
JiraIssueServiceImpl
implements
JiraIssueService
{
public
static
String
url
=
"http://jira2.quantgroup.cn/"
;
public
static
String
username
=
"test1"
;
public
static
String
password
=
"123456"
;
public
static
JiraRestClient
createJiraRestClient
()
{
JiraRestClientFactory
jiraRestClientFactory
=
new
AsynchronousJiraRestClientFactory
();
JiraRestClient
jiraRestClient
=
null
;
try
{
jiraRestClient
=
jiraRestClientFactory
.
createWithBasicHttpAuthentication
(
new
URI
(
url
),
username
,
password
);
}
catch
(
URISyntaxException
e
)
{
e
.
printStackTrace
();
}
return
jiraRestClient
;
}
/**
* 根据项目关键字获取未解决BUG列表
* @param project 项目关键字,如"YXM"
* @return
* @throws Exception
*/
@Override
public
Iterable
<
Issue
>
getUnsolvedIssueListByProject
(
String
project
)
throws
Exception
{
JiraRestClient
jiraRestClient
=
createJiraRestClient
();
Promise
<
SearchResult
>
resultPromise
=
jiraRestClient
.
getSearchClient
().
searchJql
(
"project = "
+
project
+
" AND resolution = Unresolved ORDER BY priority DESC"
);
Iterable
<
Issue
>
issues
=
resultPromise
.
get
().
getIssues
();
return
issues
;
}
}
src/main/java/cn/qg/holmes/task/jira/JiraToDingding.java
0 → 100644
View file @
de5a9cae
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
);
}
}
src/main/java/cn/qg/holmes/utils/DingdingUtils.java
View file @
de5a9cae
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"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment