DevSecOps研討會演講回顧
如何使用ScriptRunner拓展Jira的功能

近日,龍智舉辦的DevSecOps研討會年終專場「趨勢展望與實戰探討:如何打好DevOps基礎、賦能創新」在上海圓滿落幕。龍智Atlassian技術與顧問諮詢團隊,以及清暉、JamaSoftware、CloudBees等生態夥伴的嘉賓發表了主題演講,分享他們在DevOps領域的豐富經驗與獨到見解,並圍繞Atlassian最新產品趨勢與Jira、Confluence等工具的最佳實踐,展開了深入探討。

本篇文章回顧龍智技術總監李毅的演講,聚焦於Jira的實用插件ScriptRunner,分享如何使用ScriptRunner拓展Jira的功能、ScriptRunner的重要功能模組以及最佳實踐。

演講回顧

如何在Jira中進行團隊成本與時間管理

大家好,我今天將分享如何使用ScriptRunner擴展Jira的功能,內容主要分為四個部分。

首先,我將介紹ScriptRunner是什麼樣的產品,讓大家對其有一個整體的認識。

第二部分,我將詳細講解ScriptRunner中各個功能模組的作用,以便在為業務方提供解決方案時能夠有所參考,知道應該使用ScriptRunner中的哪個模組來實現目標。

第三部分是實務經驗總結。我會分享在實務和提供客戶解決方案過程中累積的一些經驗,推薦一些實用做法,並提供注意事項,以便大家應用ScriptRunner時能夠輕鬆上手。

最後,我將總結一些在Jira中通用且重要的模組,以及在為客戶提供服務時經常出現的使用情境。

