还不了解Jira是什么的同学可以看一下这篇文章:https://cloud.tencent.com/developer/article/1528965
本篇文章主要介绍如何使用Java操作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();
}
/**
* 活动工单信息
*
* @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;
}
/**
* 创建工单
*
* @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"
}
}
}
/**
* 更新工单
*
* @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;
}
/**
* 查询工单
* @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;
}
/**
* 为工单增加注释说明
* @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;
}
/**
* 删除工单
* @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;
}
/**
* 上传附件
* @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 }