最近在折騰Jira的二次開發,說實話,二次開發需要對系統的架構有一定的瞭解纔好下手。雖然Jira這個產品很完善,官方有很詳細的文檔供開發者參考,但小弟還是花了不少時間研究,開發了近一個月的時間,現在把一些用到的知識和問題整理出來,與大家分享。
這次開發主要是做一箇中間件,用來連接jira系統和其他系統從而實現系統之間的相互的通信,如創建一個問題(Issue),對jira裏一些問題(即Issue)信息的修改,流程步驟(workflowstep)的改變,添加與更新字段(Field)和自定義字段(customerField)的等等。這裏用到了jira-rest-java-client包來實現對jira的訪問。
部分操作Jira的代碼:
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;
|
019 |
static JerseyJiraRestClientFactory factory = new JerseyJiraRestClientFactory(); |
020 |
static NullProgressMonitor pm = new NullProgressMonitor(); |
021 |
static String uri= "http://localhost:8100" ; |
022 |
static String user= "gfjira" ; |
023 |
static String pwd= "123456" ; |
027 |
public static void
main(String[] args) { |
032 |
public static void
getIssue(String issueKey) throws
URISyntaxException{ |
034 |
URI jiraServerUri = new URI(uri);
|
035 |
JiraRestClient restClient = factory.createWithBasicHttpAuthentication( |
036 |
jiraServerUri, user, pwd); |
038 |
Issue issue = restClient.getIssueClient().getIssue(issueKey, pm); |
040 |
User usr = restClient.getUserClient().getUser(user, pm); |
041 |
System.out.println(usr); |
042 |
System.out.println(issue); |
054 |
public
static void createIssue(String projectName,String issueType,String description,String summary) throws URISyntaxException{ |
056 |
URI jiraServerUri = new URI(uri);
|
057 |
JiraRestClient restClient = factory.createWithBasicHttpAuthentication( |
058 |
jiraServerUri, user, pwd); |
059 |
IssueInputBuilder issueBuilder = new IssueInputBuilder( "ProjectKey" , |
060 |
Long.valueOf(issueType)); |
063 |
final URI projectUri = new URI(
|
064 |
"http://localhost:8100/rest/api/2/project/IT" ); |
065 |
BasicProject bporject = new BasicProject(projectUri, projectName, "" , |
067 |
issueBuilder.setProject(bporject); |
068 |
issueBuilder.setDescription(description); |
069 |
issueBuilder.setSummary(summary); |
072 |
IssueInput issueInput = issueBuilder.build(); |
073 |
BasicIssue bIssue = restClient.getIssueClient().createIssue(issueInput, |
076 |
System.out.println(bIssue.getKey()); |
077 |
} <SPAN></SPAN> public static void
updateIssueField(String key,String field,String value) throws URISyntaxException{ |
080 |
URI jiraServerUri = new URI(uri);
|
081 |
JiraRestClient restClient = factory.createWithBasicHttpAuthentication( |
082 |
jiraServerUri, user, pwd); |
084 |
Issue issue = restClient.getIssueClient().getIssue(key, pm); |
086 |
List<FieldInput> fields = new ArrayList<FieldInput>(); |
087 |
fields.add(fieldinput); |
088 |
restClient.getIssueClient().update(issue, fields, pm); |
092 |
public
static void changeIssueStatus(String issuekey) throws URISyntaxException |
096 |
URI jiraServerUri = new URI(uri);
|
097 |
JiraRestClient restClient = factory |
098 |
.createWithBasicHttpAuthentication(jiraServerUri, user, |
100 |
Issue issue = restClient.getIssueClient().getIssue(issuekey, pm); |
102 |
TransitionInput tinput= new TransitionInput( 3 ); |
103 |
restClient.getIssueClient().transition(issue, |
就上面這段代碼都折騰了我好久,特別是jira-rest-java-client的版本問題,最新的版本找不到需要的函數,卻在舊的版本(1.1.m02,這個版本很奇葩吧)裏有需要的函數,該死的官方沒有說清楚,害得我一個一個的測試。這裏想說的是changeIssueStatus這個方法,issue的workflow是不可以隨便改變的,必須按照流程圖的順序進行改變,其實就是提供一個id值,圖中紅色的區域可查到具體的id值,比如當前issue的狀態是open,要改變成resolved的狀態,就要"5"這個值,即
1 |
TransitionInput tinput= new TransitionInput( 5 ); |
同理,要改變成closed,就用"2"這個值
1 |
TransitionInput tinput= new TransitionInput( 2 ); |
既然是二次開發,系統就少不了前端開發,那就要用到javascript了,考慮到Jira系統自身的複雜和以後版本升級帶來的問題,所以沒有對源碼的js進行修改,而是利用了jira裏提供的一個customer field,他可以讓我們往裏面添加html,css,javascript,而且是基於Jquery的,雖然稱不上完美,但是還勉強能實現需求的功能。
暫時整理出這麼多,希望各位大俠能多噴多給意見:D