ScriptRunner -針對Jira自動化、客製化功能及擴充的解決方案
首先,讓我們來快速了解一下ScriptRunner是怎麼樣的產品。ScriptRunner主要利用Groovy腳本的強大功能,實現了Jira Software和Jira Service Desk本身無法實現的功能;以及從自動化,批量操作,構建自定義工作流,到第三方系統集成,ScriptRunner賦予Jira管理員超強的擴展能力。
它的主要優點是一體化、功能強大以及降本增效。作為一個產品,它包含了多個功能模組,幾乎涵蓋了使用者可能需要的所有功能。相較於購買多個插件,我們推薦首選ScriptRunner,因為它的功能豐富且實用。其次,它的功能強大,特別適用於建立複雜的自動化工作流程,以減少人力成本。此外,它還能幫助團隊實現降本增效,能夠透過簡單的腳本來支援業務需求,而無需進行客製化外掛程式開發。
ScriptRunner的主要特點包括自動化、高度客製化、可擴展以及提升使用者體驗。它不僅能夠滿足各種自動化需求,還能夠根據不同行業的特殊要求進行高度客製化,以滿足業務場景的需求。同時,它的拓展性也非常好,能夠輕鬆實現與Atlassian體系中的其他工具的集成,也可以透過RestAPI的方式與其他異質系統進行資料交互。無論是Jira管理人員還是日常使用Jira的用戶,都能夠充分體驗其強大的功能。
ScriptRunner功能模組
讓我們一起瀏覽ScriptRunner的各個功能模組,並了解它們的主要用途。
1、控制台——Script Console。控制台主要用於編寫試驗性的腳本或進行一次性功能驗證。使用者可以在此處執行定期清理使用者、查詢Issue資料、專案資料等任務,並查看結果。此外,使用者還可以在控制台學習和測試Jira REST API和HAPI,非常方便。
2、Built-In Scripts,該模組整合了許多內建的通用性腳本,提供了許多實用功能,例如批次操作使用者、批次操作Issue、查看日誌、切換日誌等。對於不太熟悉Groovy腳本編寫的用戶,建議先查看內建腳本,看看是否已經滿足需求。
3、Listeners,顧名思義,它用於監聽Jira中發生的事件,並在捕捉事件後執行特定的腳本處理。
4、Jobs允許您定期自動的執行腳本,從而節省管理員的時間,並降低手動執行的風險。
5.Script Fields就是所謂的腳本字段,它使用Groovy腳本計算或合併來自一個或多個現有字段的數據,並將它們展示在自訂字段中。通常用來展示擴充的Issue資訊。
6.Behaviours行為模組,是Script Fields的獨特模組,也是最重要的模組之一。它用於控制Issue介面上欄位的行為,使得使用者可以根據需要自訂化業務場景和流程。
7.Workflows也是常用模組之一,主要透過Script Conditions、Script Validators和Script Post Functions來增強和自動化工作流程。
8.Script Fragments主要與客製化UI相關,可以新增按鈕、Web圖示等。
9.JQL Functions擴展了Jira的內建功能,讓您可以進行更精細的搜尋操作,以快速獲取項目/問題的更詳細資訊。
10.REST Endpoints模組主要利用Groovy腳本迅速定義REST Endpoints,並可以與企業內部協同使用的工具整合並交互數據,例如從HR系統拉取用戶數據或從其他需求管理平台獲取專案的任務開發進度等。
11、Resources模組可建立本地或外部資料庫的鏈接,以及Ldap用戶管理的鏈接。一旦建立了連接,在其他場景編寫腳本時都可以直接使用,透過內建的BaseUtil和LdapUtil工具類,可以輕鬆取得所需的資料。
12.最後是Mail Handler模​​組,雖然使用頻率不高,但在使用者接收郵件時執行指定操作時非常有用。
ScriptRunner最佳實踐動態表單
在實際為客戶提供解決方案時,我們總結了一些使用ScriptRunner的好方法和注意事項。
我想推薦大家嘗試使用Dynamic Forms(動態表單)功能。動態表單允許建立的腳本帶有一些需要使用者動態輸入的參數,從而增強了腳本的通用性。Dynamic Forms可以保存腳本,並且帶有註釋,即使對程式碼不太了解的使用者也可以理解腳本的用途,提高了易用性。你可以編寫一個通用型的腳本,在多個地方都能派上用場,因此我強烈建議大家使用動態表單功能。
我寫了一個簡單的範例,讓大家了解這個概念。這個範例包含一個帶有”註解”的變量,稱為”user Picker”。它可以透過這種方式將變數綁定到使用者上,當使用者使用這個腳本時,就可以動態輸入使用者變數。這個腳本的實際功能非常簡單,它透過JQL查詢「經辦人等於輸入的使用者變數」的所有Issue並進行批次操作。這樣的腳本具有通用性,每個人都可以動態輸入想要的使用者變數參數。
這只是其中一個範例。實際上,動態表單可以支援Jira中絕大多數的欄位類型,包括Issue、Group、Project等,甚至是各種工作流程方案和權限方案。你可以選擇並基於它編寫通用性的腳本。
我也強烈推薦大家使用HAPI。HAPI是ScriptRunner擴展出的便捷API,它實際上是基於Jira腳本的,但做了一層緊湊的封裝,進一步降低了用戶的使用門檻。使用HAPI不需要對Jira過於熟悉。
通常情況下,以JavaAPI的方式編寫腳本會比較繁瑣。但是,直接使用HAPI會更為簡潔。
接下來我會舉幾個例子,大家可以體會一下。使用HAPI相對來說門檻非常低,而且編輯器中針對HAPI提供了許多程式碼提示功能。只要按照提示編寫,基本上都會有相應的建議。這降低了許多用戶的使用門檻,因此我也非常推薦大家在編寫腳本時盡量使用HAPI。
簡單舉幾個例子。首先是建立Issue,非常簡單,只需一句話。你可以在Console中執行一下程式碼,它會在「ABC」專案下建立一個類型為「Task」的Issue,其摘要為「my first HAPI」。相比使用Java API來編寫,這種方式更加簡單。
接下來是批次搜尋Issue的寫法,同樣也非常簡單。直接使用JQL語句,甚至可以透過filter進行過濾。我們可以限制傳回的條數。
 
