jira的插件開發流程實踐


  怎么開頭呢,由於自己比較懶,博客一直不怎么弄,以后克己一點,多傳點自己遇到的問題和經歷上來,供自己以后記憶,也供需要的小伙伴少走點彎路吧

  最近公司項目需要競標一個運維項目,甲方給予了既定的幾種比較常用的平台各司其職,並提出了一些定制化要求,讓所有競標廠商,用同樣的平台,同樣的環境去POC,其中jira就是一種一部分,然后學習過程就開始了。

  請讓我再多一句題外話,說點心得,我們要做的事情,和想要做的事情,基本上atlassion官方都給予了文檔,無奈,本人的英文實在渣到死,更無奈的是,國內關於jira的文檔也比較少,只能硬着頭皮去看英文,好好就在,它並沒有想象中那么難懂,作為一個程序員,一些常用的界面,配置文件,只要截圖貼出來,基本不需要過多的解釋,應該就明白個一二了。為什么提這個,因為我知道就是我有心想要把我這次學習中碰到的所有問題都寫出來,也肯定寫不全,最全面的文檔還要是回歸官方文檔的,這篇文章,算是給那些想去了解jira插件開發的小伙伴入個門,省的到官網去,都不知道用什么關鍵字去搜索相關文檔 。

  好了,圍繞思維三部曲開始吧。

一、what--什么是jira插件

  jira是什么,就不多介紹了,我想能來看這文章的小伙伴,jira肯定是已經接觸的,直接回到jira插件上,在我理解看來,jira本身有着很強大的功能,我認為一個成熟項目的強大一定是抽象層面的強大,一定不是實現層面的強大,這才是方便擴展的正確做法,也符合設計模式,或者說,也符合人正常思維模式。所以,如果你想要定制一塊功能,融合進你的業務,肯定jira本身提供不了 ,這時候,就需要插件了,比如說,jira界面默認是英文的,我們肯定還是中文比較看的比較熟悉,想找個漢化的,怎么辦,官方提供了不同版本的漢化包,不同版本漢化程度也不一樣,有漢化了98%的,也有漢化了60%,對我們來說叫做漢化包比較通俗易懂,實質上,它就是一個插件,更直白一點,就是個jar包,也是通過管理員通過在jira插件頁面上傳插件安裝的,再比如說,jira默認支持的字段類型有這些:

那如果,我想要實現一個功能,在界面上就是一個輸入框,點開以后,就彈出來一個另一個系統的頁面,用來勾選參數呢?如下圖:

這樣的功能,怎么實現呢?ok,插件可以幫助你.當然altassian也有自己的插件商城,有收費也有免費的,至於每個插件的作用,自己看詳細解釋吧,如下圖:

 

二 、HOW - 如何開發jira插件,這是這篇文章介紹的重心

  1.首先要開發jira插件,必須要安裝altassian的sdk,先給出官方地址,上面詳細的介紹了安裝的方法

