Java操作jira工具类

需求:拉取并同步jira数据(项目,版本,缺陷,任务)

实现方式以及注意点:

1.jira中没有接口直接获取所有用户,但是可以获取组内用户,每个jira账户都会对应jira_user这个组,所以可以通过该组编码获取所有用户

2.jira中所有的任务,bug等都可以通过获取issue得到,只是类型不同。

3.需要注意的是如果在jira中有自定义字段,需要拿到返回值后查看,然后再对应去取。

4.jira获取出来的项目,需要在通过调用项目详情接口去拿详细信息

实现代码:

/*** @author yangqidong*/@Component@Slf4jpublic 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;@AutowiredIJiraDicService 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属性idList<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());//转换gsonGson 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();//遍历当前issueint 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父issueIssueParent 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();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ViewFlipper飞掠视图

手机屏幕尺寸不大&#xff0c;为了在有限空间中展示尽可能多的信息&#xff0c;Android设计了多种方式显示超出屏幕尺寸的界面&#xff0c;包括上下滚动、左右滑动等。飞掠视图ViewFlipper的层次翻动就是其中一项技术。两者都是一系列类似视图的组合&#xff0c;与ViewPager(翻…

Linux华硕笔记本安装ROG Asusctl

基础环境 适用系统&#xff1a; linux mint 21ubuntu 22.04 安装版本&#xff1a; asusctl-5.0.10rust 1.77.2 构建 安装编译环境 sudo apt-get update sudo apt-get install -y \libasound2-dev \libfreetype6-dev \libexpat1-dev \libxcb-composite0-dev \libssl-dev …

数字谐振器设计

数字谐振器设计 电路里的谐振:当电路中激励的频率等于电路的固有频率时&#xff0c;电路电磁振荡的振幅也将达到峰值。 形式一 形式二 例子

4.21java聊天室项目小结

基本完成了用户的登录注册功能&#xff0c;可以实现用户账号登录和邮箱登录功能&#xff0c;忘记密码通过邮箱发送验证码找回&#xff0c;注册账号功能&#xff0c;并传递给客户端更新数据库的表内容 注册功能&#xff1a; 注册成功后密码进行MD5加密并通过服务器保存到数据库…

springboot结合elasticJob

先说一说什么是elasticJob。 ElasticJob是一个分布式任务调度的解决方案&#xff0c;它由俩个相互独立的子项目Elastic-job-lite和Elastic- job-cloud组成。 任务调度&#xff1a;是指系统为了自动完成特定任务&#xff0c;在任务的特定时刻去执行任务的过程。 分布式&#xf…

内存泄露和内存溢出,有何区别,如何预防和解决

内存泄露和内存溢出是什么意思 内存泄露和内存溢出是两种不同的计算机程序运行时可能遇到的问题&#xff0c;它们的发生、表现和影响各不相同&#xff1a; 内存泄漏&#xff08;Memory Leak&#xff09;。内存泄漏是指程序在分配了内存之后&#xff0c;无法释放这些内存空间的…

剑指offer剪绳子;leetcode:LCR 131. 砍竹子 I

现需要将一根长为正整数 bamboo_len 的竹子砍为若干段&#xff0c;每段长度均为正整数。请返回每段竹子长度的最大乘积是多少。 示例 1&#xff1a; 输入: bamboo_len 12 输出: 81提示&#xff1a; 2 < bamboo_len < 58 注意&#xff1a;本题与主站 343 题相同&#…

SQLite导出数据库至sql文件

SQLite是一款实现了自包含、无服务器、零配置、事务性SQL数据库引擎的软件库。SQLite是世界上部署最广泛的SQL数据库引擎。 SQLite 是非常小的&#xff0c;是轻量级的&#xff0c;完全配置时小于 400KiB&#xff0c;省略可选功能配置时小于250KiB。 SQLite 源代码不受版权限制。…

Ubuntu 20.04.06 PCL C++学习记录(二十六)

[TOC]PCL中点云配准模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16&#xff0c;可用点云下载地址 学习内容 在代码中使用ICP迭代最近点算法&#xff0c;程序随机…