以下是關於使用者的一些例子。可以看到,建立使用者也非常簡單,只需使用users.即可,後面的資訊就是使用者名稱、信箱和全名。透過Users.getByName就能取得對應的使用者資訊。users.的使用非常廣泛,它提供了許多提示,內建了許多實用的函數。而projects.則提供了與專案相關的功能提示。
因此,我非常推薦大家嘗試使用HAPI來寫程式碼,方便有效率。
以下是關於幾個泛用性高的模組的建議用法以及使用過程中需要注意的事項。
首先是特色功能——Behaviours。Behaviours通常用於使用者介面,包括新增、編輯、轉換介面等。它也可用於JSM的portal端。如果您正在使用JSM產品,並且需要在portal端定製欄位的行為,也可以考慮使用它。
Behaviours通常用於欄位的必填校驗,唯讀控制,顯示/隱藏控制,以及欄位的選項動態變動,欄位聯動等。在使用過程中,要避免多個Behaviours腳本同時控制同一個欄位的情況。需要做好控制範圍,確保欄位不會受到多個腳本的影響。此外,Behaviours不適用於批次操作,也不支援移動Issue介面。
它還支援項目類別的映射。通常情況下,腳本的控制範圍是透過專案和問題類型對應來實現的。如果我們利用ChangeEvent事件,並在此事件中使用MappingService進行對應。那我們就可以實現腳本對專案類別的範圍控制了。
最後,Behaviours不支援插件擴充的自訂字段,但可以透過Vendors API進行相容。Vendors指的是Marketplace上的供應商,他們通常會提供免費的API。因此,如果您希望擴充的自訂欄位也受到Behaviours的控制,可以考慮整合該API進行擴充。
最後,讓我們來談談Script Fields。Script Fields主要用於只讀字段,它也整合了許多內建的腳本字段,可以滿足大部分業務場景的需求。
例如,「No. of Times In Status」(狀態次數),這個欄位可以統計Issue進入指定狀態的次數。在實際應用中,這個功能可以在很多地方發揮作用,例如一個工作流程中反覆進入某個狀態,我們可能需要統計這個狀態的次數。例如,在測試中,如果一個bug被重複打開,可能就存在問題,我們可以利用這個腳本欄位來統計這種情況。這些指標可以幫助我們後續進行追蹤和分析。
另外一個常見的自訂場景是業務方有自己特殊的業務邏輯。典型的例子包括問題嚴重度欄位的即時計算,這需要根據其他欄位的值透過一定的業務規則計算後得出;或者是Issue的評分,通常也是依賴其他欄位並進行業務規則計算得出的。Script Fields通常在這些自訂場景中使用。
ScriptRunner客戶案例
接下來,我將分享一些重要模組的具體實際案例,供大家參考。當大家在工作上遇到類似的場景時,可以考慮透過這些方式去實現。
行為
首先是Behaviours,它主要的適用場景是在建立、編輯和轉換介面中增加欄位的行為邏輯(業務規則),相當於客製化業務規則。
  • 當字段A選擇某選項時,字段B顯示並且必填;
  • 字段A和字段B有連動效果,如:字段A選擇了“上海”,字段B的選項值變為“徐匯區”,”普陀區”;
  • 校驗欄位A的日期和欄位B的日期間隔不能超過60天;
  • 校驗欄位A的日期不能早於欄位B ;
  • 限製欄位A的編輯權限,只有使用者群組a中的使用者才可以編輯,其他使用者都是唯讀;
  • 限制某些問題類型的創建;
  • 當issuePicker欄位A選擇一條Issue後,自動將欄位B的值變更為該Issue中某個欄位的值;
自訂監聽器
然後是Custom Listener模組,也是非常重要的。它適用於在發生特定事件時需要執行相應的處理邏輯的場景。
  • IssueA和IssueB有連結關係,當IssueA欄位更新時,將對應的欄位值同步到IssueB;
  • 當Issue中的模組發生變化時,將Issue的經辦人修改為該模組的負責人;
  • IssueA和IssueB有連結關係,當IssueA狀態變化時,將狀態同步到IssueB;
  • 當Issue經辦人變更時,給自訂欄位賦值;
  • 當IssueA欄位更新時,同時更新動態表單IssuePicker選擇的Issue中相關欄位值;
  • 當Issue中的欄位、狀態變更時,產生郵件通知或新增評論。
工作流程
Workflows也是一個被廣泛使用的模組。它的適用場景是客製化專屬的工作流程以及自動化業務流程。我們分別從condition、validator和post-function來討論幾個典型的業務場景。
自訂腳本條件:
  • 「問題等級」欄位為S級時,需負責人審批,其他問題等級則不需要;
根據「問題嚴重度」欄位值的不同,執行不同的工作流程。
自訂腳本驗證器:
  • 若「專案負責人」欄位為空時,Issue 必須停留在原狀態,工作流程往下流轉時需要給予錯誤提示。
自訂腳本後置功能:
  • Issue 建立成功後,自動將經辦人設定為經辦人的主管,並且發送電子郵件通知;
  • Issue 最終完成時,自動給予「最終完成時間」欄位賦值。
腳本字段
最後再談一下腳本字段,它的適用場景是字段只讀並且字段值依賴其他字段自動計算或統計。通用場景有:
  • 腳本字段A的值是根據字段B、字段C 的值,依照業務規則自動計算所得;
  • 腳本字段A的值根據Issue進入Open狀態後的天數統計得到。
總結一下今天演講的主要內容:如果您要使用ScriptRunner,重點關注Behaviours、Listeners、Workflows以及Script Fields這幾個模組。將精力集中在這些模組上,再加上動態表單和HAPI的使用,就可以解決絕大部分的問題。如果大家還有其他問題解決不了,可以聯絡Atlassian全球白金合作夥伴-龍智,我們將提供優秀的解決方案,幫助你們達到目標。
我今天的分享就到這,謝謝大家!

立即了解Atlassian專案管理軟體Jira及外掛程式ScriptRunner,請聯絡Atlassian全球白金合作夥伴-龍智