https://developer.atlassian.com/docs/getting-started/set-up-the-atlassian-plugin-sdk-and-build-a-project/install-the-atlassian-sdk-on-a-windows-system

   這地址打開后,你會發現,左邊的導航鏈接有很多,實際上,只要照着它的指導,一篇一篇的做一下,就基本問題不大

   這里簡單的描述下步驟:

   ①裝JAVA配置環境變量

   ②下載SDK,這里以WINDOWS為例,下載之后是個exe文件,一步一步點下去,設置好自己的安裝目錄,就可以了

   ③驗證SDK是否安裝成功,windows下CMD輸入atlas-version,如果出現以下界面,代表成功

   ④我們進到它安裝目錄里看下結構:

  理論上,安裝完成后,應該有圖中的幾個目錄,忽略我模糊的部分,看下這個目錄名稱,基本能看到這個sdk由什么構成 ,有maven ,jre,還有bin下各種各樣bat文件,ok,進一步聯想一下,后面的話,應該會有各種各樣的maven指令從中央庫去down jar吧。(OK,心理活動就到這里)

 

  2.到這一步,SDK已經安裝完畢,然后讓我們開始開發插件之旅吧,首先我們得定義一個目錄吧,用來放插件代碼的位置,為了方便吧,我們就在當前目錄創建一個文件夾 叫做 myPlugin  如圖:

  然后cmd 進入此目錄,敲atlas-create-jira-plugin 回車會出現以下界面,這里備注一下,后面會有多次操作cmd界面的動作,我會一一解釋是每一步是用來干嘛的,因為我本地已經開發過,中間依賴的jar包已經由maven從atlassian中央庫down下來了,第一次如果安裝的話,不同的指令操作可能會觸發down jar包的,等等就好(我記得有個web容器的war包,里面包含tomcat中間件,有260M。。。。祝君好運):

  這個界面出來之后,是需要我們繼續輸入信息的,並不是就看看就行,熟悉maven的應該知道即將輸入的是什么,這里不對maven的東西做過多贅述了,設置好groupId和artifactid 還有version就行,這里version,它自動會默認生成一個1.0.0-SNAPSHOT快照版本號,如果不想改,繼續回車就行,然后會碰到package,這個是指定代碼的包名路徑的,同version一樣,會有默認的值,和上面groupid的設置的值一樣,如果不修改的話,繼續回車,最后確認上面輸入的信息,如果同意就輸入"Y",反之就輸入“N”,確認以后,會出現build的過程信息,如下圖:

  出現build success,就代表一個插件工程創建成功,讓我們看下目錄結構:

  這個工程,很顯然是個maven工程,ok,那么可以看出來上面執行的atlas-create-jira-plugin指令是什么意思了,相當於按照我們需要的插件名稱,版本等信息,建立一個maven工程,我們再看下這個目錄的深層次結構,這里直接導入eclipse或者intellJ里看吧,更加直觀一下如圖:

  可以看到,自動生成了很多文件,我們可以自己點開看看寫了些什么,程序員么,最不缺乏的應該就是聯想,這幾個文件,對java開發來說,應該都是常見的東西,所以不多做描述了,這里只提一個文件,就是atlassian-plugin.xml ,在繼續說之前,我先問一個問題,jira也是一個web工程,引用大量的jar包,其中也有很多是maven工程構建的jar,怎么區分,哪些是插件,哪些不是插件呢?聰明的小伙伴,一定懂我問的意思,沒錯,就是這個文件,atlassian-plugin.xml,正因為這個文件,所以才能識別它是個插件,當然此文件的作用不僅僅是識別功能,我們可以打開這文件內容看看如圖:

  是不是不懂什么意思?不懂就對了,我也不懂,但是即使不懂,有一些節點的關鍵字,我們應該是有一種程序員的敏銳性去理解的,比如i18n,這肯定是國際化的資源文件,plugin-info節點肯定是對當前插件的一些描述信息,然后有的節點里有location屬性,里面的路徑,應該就是上圖中,需要引用的文件的相對路徑,恩,其他的應該看不出來了

  ok,到這邊就算大致對這個工程,有個結構上的熟悉了

  3.當我們已經新建好一個插件工程后,下一步我們就要思考了,我們要做的這個插件,到底是要做什么?別急,jira會指導你下一步要做什么,先進入 我們剛新建的插件工程里,也就是pom.xml所在的那級目錄下(E:\Atlassian\myPlugin\MyPlugin),然后敲下atlas-create-jira-plugin-module指令,出現下圖:

  除了down jar包的信息之外,最后跳出了34種plugin module,並需要你繼續輸入,解釋一下,jira支持的插件類型一共就屏幕上列出來的這34種,每一種都有它應該使用的場景,如一開始,我貼圖中的,想做一個自定義類型字段的插件,那么應該是什么?看下第4種Custom Field(自定義字段),因為我這次poc的所用到的就兩種(還有一種是workflow post function),其他的插件類型,我就不發表意見了,拋磚引玉,回歸官網文檔上,所有的插件類型,這個只有去官網文檔上去找了(關鍵字就是plugin module,左邊的導航欄里有個plugin module index ),上面有很詳細的解釋,以及屬性設置,這里我選4,回車

