Java——Java连接Jira,创建、修改、删除工单信息
还不了解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 }
身体和灵魂都要在路上

浙公网安备 33010602011771号