Java操作jira工具类
需求:拉取并同步jira数据(项目,版本,缺陷,任务)
实现方式以及注意点:
1.jira中没有接口直接获取所有用户,但是可以获取组内用户,每个jira账户都会对应jira_user这个组,所以可以通过该组编码获取所有用户
2.jira中所有的任务,bug等都可以通过获取issue得到,只是类型不同。
3.需要注意的是如果在jira中有自定义字段,需要拿到返回值后查看,然后再对应去取。
4.jira获取出来的项目,需要在通过调用项目详情接口去拿详细信息
实现代码:
/**
* @author yangqidong
*/
@Component
@Slf4j
public class JiraUtil {
@Value("${jira.baseUrl}")
private String jiraUrl;
@Value("${jira.userName}")
private String userName;
@Value("${jira.password}")
private String password;
@Value("${jira.groupName}")
private String jiraGroup;
@Autowired
IJiraDicService jiraDicService;
/**
* 通过组获取jira所有用户
*
* @return
*/
public List<JiraUserVO> getJiraUserByGroup() {
//构建结果集
List<JiraUserVO> result = new ArrayList<>();
//封装http调用获取组内用户
HttpClient httpClient = HttpClients.createDefault();
String url = jiraUrl + "/rest/api/2/group/member?groupname=" + jiraGroup + "&maxResults=50";
HttpGet request = new HttpGet(url);
// 将用户名和密码进行 Base64 编码
String credentials = Base64.getEncoder().encodeToString((userName + ":" + password).getBytes());
request.addHeader("Authorization", "Basic " + credentials);
try {
HttpResponse response = httpClient.execute(request);
String jsonResponse = EntityUtils.toString(response.getEntity());
//转换结果集
JsonObject returnData = new JsonParser().parse(jsonResponse).getAsJsonObject();
//获取总数
Integer total = Integer.valueOf(returnData.get("total").toString());
//根据总数循环调用获取所有用户
for (int i = 0; i <= total / 50 + 1; i++) {
String queueUrl = String.format(url + "&startAt=%d", i * 50);
HttpGet queueRequest = new HttpGet(queueUrl);
queueRequest.addHeader("Authorization", "Basic " + credentials);
HttpResponse queueResponse = httpClient.execute(queueRequest);
String queueJsonResponse = EntityUtils.toString(queueResponse.getEntity());
//转换结果集
JsonObject queueReturnData = new JsonParser().parse(queueJsonResponse).getAsJsonObject();
JsonArray values = queueReturnData.getAsJsonArray("values");
for (JsonElement jsonElement : values) {
JsonObject item = jsonElement.getAsJsonObject();
String name = item.get("name").getAsString();
String key = item.get("key").getAsString();
String emailAdreess = item.get("emailAddress").getAsString();
JiraUserVO jiraUserVO = new JiraUserVO();
jiraUserVO.setUserName(name);
jiraUserVO.setKey(key);
jiraUserVO.setEmailAddress(emailAdreess);
result.add(jiraUserVO);
}
}
} catch (Exception e) {
throw new ServiceException(ERROR_CODE_40001, "jira数据获取异常");
}
return result;
}
/**
* 获取所有项目Id
*/
public List<String> getJiraProjectsId() {
//构建结果集
List<String> result = new ArrayList<>();
//封装http调用获取项目
HttpClient httpClient = HttpClients.createDefault();
//获取所有项目
String url = jiraUrl + "/rest/api/2/project";
HttpGet request = new HttpGet(url);
//将用户名和密码进行 Base64 编码
String credentials = Base64.getEncoder().encodeToString((userName + ":" + password).getBytes());
request.addHeader("Authorization", "Basic " + credentials);
try {
HttpResponse response = httpClient.execute(request);
String jsonResponse = EntityUtils.toString(response.getEntity());
//转换结果集
JsonArray returnData = new JsonParser().parse(jsonResponse).getAsJsonArray();
//遍历获取所有项目
for (JsonElement jsonElement : returnData) {
JsonObject item = jsonElement.getAsJsonObject();
String name = item.get("id").getAsString();
result.add(name);
}
} catch (Exception e) {
log.error("同步项目失败",e);
}
return result;
}
/**
* 获取单个项目对应版本
* List<String> projectIds
*/
public List<JiraProjectAO> getJiraProjectVersionsById(List<String> proIds) {
//构建结果集
List<JiraProjectAO> result = new ArrayList<>();
//封装http调用获取项目
HttpClient httpClient = HttpClients.createDefault();
for (String proId : proIds) {
//获取所有项目
String url = jiraUrl + "/rest/api/2/project/" + proId;
HttpGet request = new HttpGet(url);
//将用户名和密码进行 Base64 编码
String credentials = Base64.getEncoder().encodeToString((userName + ":" + password).getBytes());
request.addHeader("Authorization", "Basic " + credentials);
try {
HttpResponse response = httpClient.execute(request);
String jsonResponse = EntityUtils.toString(response.getEntity());
//转换结果集
JsonObject queueReturnData = new JsonParser().parse(jsonResponse).getAsJsonObject();
JsonArray values = queueReturnData.getAsJsonArray("versions");
//遍历版本
for (JsonElement jsonElement : values) {
JiraProjectAO jiraProjectAO = new JiraProjectAO();
//获取项目相关信息
String projectId = queueReturnData.getAsJsonPrimitive("id").getAsString();
String projectKey = queueReturnData.getAsJsonPrimitive("key").getAsString();
String projectName = queueReturnData.getAsJsonPrimitive("name").getAsString();
//获取项目负责人相关信息(暂不同步)
// JsonObject lead = queueReturnData.getAsJsonObject("lead");
// String leadKey = "";
// String leadName = "";
// if (ObjectUtils.isNotEmpty(lead)) {
// leadKey = ObjectUtils.isEmpty(lead.getAsJsonPrimitive("key")) ? "" : lead.getAsJsonPrimitive("key").getAsString();
// leadName = ObjectUtils.isEmpty(lead.getAsJsonPrimitive("displayName")) ? "" : lead.getAsJsonPrimitive("displayName").getAsString();
// }
//获取项目状态相关信息(暂不同步)
// JsonObject proCate = queueReturnData.getAsJsonObject("projectCategory");
// String proCateId = "";
// String proCateName = "";
//
// if (ObjectUtils.isNotEmpty(proCate)) {
// proCateId = ObjectUtils.isEmpty(proCate.getAsJsonPrimitive("id")) ? "" : proCate.getAsJsonPrimitive("id").getAsString();
// proCateName = ObjectUtils.isEmpty(proCate.getAsJsonPrimitive("name")) ? "" : proCate.getAsJsonPrimitive("name").getAsString();
// }
//获取版本相关信息
JsonObject item = jsonElement.getAsJsonObject();
String versionName = ObjectUtils.isEmpty(item.get("name")) ? "" : item.get("name").getAsString();
String versionId = ObjectUtils.isEmpty(item.get("id")) ? "" : item.get("id").getAsString();
String versionDesc = ObjectUtils.isEmpty(item.get("description")) ? "" : item.get("description").getAsString();
String startDate = ObjectUtils.isEmpty(item.get("startDate")) ? "" : item.get("startDate").getAsString();
String releaseDate = ObjectUtils.isEmpty(item.get("releaseDate")) ? "" : item.get("releaseDate").getAsString();
//获取版本状态
Boolean isArchived = ObjectUtils.isEmpty(item.get("archived")) ? false : item.get("archived").getAsBoolean();
Boolean isReleased = ObjectUtils.isEmpty(item.get("released")) ? false : item.get("released").getAsBoolean();
jiraProjectAO.setStatus("3");
if(isReleased){
jiraProjectAO.setStatus("2");
}
if(isArchived){
jiraProjectAO.setStatus("1");
}
jiraProjectAO.setId(projectId);
jiraProjectAO.setKey(projectKey);
jiraProjectAO.setName(projectName);
jiraProjectAO.setVersionDesc(versionDesc);
jiraProjectAO.setStartDate(startDate);
jiraProjectAO.setReleaseDate(releaseDate);
// jiraProjectAO.setLeadKey(leadKey);
// jiraProjectAO.setLeadName(leadName);
// jiraProjectAO.setProjectCategoryId(proCateId);
// jiraProjectAO.setProjectCategoryName(proCateName);
jiraProjectAO.setVersionName(versionName);
jiraProjectAO.setVersionId(versionId);
result.add(jiraProjectAO);
}
} catch (Exception e) {
log.error("同步项目失败",e);
}
}
return result;
}
/**
* 获取所有Bug
*/
public List<JiraIssueAO> getJiraIssues(String startTime) {
//获取字典表拿到point等jira属性id
List<JiraDic> jiraDics = jiraDicService.list();
//拿到字典中所有属性
JiraDic points = getByKey(jiraDics,Constants.POINTS);
JiraDic storyPoints = getByKey(jiraDics,Constants.STORY_POINTS);
JiraDic subtask = getByKey(jiraDics, Constants.ISSUE_TYPE_SUBTASK);
JiraDic story = getByKey(jiraDics, Constants.ISSUE_TYPE_STORY);
JiraDic storyBase = getByKey(jiraDics, Constants.ISSUE_TYPE_STORY_BASE);
JiraDic storyIncubate = getByKey(jiraDics, Constants.ISSUE_TYPE_STORY_INCUBATE);
JiraDic storyIncubateBase = getByKey(jiraDics, Constants.ISSUE_TYPE_STORY_INCUBATE_BASE);
JiraDic displayStep = getByKey(jiraDics, Constants.DISPLAY_STEP);
JiraDic defect = getByKey(jiraDics, Constants.ISSUE_TYPE_DEFECT);
JiraDic responsible = getByKey(jiraDics, Constants.RESPONSIBLE);
//拿到所有类型属性
List<JiraDic> issueTypeDic = jiraDics.stream().filter(e -> Constants.ISSUE_TYPE_DIC.equals(e.getType())).collect(Collectors.toList());
//构建结果集
List<JiraIssueAO> result = new ArrayList<>();
//封装http调用获取项目
HttpClient httpClient = HttpClients.createDefault();
String url = jiraUrl + "rest/api/2/search?jql=";
try {
//定义起止时间
String endTime = DateUtils.formatDateToSecond(new Date());
//url构造
String param = "issuetype is not empty and status != Closed AND updatedDate >= \"" + startTime + "\" AND updatedDate <= \"" + endTime + "\"";
url = url + URLEncoder.encode(param, "UTF-8");
url = url + "&maxResults=50";
HttpGet request = new HttpGet(url);
// 将用户名和密码进行 Base64 编码
String credentials = Base64.getEncoder().encodeToString((userName + ":" + password).getBytes());
request.addHeader("Authorization", "Basic " + credentials);
HttpResponse response = httpClient.execute(request);
String jsonResponse = EntityUtils.toString(response.getEntity());
//转换gson
Gson gson = new Gson();
IssueResponse issueResponse = gson.fromJson(jsonResponse, IssueResponse.class);
//获取总数量
int total = issueResponse.getTotal();
//根据总数循环调用获取所有用户
for (int i = 0; i <= total / 50 + 1; i++) {
int startAt = i * 50;
String queueUrl = url + "&startAt="+startAt;
HttpGet queueRequest = new HttpGet(queueUrl);
queueRequest.addHeader("Authorization", "Basic " + credentials);
HttpResponse queueResponse = httpClient.execute(queueRequest);
String queueJsonResponse = EntityUtils.toString(queueResponse.getEntity());
//转换结果集
IssueResponse queueIssueResponse = gson.fromJson(queueJsonResponse, IssueResponse.class);
JsonObject returnData = new JsonParser().parse(queueJsonResponse).getAsJsonObject();
List<Issue> issues = queueIssueResponse.getIssues();
//遍历当前issue
int index = 0;
for (Issue item : issues) {
//测试
if(item.getKey().equals("DTFCP-790")){
String a = "测试";
}
JiraIssueAO jiraIssueAO = new JiraIssueAO();
Fields fields = item.getFields();
if (ObjectUtils.isNotEmpty(fields)) {
//获取项目数据
Project project = fields.getProject();
if (ObjectUtils.isNotEmpty(project)) {
jiraIssueAO.setProjectId(project.getId());
jiraIssueAO.setProjectName(project.getName());
}
//获取类型信息
IssueType issueType = fields.getIssuetype();
if (ObjectUtils.isNotEmpty(issueType)) {
for (JiraDic unit : issueTypeDic) {
jiraIssueAO.setIssueTypeId(issueType.getId());
if (unit.getJiraId().equals(issueType.getId())) {
jiraIssueAO.setIssueTypeCode(unit.getCode());
}
}
}
//获取issue本身信息
jiraIssueAO.setIssueId(item.getId());
jiraIssueAO.setIssueName(item.getKey());
//设置issue父issue
IssueParent issueParent = fields.getParent();
if (ObjectUtils.isNotEmpty(issueParent)) {
jiraIssueAO.setParentIssueKey(issueParent.getKey());
}
//获取p值(类型为子任务或者故事)
String p = "0.0";
JsonArray issueJsonArray = returnData.getAsJsonArray("issues");
JsonElement issueJsonElement = issueJsonArray.get(index);
JsonObject fieldObject = issueJsonElement.getAsJsonObject().getAsJsonObject("fields");
if (subtask.getJiraId().equals(issueType.getId())) {
JsonElement jsonElement = fieldObject.get(points.getJiraId());
if (!jsonElement.isJsonNull()) {
p = jsonElement.getAsString();
}
jiraIssueAO.setPoints(new BigDecimal(p));
//获取任务修复版本信息
List<FixVersion> versions = fields.getFixVersions();
if (ObjectUtils.isNotEmpty(versions)) {
FixVersion fixVersion = versions.get(0);
jiraIssueAO.setProjectVersionName(fixVersion.getName());
jiraIssueAO.setProjectVersionId(fixVersion.getId());
}
}
//如果类型为故事类型
if (storyIncubateBase.getJiraId().equals(issueType.getId())||story.getJiraId().equals(issueType.getId())||storyBase.getJiraId().equals(issueType.getId())||storyIncubate.getJiraId().equals(issueType.getId())) {
JsonElement jsonElement = fieldObject.get(storyPoints.getJiraId());
if (ObjectUtils.isNotEmpty(jsonElement)&&!jsonElement.isJsonNull()) {
p = jsonElement.getAsString();
}
jiraIssueAO.setPoints(new BigDecimal(p));
//获取任务修复版本信息
List<FixVersion> versions = fields.getFixVersions();
if (ObjectUtils.isNotEmpty(versions)) {
FixVersion fixVersion = versions.get(0);
jiraIssueAO.setProjectVersionName(fixVersion.getName());
jiraIssueAO.setProjectVersionId(fixVersion.getId());
}
}
//获取缺陷发现阶段和责任人
if (defect.getJiraId().equals(issueType.getId())) {
JsonElement jsonElement = fieldObject.get(displayStep.getJiraId());
if (!jsonElement.isJsonNull()) {
JsonObject step = jsonElement.getAsJsonObject();
JsonElement valueJsonElement = step.get("value");
if (!valueJsonElement.isJsonNull()) {
jiraIssueAO.setDisplayStepName(valueJsonElement.getAsString());
}
}
//获取责任人
JsonElement responsibleJsonElement = fieldObject.get(responsible.getJiraId());
if(!responsibleJsonElement.isJsonNull()){
JsonArray responsibleJsonArray = responsibleJsonElement.getAsJsonArray();
List<String> responsibleKeys = new ArrayList<>();
for (JsonElement unit : responsibleJsonArray) {
JsonObject responsibleObj = unit.getAsJsonObject();
String responsibleKey = ObjectUtils.isEmpty(responsibleObj.get("key")) ? "" : responsibleObj.get("key").getAsString();
responsibleKeys.add(responsibleKey);
}
jiraIssueAO.setResponsible(responsibleKeys);
}
//获取缺陷影响版本信息
List<FixVersion> versions = fields.getVersions();
if (ObjectUtils.isNotEmpty(versions)) {
FixVersion fixVersion = versions.get(0);
jiraIssueAO.setProjectVersionName(fixVersion.getName());
jiraIssueAO.setProjectVersionId(fixVersion.getId());
}
}
//设置问题创建人
Reporter reporter = fields.getReporter();
if (ObjectUtils.isNotEmpty(reporter)) {
jiraIssueAO.setJiraCreateKey(reporter.getKey());
}
Assignee assignee = fields.getAssignee();
if (ObjectUtils.isNotEmpty(assignee)) {
jiraIssueAO.setJiraAssigneeKey(assignee.getKey());
}
//设置任务创建时间更新时间
jiraIssueAO.setCreated(fields.getCreated());
jiraIssueAO.setUpdated(fields.getUpdated());
//任务状态
Status status = fields.getStatus();
if (ObjectUtils.isNotEmpty(status)) {
StatusCategory statusCategory = status.getStatusCategory();
if (ObjectUtils.isNotEmpty(statusCategory)) {
jiraIssueAO.setStatusKey(statusCategory.getKey());
jiraIssueAO.setStatusName(statusCategory.getName());
}
}
result.add(jiraIssueAO);
index++;
}
}
}
} catch (Exception e) {
log.error("同步失败", e);
}
return result;
}
private JiraDic getByKey(List<JiraDic> jiraDics,String key) {
return jiraDics.stream().filter(e -> key.equals(e.getCode())).findFirst().get();
}
}
原文地址:https://blog.csdn.net/ccy1995414/article/details/137869450
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!