2024上海(国际)智慧氧舱暨生物细胞博览会

2024上海(国际)智慧氧舱暨生物细胞博览会 时间 2024年9月21日-23日 地址 上海市浦东新区张江科学会堂 展会亮点 展示国内外医疗器械行业最新发展动态&#xff0c;探讨医疗器械行业发展趋势促进医疗 器械行业健康发展将为全国从事微高压氧舱、医用气调库及其他医用设备、医…

二极管分类及用途

二极管分类及用途 通用开关二极管 特点&#xff1a;电流小&#xff0c;工作频率高 选型依据&#xff1a;正向电流、正向压降、功耗&#xff0c;反向最大电压&#xff0c;反向恢复时间&#xff0c;封装等 类型&#xff1a;BAS316 ; IN4148WS 应用电路: 说明&#xff1a;应用…

【Linux】引导过程与服务控制

目录 一、Linux操作系统引导过程 1.linux开机引导过程 2.系统初始化进程 1.init进程 2.进程启动方式 二、运行级别和Systemd单元类型 1.运行级别 2.Systemd 三、启动类故障恢复 1.修复MBR扇区故障 2.修复GRUB引导故障 3.root密码忘记的修改方式 四、系统服务控制 …

MATLAB求和函数

语法 S sum(A) S sum(A,“all”) S sum(A,dim) S sum(A,vecdim) S sum(,outtype) S sum(,nanflag) 说明 示例 S sum(A) 返回沿大小大于 1 的第一个数组维度计算的元素之和。 如果 A 是向量&#xff0c;则 sum(A) 返回元素之和。 如果 A 是矩阵&#xff0c;则 sum(A) 将…

配置静态路由实现全网互通

1、实验环境 如图下所示&#xff0c;三台路由器R1&#xff0e;R2&#xff0c;R3两两互连&#xff0c;每台路由器上都配置了Loopback地址模拟网络环境。 2、需求描述 需要在三台路由器上配置静态路由&#xff0c;以实现各网段之间的互通。 若要实现全网互通,必须明确如下两个问…

UI5 快速入门教程

环境准备 node >16.8 ,VSCode&#xff0c;官方网址 开始 创建一个根文件夹&#xff0c;根文件中创建一个package.json文件 {"name": "quickstart-tutorial","private": true,"version": "1.0.0","author":…

【JavaWeb】Day51.Mybatis动态SQL

什么是动态SQL 在页面原型中&#xff0c;列表上方的条件是动态的&#xff0c;是可以不传递的&#xff0c;也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中&#xff0c;我们会看到&#xff0c;我们将三个条件直接写死了。 如果页面只传递了参数姓名name 字…

flutter 实现表单的封装包含下拉框和输入框

一、表单封装组件实现效果 //表单组件 Widget buildFormWidget(List<InputModel> formList,{required GlobalKey<FormState> formKey}) {return Form(key: formKey,child: Column(children: formList.map((item) {return Column(crossAxisAlignment: CrossAxisAlig…

java优先级队列(堆)详解

一、优先级概念 什么是优先级&#xff1a;比如女士优先&#xff0c;个子低的优先排到前面去&#xff0c;有一部分数据具备优先级&#xff0c;要以优先级的顺序将顺序存储起来。 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#…

Java:String类

目录 1.String类的重要性2.String对象的比较2.1 比较是否引用同一个对象2.2 boolean equals(Object anObject) 方法&#xff1a;按照字典序比较2.3int compareTo(String s)方法: 按照字典序进行比较2.4 boolean equalsIgnoreCase(Object anObject)方法&#xff1a;忽略大小写的…

word批量修改表格样式

利用宏&#xff0c;批量选中表格&#xff0c;然后利用段落和表设计来操作。 利用宏&#xff0c;批量选中表格&#xff0c;参考百度安全验证段落&#xff0c;表格里面的内容有空格&#xff0c;应该是有缩进&#xff0c;在段落中去掉缩进&#xff0c;即缩进-特殊&#xff0c;选择…