jira二次開發經驗分享

最近在折騰Jira的二次開發,說實話,二次開發需要對系統的架構有一定的瞭解纔好下手。雖然Jira這個產品很完善,官方有很詳細的文檔供開發者參考,但小弟還是花了不少時間研究,開發了近一個月的時間,現在把一些用到的知識和問題整理出來,與大家分享。

這次開發主要是做一箇中間件,用來連接jira系統和其他系統從而實現系統之間的相互的通信,如創建一個問題(Issue),對jira裏一些問題(即Issue)信息的修改,流程步驟(workflowstep)的改變,添加與更新字段(Field)和自定義字段(customerField)的等等。這裏用到了jira-rest-java-client包來實現對jira的訪問。

部分操作Jira的代碼:

001 import java.net.URI;
002 import java.net.URISyntaxException;
003 import java.util.ArrayList;
004 import java.util.List;
005 import com.atlassian.jira.rest.client.JiraRestClient;
006 import com.atlassian.jira.rest.client.NullProgressMonitor;
007 import com.atlassian.jira.rest.client.domain.BasicIssue;
008 import com.atlassian.jira.rest.client.domain.BasicProject;
009 import com.atlassian.jira.rest.client.domain.Issue;
010 import com.atlassian.jira.rest.client.domain.User;
011 import com.atlassian.jira.rest.client.domain.input.FieldInput;
012 import com.atlassian.jira.rest.client.domain.input.IssueInput;
013 import com.atlassian.jira.rest.client.domain.input.IssueInputBuilder;
014 import com.atlassian.jira.rest.client.internal.jersey.JerseyJiraRestClientFactory;
015   
016 public class jira {
017   
018   
019  staticJerseyJiraRestClientFactory factory =newJerseyJiraRestClientFactory();
020  staticNullProgressMonitor pm =newNullProgressMonitor();
021  staticString uri="http://localhost:8100";
022  staticString user="gfjira";
023  staticString pwd="123456";
024  /**
025  * @param args
026  */
027  publicstaticvoid main(String[] args) {
028  // TODO Auto-generated method stub
029   
030   
031  }
032  publicstaticvoid getIssue(String issueKey)throws URISyntaxException{
033    
034  URI jiraServerUri =newURI(uri);
035  JiraRestClient restClient = factory.createWithBasicHttpAuthentication(
036  jiraServerUri, user, pwd);
037  //get issue through issueKey
038  Issue issue = restClient.getIssueClient().getIssue(issueKey, pm);
039  //grab user info
040  User usr = restClient.getUserClient().getUser(user, pm); 
041  System.out.println(usr);
042  System.out.println(issue);
043  }
044    
045  //
046  /*
047  * create the issue
048  * @param Issue type :  1L:bug; 2L:new requirement; 3L:task; 4L.improvement
049  * @param projectName:such as "GTP",the project short name
050  * @param Longid:such as 10000
051  * @param Summary:topic
052  * @param Description:
053  */
054 public static void createIssue(String projectName,String issueType,String description,String summary)throwsURISyntaxException{
055  //JerseyJiraRestClientFactory factory = new JerseyJiraRestClientFactory();
056  URI jiraServerUri =newURI(uri);
057  JiraRestClient restClient = factory.createWithBasicHttpAuthentication(
058  jiraServerUri, user, pwd);
059  IssueInputBuilder issueBuilder =newIssueInputBuilder("ProjectKey",
060  Long.valueOf(issueType));
061   
062   
063  finalURI projectUri =newURI(
064  "http://localhost:8100/rest/api/2/project/IT");
065  BasicProject bporject =newBasicProject(projectUri, projectName,"",
066  (long)10000);
067  issueBuilder.setProject(bporject);
068  issueBuilder.setDescription(description);
069  issueBuilder.setSummary(summary);
070   
071   
072  IssueInput issueInput = issueBuilder.build();
073  BasicIssue bIssue = restClient.getIssueClient().createIssue(issueInput,
074  pm);
075  // print the newly created issuekey
076  System.out.println(bIssue.getKey());
077  } <SPAN></SPAN>publicstaticvoid updateIssueField(String key,String field,String value)throwsURISyntaxException{
078   
079   
080  URI jiraServerUri =newURI(uri);
081  JiraRestClient restClient = factory.createWithBasicHttpAuthentication(
082  jiraServerUri, user, pwd);
083  //get the issue through issuekey
084  Issue issue = restClient.getIssueClient().getIssue(key, pm);
085  //update the default field environment,if the field is defined by self,pls use the filed<SPAN></SPAN> FieldInput fieldinput = new FieldInput("environment", value);
086  List<FieldInput> fields =newArrayList<FieldInput>();
087  fields.add(fieldinput);
088  restClient.getIssueClient().update(issue, fields, pm);
089  }
090   
091   
092 public static void changeIssueStatus(String issuekey)throwsURISyntaxException
093  {
094   
095   
096  URI jiraServerUri =newURI(uri);
097  JiraRestClient restClient = factory
098  .createWithBasicHttpAuthentication(jiraServerUri, user,
099  pwd);               
100  Issue issue = restClient.getIssueClient().getIssue(issuekey, pm);
101 //the number 3 is involed below picture,you can focus on the red rectangular
102  TransitionInput tinput=newTransitionInput(3);
103  restClient.getIssueClient().transition(issue,
104  tinput, pm);
105  }  }


就上面這段代碼都折騰了我好久,特別是jira-rest-java-client的版本問題,最新的版本找不到需要的函數,卻在舊的版本(1.1.m02,這個版本很奇葩吧)裏有需要的函數,該死的官方沒有說清楚,害得我一個一個的測試。這裏想說的是changeIssueStatus這個方法,issue的workflow是不可以隨便改變的,必須按照流程圖的順序進行改變,其實就是提供一個id值,圖中紅色的區域可查到具體的id值,比如當前issue的狀態是open,要改變成resolved的狀態,就要"5"這個值,即

1 TransitionInput tinput= newTransitionInput(5);
同理,要改變成closed,就用"2"這個值
1 TransitionInput tinput= newTransitionInput(2);

既然是二次開發,系統就少不了前端開發,那就要用到javascript了,考慮到Jira系統自身的複雜和以後版本升級帶來的問題,所以沒有對源碼的js進行修改,而是利用了jira裏提供的一個customer field,他可以讓我們往裏面添加html,css,javascript,而且是基於Jquery的,雖然稱不上完美,但是還勉強能實現需求的功能。

暫時整理出這麼多,希望各位大俠能多噴多給意見:D 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章