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号
浙公网安备 33010602011771号