Enter New Classname MyCustomField:      ----------------------------------讓你輸入一個類名,默認叫做MyCustomField,我改成TestCustomField

Enter Package Name com.test.zt.jira.customfields: :------------------------輸入包名,默認是com.test.zt.jira.customfields,保持默認吧

Show Advanced Setup? (Y/y/N/n) N: :----------------------------是否采用高級安裝,這里我們選擇N,之前選過一次Y,還有一大堆要設置的地方,采用默認吧,小伙伴你們選Y可以試一下,根據屏幕的提示,繼續定制一下

Add Another Plugin Module? (Y/y/N/n) N: :---------------------------------是否需要在增加一個插件類型?看來,同一個maven工程里,我們可以增加很多插件類型,這里我們就簡單一點選N ,不需要

然后,就開始build了,截圖如下:

  因為之前已經導入過eclipse里了,所以,不在windows瀏覽了,直接在eclipse里觀察,看看目錄結構有什么變化

  紅色部分是新增的文件,看下名字,就是我們上面在cmd中輸入的信息,這邊有個編譯錯誤,當個小插曲吧

  The type java.util.Optional cannot be resolved. It is indirectly referenced from required .class files

 java.util.Optional是1.8才出的特性,項目中maven導入進來時候,卻指定的版本是1.5,所以引用jdk有問題吧,因為maven工程創建是由SDK創建的,這里不過多糾結為什么是引用1.5了,直接eclipse改成1.8jdk,

  先看下新增的那個類,TestCustomField.java,也是自動builder,然后繼承了TextCFType,我們先什么都不用改,里面的方法,暫時也不用管什么意思 ,既然是做插件,目的就是快捷,方便二次開發,如果要去徹底研究透源碼,代價太大了,況且也不現實,jira不開源,即使有開源的地方,也是方便於二次開發的部分。比如rest api,那個是有源碼可以參考的。

  ok,我們看下最重要的一個文件,atlassian-plugin.xml,多了以下部分:

  customfield-type這種類型 就是自定義字段類型,里面很多屬性 比如name,i18n-name-key 等等,這些應該設置什么值,這里不多數了,還是那句話,去官網查這種類型的插件相關文檔,官方有整個一頁的介紹,還是那句話,拋磚引玉,就和寫java一樣,隨時備着jdk的javadoc,用的時候就去查

  然后再看下,兩個vm文件,因為本人volecity不熟悉,都是現查現用,這兩個文件 一個叫edit,一個叫view,顧名思義,一個是編輯的時候,顯示的樣子,一個是查看的時候顯示的樣子,這么想沒什么概念,但是你聯想下ira頁面操作的時候,創建問題和編輯問題,還有查看問題這三種行為的時候,然后就能明白一二了,而且,前台這種渲染模板文件采用的是volecity,也不支持什么jsp,html,ftl等,貌似只支持volecity

  4.OK,至此,插件開發完畢(雖然在這里什么都沒做,都是用的默認的代碼,未來如果有定制化的話,流程上就需要去改變java類,顯示的話就需要vm文件),下面,讓我們將這個插件部署到jira中去,養兵千日,用兵一時,總要在jira上能用起來吧?

  這邊提到兩個部署環境,當然,官方沒有這些概念,這是我站在開發角度,定義個兩個名稱吧,第一個叫做正式環境  一個叫做開發環境,前者就是指我們正常使用的jira環境,正常上傳插件,就可以使用, 后者是依賴SDK,自動構建出的一個web環境,版本號與SDK版本有關,這就是上面我提到,有個260M左右的web容器,此開發環境是免費的,默認連的它的h2 database,如果要換成其他什么庫,比如sqlserver,那么啟動后就會提示你需要licence了,由於SDK下的最新,里面的jira版本可能也比較新,破解可能還不大好被破解,所以,這里不麻煩了,采用它默認的h2數據庫,

  好吧,我們開發的話,可能更多要關注這個開發環境了,首先,要啟動這個環境吧。同樣,cmd先進入 我們上面建的插件的根目錄,也就是pom.xml所在的目錄(為什么老是說這個pom.xml,這個pom.xml可以打開看一下,也是別有一番洞天) 輸入:atlas-run 或者 atlas-debug 回車  (這些指令從哪里來?還記得sdk安裝后的bin目錄么,進去看看吧),然后就是漫長的等待,又開始down jar包 還有那個最恐怖的web容器的包,所有需要的東西都down完之后,就開始啟動tomcat了,啟動成功后,就可以訪問jira了,地址是:http://localhost:2990/jira/ 這里提下,因為是開發,可能需要debug調試,那么就采用atlas-debug啟動,默認debug端口是5005

      此刻環境也運行起來了,該將我們開發的插件,部署到環境中去了,同樣,重新開一個cmd先進入 我們上面建的插件的根目錄 敲atlas-mvn package回車,會出現很多打包信息,還有junit測試的信息,因為必須要junti測試通過之后,才能正確打成jar包,這個junit代碼,就是上面我貼圖中的,test/java包里的代碼,junit類也是build自動生成的,如果多次test不通過,可以直接把代碼改改,通過校驗,正確打包后,會出現以下界面:

  打包成功后,會在插件工程的target目錄(此目錄里的內容同樣別有一番洞天,web容器,日志,jira上的所有操作的產生的文件,等等都在這個目錄里,介紹不完,大部分還算屬於一個正常點web工程運行時結構,所以理解起來的話應該還是大部分能看懂的)出現jar包信息,如圖

  並會自動部署到tomcat里,可以看到tomcat conlose運行日志 如圖:

  以后如果需要重新部署的話,就執行atlas-mvn package指令就可以,當然插件本身必須要先支持熱部署(默認已經是true),否則部署是無效的,修改pom.xml如下圖:

  當插件開發完畢,可以上正式環境的時候,就把這個不帶tests的jar,通過插件管理頁面上傳到正式環境就可以正常使用了,這里提下可能會遇到日志可能會報一個錯誤,也是糾結到死,明明是SDK自動創建出來的代碼,運行時居然報錯,報依賴找不到: 

