还不了解Jira是什么的同学可以看一下这篇文章:https://www.cnblogs.com/wgblog-code/p/11750767.html
本篇文章主要介绍如何使用Java操作Jira,包括获取连接,创建、修改、删除工单信息
1、获取Jira连接并执行请求:
/** * 执行shell脚本 * * @param command * @return * @throws IOException */ private static String executeShell(String command) throws IOException { StringBuffer result = new StringBuffer(); Process process = null; InputStream is = null; BufferedReader br = null; String line = null; try { //windows平台下用cmd发生请求 if (osname.indexOf("windows") >= 0) { process = new ProcessBuilder("cmd.exe", "/c", command).start(); System.out.println("cmd.exe /c " + command); //安装Cygwin,使windows可以执行linux命令 } else { //linux平台下执行请求 process = new ProcessBuilder("/bin/sh", "-c", command).start(); System.out.println("/bin/sh -c " + command); } is = process.getInputStream(); br = new BufferedReader(new InputStreamReader(is, "UTF-8")); while ((line = br.readLine()) != null) { System.out.println(line); result.append(line); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { //关闭连接 br.close(); process.destroy(); is.close(); } //返回结果 return result.toString(); }
2、获取获得工单信息:
/** * 活动工单信息 * * @param issueKey * 工单key * @return * @throws IOException */ public static String getIssue(String issueKey) throws IOException { /** * jira的请求格式: * curl -u 用户名:密码 -X 请求类型 --data @文件的路径 -H "Content-Type: application/json" 请求路径 * * 官方示例:curl -u admin:admin -X POST --data @data.txt -H "Content-Type: application/json" http://localhost:8080/jira/rest/api/2/issue/ * * 注意:--data后面的 @符合一定不能少 */ String command = "curl -D- -u " + user + ":" + pwd + " -X GET -H "Content-Type: application/json" "" + uri + "/rest/api/2/issue/" + issueKey + """; String issueSt = executeShell(command); return issueSt; }
3、创建工单信息:
/** * 创建工单 * * @param projectKey * 项目key * @param issueType * 工单类型 name * @param description * 工单描述 * @param summary * 工单主题 // * @param assignee * 工单负责人 * * @return * @throws IOException */ public static String createIssue(String projectKey, String issueType,String user, String description, String summary) throws IOException { String command="curl -D- -u " + user + ":" + pwd + " -X POST --data @E:\data.json -H "Content-Type: application/json" "" + uri + "/rest/api/2/issue/""; String issueSt = executeShell(command); if (!issueSt.contains("errorMessages")) { System.out.println("success"); }else { System.out.println("error"); } return issueSt; }
这里创建工单信息的文件我存放在了我电脑E盘根目录下面,名字为data.json
data.json的内容如下
{ "fields": { "summary": "test008", "issuetype": { "name": "Task" }, "project": { "key": "MIN" }, "description": "测试008", "assignee": { "name": "jwg" } } }
- summary:工单主题
- issuetype:问题类型,问题类型是jira项目中存在的类型
- project:工单所属项目,工单所属项目是Jira中已经创建的项目
- description:工单描述,一些描述信息
- assignee:工单负责人,这个工单的负责人是谁
注意:data.json格式必须为json格式
4、更新工单信息:
/** * 更新工单 * * @param issueKey * 工单key * @param map * 工单参数map,key为参数名称,value为参数值,参数值必须自带双引号 比如: map.put("assignee", * "{"name":"username"}"); map.put("summary", * ""summary00002""); * @return * @throws IOException */ public static String editIssue(String issueKey, Map<String, String> map) throws IOException { StringBuffer fieldsB = new StringBuffer(); for (Map.Entry<String, String> entry : map.entrySet()) { fieldsB.append(""").append(entry.getKey()).append("":") .append(entry.getValue()).append(","); } String fields = fieldsB.toString(); fields = fields.substring(0, fields.length() - 1); String command = "curl -D- -u " + user + ":" + pwd + " -X PUT --data '{"fields": { " + fields + "}}' -H "Content-Type: application/json" "" + uri + "/rest/api/2/issue/" + issueKey + """; String issueSt = executeShell(command); return issueSt; }
5、查询工单信息:
/** * 查询工单 * @param jql * assignee=username * assignee=username&startAt=2&maxResults=2 * assignee=username+order+by+duedate * project=projectKey+order+by+duedate&fields=id,key * @return * @throws IOException */ public static String searchIssues(String jql) throws IOException{ String command = "curl -D- -u " + user + ":" + pwd + " -X GET -H "Content-Type: application/json" "" + uri + "/rest/api/2/search?jql=" + jql + """; String issueSt = executeShell(command); return issueSt; }
6、为工单增加注释:
/** * 为工单增加注释说明 * @param issueKey 工单key * */ public static String addComments(String issueKey,String comments) throws IOException{ String command = "curl -D- -u " + user + ":" + pwd + " -X PUT --data '{"update": { "comment": [ { "add": { "body":""+comments+"" } } ] }}' -H "Content-Type: application/json" "" + uri + "/rest/api/2/issue/" + issueKey + """; String issueSt = executeShell(command); return issueSt; }
7、删除工单:
/** * 删除工单 * @param issueKey 工单key * @return * @throws IOException */ public static String deleteIssueByKey(String issueKey) throws IOException{ String command = "curl -D- -u " + user + ":" + pwd + " -X DELETE -H "Content-Type: application/json" "" + uri + "/rest/api/2/issue/" + issueKey + """; String issueSt = executeShell(command); return issueSt; }
8、上传附件:
/** * 上传附件 * @param issueKey 工单key * @param filepath 文件路径 * @return * @throws IOException */ public static String addAttachment(String issueKey,String filepath) throws IOException{ String command = "curl -D- -u " + user + ":" + pwd + " -X POST -H "X-Atlassian-Token: nocheck" -F "file=@"+filepath+"" "" + uri + "/rest/api/2/issue/" + issueKey + "/attachments""; String issueSt = executeShell(command); return issueSt; }
项目的完整代码如下:
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.util.Map; 6 7 /** 8 * JIRA REST API 工具类 9 * https://developer.atlassian.com/jiradev/jira-apis/jira-rest-apis/jira-rest-api-tutorials 10 * https://docs.atlassian.com/jira/REST/7.0-SNAPSHOT/ 11 * @author 用代码征服天下 12 * 13 */ 14 public class JiraTest { 15 16 public static void main(String[] args) throws IOException { 17 // TODO Auto-generated method stub 18 //获取工单信息,参数为问题名称 19 JiraAPIUtil.getIssue("OAM-5402"); 20 21 JiraAPIUtil.createIssue("MIN", "Task", "jwg", "工单描述","工单主题"); 22 // 23 // Map<String,String> map = new HashMap<String,String>(); 24 // map.put("assignee", "{"name":"username"}"); 25 // map.put("summary", ""summary00002""); 26 // JiraAPIUtil.editIssue("MIN-1", map); 27 28 JiraAPIUtil.searchIssues("assignee=username"); 29 System.out.println("*****************************"); 30 JiraAPIUtil.searchIssues("assignee=username+order+by+duedate"); 31 System.out.println("*****************************"); 32 33 JiraAPIUtil.addComments("MIN-1", "123456哈哈哈哈"); 34 JiraAPIUtil.deleteIssueByKey("NQCP-38"); 35 JiraAPIUtil.addAttachment("NQCP-39", "d://myfile01.json"); //linux路径: /home/boss/myfile.txt 36 JiraAPIUtil.addComments("createmeta", "123456哈哈哈哈"); 37 } 38 39 static String uri = "http://localhost:8080"; //Jira服务器地址 40 static String user = "jwg";//Jira用户名 41 static String pwd = "jwg123456";//Jira密码 42 static String osname = System.getProperty("os.name").toLowerCase(); //获取操作系统名称 43 44 /** 45 * 执行shell脚本 46 * 47 * @param command 48 * @return 49 * @throws IOException 50 */ 51 private static String executeShell(String command) throws IOException { 52 StringBuffer result = new StringBuffer(); 53 Process process = null; 54 InputStream is = null; 55 BufferedReader br = null; 56 String line = null; 57 try { 58 //windows平台下用cmd发生请求 59 if (osname.indexOf("windows") >= 0) { 60 process = new ProcessBuilder("cmd.exe", "/c", command).start(); 61 System.out.println("cmd.exe /c " + command); //安装Cygwin,使windows可以执行linux命令 62 } else { 63 //linux平台下执行请求 64 process = new ProcessBuilder("/bin/sh", "-c", command).start(); 65 System.out.println("/bin/sh -c " + command); 66 } 67 68 is = process.getInputStream(); 69 br = new BufferedReader(new InputStreamReader(is, "UTF-8")); 70 71 while ((line = br.readLine()) != null) { 72 System.out.println(line); 73 result.append(line); 74 } 75 76 } catch (Exception e) { 77 // TODO Auto-generated catch block 78 e.printStackTrace(); 79 } finally { 80 //关闭连接 81 br.close(); 82 process.destroy(); 83 is.close(); 84 } 85 86 //返回结果 87 return result.toString(); 88 } 89 90 /** 91 * 活动工单信息 92 * 93 * @param issueKey 94 * 工单key 95 * @return 96 * @throws IOException 97 */ 98 public static String getIssue(String issueKey) throws IOException { 99 100 /** 101 * jira的请求格式: 102 * curl -u 用户名:密码 -X 请求类型 --data @文件的路径 -H "Content-Type: application/json" 请求路径 103 * 104 * 官方示例:curl -u admin:admin -X POST --data @data.txt -H "Content-Type: application/json" http://localhost:8080/jira/rest/api/2/issue/ 105 * 106 * 注意:--data后面的 @符合一定不能少 107 */ 108 109 String command = "curl -D- -u " + user + ":" + pwd 110 + " -X GET -H "Content-Type: application/json" "" + uri 111 + "/rest/api/2/issue/" + issueKey + """; 112 113 String issueSt = executeShell(command); 114 115 return issueSt; 116 117 } 118 119 /** 120 * 创建工单 121 * 122 * @param projectKey 123 * 项目key 124 * @param issueType 125 * 工单类型 name 126 * @param description 127 * 工单描述 128 * @param summary 129 * 工单主题 130 // * @param assignee 131 * 工单负责人 132 * 工单参数map,key为参数名称,value为参数值,参数值必须自带双引号 比如: map.put("assignee", 133 * "{"name":"username"}"); map.put("summary", 134 * ""summary00002""); 135 * @return 136 * @throws IOException 137 */ 138 public static String createIssue(String projectKey, String issueType,String user, 139 String description, String summary) throws IOException { 140 141 String command="curl -D- -u " + user + ":" + pwd 142 + " -X POST --data @E:\data.json -H "Content-Type: application/json" "" + uri 143 + "/rest/api/2/issue/""; 144 145 String issueSt = executeShell(command); 146 147 if (!issueSt.contains("errorMessages")) { 148 System.out.println("success"); 149 }else { 150 System.out.println("error"); 151 } 152 return issueSt; 153 } 154 155 156 157 158 159 160 /** 161 * 更新工单 162 * 163 * @param issueKey 164 * 工单key 165 * @param map 166 * 工单参数map,key为参数名称,value为参数值,参数值必须自带双引号 比如: map.put("assignee", 167 * "{"name":"username"}"); map.put("summary", 168 * ""summary00002""); 169 * @return 170 * @throws IOException 171 */ 172 public static String editIssue(String issueKey, Map<String, String> map) 173 throws IOException { 174 175 StringBuffer fieldsB = new StringBuffer(); 176 for (Map.Entry<String, String> entry : map.entrySet()) { 177 fieldsB.append(""").append(entry.getKey()).append("":") 178 .append(entry.getValue()).append(","); 179 } 180 String fields = fieldsB.toString(); 181 fields = fields.substring(0, fields.length() - 1); 182 183 String command = "curl -D- -u " + user + ":" + pwd 184 + " -X PUT --data '{"fields": { " + fields 185 + "}}' -H "Content-Type: application/json" "" + uri 186 + "/rest/api/2/issue/" + issueKey + """; 187 188 String issueSt = executeShell(command); 189 190 return issueSt; 191 } 192 193 194 195 /** 196 * 查询工单 197 * @param jql 198 * assignee=username 199 * assignee=username&startAt=2&maxResults=2 200 * assignee=username+order+by+duedate 201 * project=projectKey+order+by+duedate&fields=id,key 202 * @return 203 * @throws IOException 204 */ 205 public static String searchIssues(String jql) throws IOException{ 206 String command = "curl -D- -u " + user + ":" + pwd 207 + " -X GET -H "Content-Type: application/json" "" + uri 208 + "/rest/api/2/search?jql=" + jql + """; 209 210 String issueSt = executeShell(command); 211 212 return issueSt; 213 } 214 215 216 /** 217 * 为工单增加注释说明 218 * @param issueKey 工单key 219 220 * 221 */ 222 public static String addComments(String issueKey,String comments) throws IOException{ 223 String command = "curl -D- -u " + user + ":" + pwd 224 + " -X PUT --data '{"update": { "comment": [ { "add": { "body":""+comments+"" } } ] }}' -H "Content-Type: application/json" "" + uri 225 + "/rest/api/2/issue/" + issueKey + """; 226 227 String issueSt = executeShell(command); 228 229 return issueSt; 230 } 231 232 233 /** 234 * 删除工单 235 * @param issueKey 工单key 236 * @return 237 * @throws IOException 238 */ 239 public static String deleteIssueByKey(String issueKey) throws IOException{ 240 String command = "curl -D- -u " + user + ":" + pwd 241 + " -X DELETE -H "Content-Type: application/json" "" + uri 242 + "/rest/api/2/issue/" + issueKey + """; 243 244 String issueSt = executeShell(command); 245 246 return issueSt; 247 } 248 249 250 /** 251 * 上传附件 252 * @param issueKey 工单key 253 * @param filepath 文件路径 254 * @return 255 * @throws IOException 256 */ 257 public static String addAttachment(String issueKey,String filepath) throws IOException{ 258 String command = "curl -D- -u " + user + ":" + pwd 259 + " -X POST -H "X-Atlassian-Token: nocheck" -F "file=@"+filepath+"" "" + uri 260 + "/rest/api/2/issue/" + issueKey + "/attachments""; 261 262 String issueSt = executeShell(command); 263 264 return issueSt; 265 } 266 267 }