java获取jira数据,由于本人只需要统计数量即可,不需要更详细的内容,所以借助了“天外归云”的JIRA REST java client API实际应用一些想法,做了些许的扩展,希望对正在做统计的小伙伴给与些思路。这是“天外归云”的博客地址[https://www.cnblogs.com/LanTianYou/p/6591808.html]。
1.jira所需jar
<!--jira获取需要jar引入-->
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>jira-rest-java-client</artifactId>
<version>0.5-m6</version>
</dependency>
<dependency>
<groupId>com.atlassian.util.concurrent</groupId>
<artifactId>atlassian-util-concurrent</artifactId>
<version>3.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.sharegov/mjson -->
<dependency>
<groupId>org.sharegov</groupId>
<artifactId>mjson</artifactId>
<version>1.4.1</version>
</dependency>
<!--jira获取需要jar完毕-->
2.jira项目的key,和问题数量模型
package com.zkr.cxhjcxt.model;
import lombok.Data;
/**
* Created by youzongxu on 2018/9/11.
*/
@Data
public class JiraData extends BaseEntity<Long>{
private static final long serialVersionUID = -2268683738774849653L;
private String jiraKey;
private Integer jiraSum;
}
3.后台存储的jira项目需求类型和key值模型
package com.zkr.cxhjcxt.model;
import lombok.Data;
/**
* Created by youzongxu on 2018/9/12.
*/
@Data
public class JiraDateAuxiliaryOne extends BaseEntity<Long>{
private static final long serialVersionUID = -7976421250121953311L;
private String jiraName;
private Integer jiraSum;
}
4.后台存储的jira状态名称和key值模型
package com.zkr.cxhjcxt.model;
import lombok.Data;
/**
* Created by youzongxu on 2018/9/12.
*/
@Data
public class JiraDateAuxiliaryTwo extends BaseEntity<Long>{
private static final long serialVersionUID = 387620730536090206L;
private String jiraName;
private Integer jiraSum;
}
5.这里是我自己的逻辑处理,结合下面jira的工具类获取,需要改成自己实际应用场景。
package com.zkr.cxhjcxt.utils;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.zkr.cxhjcxt.dao.DataConfigurationDao;
import com.zkr.cxhjcxt.dict.DictConstants;
import com.zkr.cxhjcxt.model.*;
import com.zkr.cxhjcxt.service.JiraDataService;
import com.zkr.cxhjcxt.timedutils.jirautil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Created by youzongxu on 2018/9/12.
*/
@Slf4j
public class JiraUtil {
public void JiraUtil(){
//获取1:请求路径2:账号3:密码
DataConfigurationDao dataConfigurationDao = SpringUtil.getBean(DataConfigurationDao.class);
DataConfiguration jiraget = dataConfigurationDao.svnget(DictConstants.jira_DICT);
if(null != jiraget){
jirautil jirautil = new jirautil(jiraget.getDataUsername(),jiraget.getDataPassword(),jiraget.getDataUrl());
ArrayList<String> allProjects = jirautil.getAllProjects();
if(!CollectionUtils.isEmpty(allProjects)){
//1.存储jiradata
JiraDataService jiraDataService = SpringUtil.getBean(JiraDataService.class);
List<JiraData> list = new ArrayList<>();
for (String k:allProjects) {
JiraData jiraData = new JiraData();
log.info("k:{}"+k);
String jql = "project = "+k+" ORDER BY created DESC";
Integer jirasum = jirautil.search_jql(jql);
log.info("jirasum===================="+jirasum);
jiraData.setJiraKey(k);
jiraData.setJiraSum(jirasum);
list.add(jiraData);
}
//入库
jiraDataService.saveList(list);
//2.获取到相应的需求类型
List<JiraDem> jiraDems = jiraDataService.listAll();
log.info("jiraDems"+jiraDems);
if(!CollectionUtils.isEmpty(jiraDems)){
List<JiraDateAuxiliaryOne> jiraDateAuxiliaryOnes = new ArrayList<>();
for (JiraDem ls:jiraDems) {
JiraDateAuxiliaryOne jiraDateAuxiliaryOne = new JiraDateAuxiliaryOne();
//父级数据
jiraDateAuxiliaryOne.setJiraName(ls.getJiraName());
List<String> integerList = Lists.newArrayList();
if(StringUtils.isNotBlank(ls.getJiraKey())){
integerList.add(str(ls.getJiraKey()));
}
if(!CollectionUtils.isEmpty(ls.getChild())){//子级
List<JiraDem> child = ls.getChild();
for (JiraDem ch:child){
if(StringUtils.isNotBlank(ch.getJiraKey())){
integerList.add(str(ch.getJiraKey()));
}
}
}
log.info("integerList"+integerList);
String join = Joiner.on(",").join(integerList);
try {
String jql = "issueType in("+join+") ORDER BY created DESC";
log.info("jql{}"+jql);
Integer jirasum = jirautil.search_jql(jql);
jiraDateAuxiliaryOne.setJiraSum((null==jirasum)?0:jirasum);
jiraDateAuxiliaryOnes.add(jiraDateAuxiliaryOne);
} catch (Exception e) {
log.info("请核实需求字段"+integerList);
}
}
log.info("jiraDateAuxiliaryOnes"+jiraDateAuxiliaryOnes);
//入库
jiraDataService.saveDateAuxiliaryOneList(jiraDateAuxiliaryOnes);
}
//3.bug缺陷
List<JiraBug> jiraBugs = jiraDataService.listAllBug();
log.info("jiraBugs"+jiraBugs);
if(!CollectionUtils.isEmpty(jiraBugs)){
List<JiraDateAuxiliaryTwo> jiraDateAuxiliaryTwos = Lists.newArrayList();
for (JiraBug ls:jiraBugs){
JiraDateAuxiliaryTwo jiraDateAuxiliaryTwo = new JiraDateAuxiliaryTwo();
try {
String jql = "status in("+str(ls.getJiraKey())+") ORDER BY created DESC";
log.info("jql{}"+jql);
Integer jirasum = jirautil.search_jql(jql);
jiraDateAuxiliaryTwo.setJiraName(ls.getJiraName());
jiraDateAuxiliaryTwo.setJiraSum((null==jirasum)?0:jirasum);
jiraDateAuxiliaryTwos.add(jiraDateAuxiliaryTwo);
} catch (Exception e) {
log.info("请核实缺陷字段"+ls.getJiraKey());
}
}
log.info("jiraDateAuxiliaryTwos"+jiraDateAuxiliaryTwos);
//入库
jiraDataService.saveDateAuxiliaryTwoList(jiraDateAuxiliaryTwos);
}
}
}
}
public String str(String str){
boolean b = StringUtils.containsAny(str, " ");// true
if(b){
str = "\""+str+"\"";
}
return str;
}
}
6.jira的工具类
package com.zkr.cxhjcxt.timedutils;
import com.atlassian.jira.rest.client.JiraRestClient;
import com.atlassian.jira.rest.client.NullProgressMonitor;
import com.atlassian.jira.rest.client.domain.BasicIssue;
import com.atlassian.jira.rest.client.domain.BasicProject;
import com.atlassian.jira.rest.client.domain.SearchResult;
import com.atlassian.jira.rest.client.internal.jersey.JerseyJiraRestClientFactory;
import lombok.extern.slf4j.Slf4j;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Created by youzongxu on 2018/9/11.
*/
@Slf4j
public class jirautil {
private String userName = "";
private String password = "";
private String urlString = "";
public jirautil(String u,String p,String url) {
userName = u;
password = p;
urlString = url;
}
public JiraRestClient login_jira(String username, String password){
try {
final JerseyJiraRestClientFactory factory = new JerseyJiraRestClientFactory();
final URI jiraServerUri = new URI(urlString);
final JiraRestClient restClient = factory.createWithBasicHttpAuthentication(jiraServerUri, username,
password);
return restClient;
} catch (Exception e) {
log.info("登陆jira校验失败!");
e.printStackTrace();
}
return null;
}
// 得到所有项目信息
public ArrayList<String> getAllProjects(){
final JiraRestClient restClient = login_jira(userName, password);
final NullProgressMonitor pm = new NullProgressMonitor();
Iterable<BasicProject> allProjects = restClient
.getProjectClient().getAllProjects(pm);
Iterator<BasicProject> iterator = allProjects.iterator();
ArrayList<String> issueKeys = new ArrayList<>();
//获取项目所有key
while (iterator.hasNext()){
String key = iterator.next().getKey();
log.info("key:{}"+key);
issueKeys.add(key);
}
return issueKeys;
}
/**
* 通过jql语句进行查询并返回一个包含issue的key的数组
* @param jql
* @return
* @throws URISyntaxException
*/
public Integer search_jql(String jql){
final JiraRestClient restClient = login_jira(userName, password);
final NullProgressMonitor pm = new NullProgressMonitor();
SearchResult searchResult = restClient.getSearchClient().searchJql(jql, pm);
log.info("Get the total value :"+searchResult.getTotal());
return searchResult.getTotal();
}
}