zoukankan      html  css  js  c++  java
  • 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"
            }
        }
    }
    

      

    1. summary:工单主题
    2. issuetype:问题类型,问题类型是jira项目中存在的类型
    3. project:工单所属项目,工单所属项目是Jira中已经创建的项目
    4. description:工单描述,一些描述信息
    5. 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 }
    Jira完整代码
  • 相关阅读:
    iPhone UIButton图标与文字间距设置【转】
    UIButton左边图片右边文字的做法
    UICollectionViewCell设置阴影
    ARC中__bridge, __bridge__transfer, __bridge_retained 关系
    NSFileHandle的用法(用于读写文件)
    自定义FrameWork
    IOS7 适配以及向下兼容问题
    IOS 7 UITableView cell lines不能靠左解决方法
    xml报错“cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element”
    《Effective Java》笔记 :(一)创建和销毁对象
  • 原文地址:https://www.cnblogs.com/wugongzi/p/11750937.html
Copyright © 2011-2022 走看看