本文介绍如何通过api提交项目缺陷,由于不同project提交缺陷时要求的必填字段值可能不同,如下图,所以我们需要根据project id动态获取创建缺陷时需要的必填字段以及对应的字段值。
一:获取必填字段
根据project id获取必填字段并根据字段类型设置字段值,代码如下
//创建缺陷时所需要的字段,以及设置默认值 public static String getBugCreateMeta(String jiraProjectId) { //api 接口 String url = "http://you jira address:port/rest/api/2/issue/createmeta?projectIds=" + jiraProjectId + "&expand=projects.issuetypes.fields"; //初始值 String issueField = "{\n \"fields\": {\n \"project\": {\n \"id\": \"" + jiraProjectId + "\"\n }"; //除了必填项外 需要的字段 String[] otherRequiredField = {"assignee"}; //接口调用 HttpClientResponse httpClientResponse = httpClient(1, url, ""); JSONObject jsonObject = JSONObject.fromObject(httpClientResponse.getResponseBody().toString()); //接口返回结果示例参考下图 //获取项目信息 JSONArray projects = jsonObject.getJSONArray("projects"); JSONObject project = JSONObject.fromObject(projects.get(0)); //获取所有issue类型 JSONArray issuetypes = project.getJSONArray("issuetypes"); //查找缺陷类型 int bugIssueIndex = 0;//用于保存缺陷类型坐标 for (int i = 0; i < issuetypes.size(); i++) { JSONObject issuetype = JSONObject.fromObject(issuetypes.get(i)); if ("缺陷".equals(issuetype.getString("name"))) { bugIssueIndex = i; //添加类型字段 issueField += replace(jiraFieldOptionTemplate, "issuetype", issuetype); break; } } //获取缺陷类型所有信息 JSONObject issuetype = JSONObject.fromObject(issuetypes.get(bugIssueIndex)); //获取提交缺陷时所有字段 JSONObject fields = issuetype.getJSONObject("fields"); //循环所有字段,并获取默认值 Iterator<String> iterator = fields.keys(); while (iterator.hasNext()) { String key = iterator.next(); //获取字段信息 JSONObject field = fields.getJSONObject(key); //字段是必填且没有设置默认值,则选择默认值 if (ArrayUtils.contains(otherRequiredField, key) || (field.getBoolean("required") && !field.getBoolean("hasDefaultValue"))) { //获取字段类型 JSONObject schema = field.getJSONObject("schema"); if (field.containsKey("allowedValues")) { //如果字段值有可选项,则默认取值第一个 JSONArray allowedValues = field.getJSONArray("allowedValues"); JSONObject allowedValue = JSONObject.fromObject(allowedValues.get(0)); issueField = getIssueField(schema, issueField, key, allowedValue); } else { //字段值默认key issueField = getIssueField(schema, issueField, key, null); } } } //闭环json issueField = issueField + "\n }\n}"; return issueField; } /** * 设置那些类型的字段 * * @param schema * @param issueField * @param key * @param allowedValue * @return */ private static String getIssueField(JSONObject schema, String issueField, String key, JSONObject allowedValue) { //针对字段不同类型,定制不同模板 String jiraFieldArrayTemplate = ",\n \"key\": [\n {\n \"id\": \"jira_id\"\n }\n ]"; String jiraFieldOptionTemplate = ",\n \"key\": {\n \"id\": \"jira_id\"\n }"; String jiraFieldStringTemplate = ",\n \"key\": \"jira_key\""; String jiraFieldUserTemplate = ",\n \"key\": {\n \"name\": \"jira_key\"\n }"; //字段类型,需要可以扩展 switch (schema.getString("type")) { case "array": issueField += replace(jiraFieldArrayTemplate, key, allowedValue); break; case "option": issueField += replace(jiraFieldOptionTemplate, key, allowedValue); break; case "string": issueField += replace(jiraFieldStringTemplate, key, null); break; case "user": issueField += replace(jiraFieldUserTemplate, key, null); break; default: break; } return issueField; } /** * 替换值 * * @param template * @param key * @param allowedValue * @return */ private static String replace(String template, String key, JSONObject allowedValue) { //默认值是key,如果有可选值则获取可选值 String value = key; if (allowedValue != null) { value = allowedValue.getString("id"); } //以这种方式根据key的不同定制值 if (key.equals("customfield_10001")) { value = "10001"; } return StringUtils.replaceEach(template, new String[]{"key", "jira_id"}, new String[]{key, value}); } //url 可使用参数projectIds表示项目id、projectKeys表示项目key、issuetypeIds表示类型Id、issuetypeNames表示类型名称、expand增加展示的字段 //http://jyou jira address:port/rest/api/2/issue/createmeta?projectIds=100001&expand=projects.issuetypes.fields&issuetypeIds=10001
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | //调用接口返回的结果,根据字段类型、是否必填、是否有默认值进行分析 { "expand" : "projects" , "projects" : [ { "expand" : "issuetypes" , "self" : "http://you jira address:port/rest/api/2/project/1" , "id" : "1" , "key" : "abc" , "name" : "浙江省国办电子印章专项" , "avatarUrls" : { "48x48" : "http://you jira address:port/secure/projectavatar?avatarId=10324" }, "issuetypes" : [ { "self" : "http://you jira address:port/rest/api/2/issuetype/2" , "id" : "2" , "description" : "gh.issue.story.desc" , "iconUrl" : "http://you jira address:port/images/icons/issuetypes/story.svg" , "name" : "Story" , "subtask" : false , "expand" : "fields" , "fields" : { "summary" : { "required" : true , "schema" : { "type" : "string" , "system" : "summary" }, "name" : "主题" , "hasDefaultValue" : false , "operations" : [ "set" ] } } }, { "self" : "http://you jira address:port/rest/api/2/issuetype/3" , "id" : "3" , "description" : "" , "iconUrl" : "http://you jira address:port/secure/viewavatar?size=xsmall&avatarId=3&avatarType=issuetype" , "name" : "缺陷" , "subtask" : false , "expand" : "fields" , "fields" : { "customfield_10001" : { "required" : true , "schema" : { "type" : "option" , "custom" : "com.atlassian.jira.plugin.system.customfieldtypes:select" , "customId" : 10001 }, "name" : "问题环境" , "hasDefaultValue" : false , "operations" : [ "set" ], "allowedValues" : [ //该字段值可以展示给用户进行选择 { "self" : "http://you jira address:port/rest/api/2/customFieldOption/3" , "value" : "测试环境" , "id" : "3" }, { "self" : "http://you jira address:port/rest/api/2/customFieldOption/4" , "value" : "生产环境" , "id" : "4" } ] } } } ] } ] } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | //getBugCreateMeta 方法返回的结果,该结果在第二步中做为body内容进行提交 { "fields" : { "project" : { "id" : "10001" }, "issuetype" : { "id" : "10002" }, "summary" : "jira_summary" , "reporter" : { "name" : "huangtai" }, "customfield_10003" : { "id" : "10003" }, "customfield_10004" : { "id" : "10004" }, "customfield_10005" : [ { "id" : "10005" } ], "customfield_10006" : { "id" : "10006" }, "assignee" : { "name" : "huangtai" } } } |
二、提交缺陷
根据第一步中的返回结果作为请求body,提交缺陷,并获取缺陷key,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /** * jira上新增缺陷 * * @param requestBody 就是getBugCreateMeta方法返回的结果 * @return */ public static String addJiraIssue(String requestBody) { //api接口 String url = "http://you jira address:port/rest/api/2/issue" ; //请求接口 HttpClientResponse clientResponse = httpClient( 2 , url, requestBody); if (clientResponse != null && "201" .equals(clientResponse.getStateCode()) && clientResponse.getResponseBody() != null ) { //解析结果并返回缺陷key JSONObject jsonObject = JSONObject.fromObject(clientResponse.getResponseBody().toString()); if (jsonObject != null && jsonObject.containsKey( "key" )) { return jsonObject.getString( "key" ); } } return null ; } |
1 2 3 4 5 6 | //接口返回结果 { "id" : "12345" , "key" : "abc-1001" , "self" : "http://you jira address:port/rest/api/2/issue/12345" } |
总结:按照上面的步骤就可以在其它平台使用api的方式提交缺陷了;有时候需要让用户选择字段值,只需要把allowedValues字段在前端展示给用户选择即可。
更多文章请关注公众号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步