Unsatisfied dependency expressed through constructor argument with index 0 of type [com.atlassian.jira.issue.customfields.persistence.CustomFieldValuePersister]:

  這個官方也有過說明,看日志也會給你解釋的訪問地址,原因還是內部采用各種spring版本的兼容性問題,這里不贅述了,大概提一下,構造函數的參數上要加上@ComponentImport注解,類上要加上@ExportAsService注解 

  正常的話,到這里部署完畢,看看jira上面的效果吧:

 

三、why-為什么要開發插件?

  其實,在what中已經提到了,在how中,我做了一個自定類型的字段,但是有那么多種插件類型,針對無數的場景,如果我想在某一個工作流中,想實現某一次提交后,觸發另一個功能(比如,改變某個字段的值,或者調用第三方系統的rest 或者 webservcie,根據返回結果再觸發下一個流程等等),這依舊是一個插件類型,上面提到過,叫做workflow post function ,開發插件是為了讓我們的定制化更加深入,更加符合我們的需求。當你覺得jira現有功能,不能滿足你的時候,考慮插件吧,無論是什么場景,我想都應該有對應的解決方案的。

  最后,還是那句話,拋磚引玉,希望這篇文章,能給更多的剛入門的做二次開發的小伙伴們,提供一個入口,不至於像我開始那樣,到處找相關的關鍵字,無從下手。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM