プラグインによるJIRAおよびConfluenceのカスタマイズ

ドキュメントを維持し、ビジネスプロセスを管理する必要があるほとんどすべての組織は、これらのプロセスを促進するソフトウェアを選択および構成する必要に直面しています。 Atlassian Softwareの JIRAとConfluenceは、ロシア市場で非常に人気があります。 ただし、デフォルト構成では、組織が直面しているすべての問題を解決することはできません。誰もが作業プロセスについて独自のビジョンを持っています。 さらに、JIRAをカスタマイズするための要件は、製品を使用するにつれて大きくなります。



私はMail.Ru GroupでJIRA / Confluence開発者として働いており、JIRAおよびConfluenceプラグインの作成経験を共有したいと思っています。できること、その方法、覚えておくべきことです。



私が言うこと


ここでは、さまざまなコンポーネントの開発に関するいくつかの投稿を公開します。 プラグインとソースコードはこちらにあります



プラグインの説明は次のとおりです。



この記事では、動作するプラグインについてコメントします。そのプラグインのソースコードはこちらにあります 。 ソースコードを開始するには、 記事を読むだけです。



カスタムフィールド


それでは、カスタムフィールドから始めましょう。 フィールドはJIRAのデータの基本単位です。 問題データが含まれています。 JIRAのフィールド全体は、システムフィールドとユーザーフィールドの2つの主要なカテゴリに分類できます。 システムフィールドには、テキストフィールド、ドロップダウンリストなど、さまざまなフォームが含まれます。 実際には、多くの場合、基本的な機能では十分ではないため、カスタムフィールド(他のフィールドの合計やコメントの数を計算するフィールドなど)をプログラムする必要があります。



最初のプラグイン(クエリの問題のカスタムフィールド)は、構成された検索クエリ(JQL)から選択された問題のキーを値とするリストです。 リストの値は、要件(発行キー)の数です。



したがって、値はフィールドを編集および表示するたびに自動的に更新されます。 準備ができたプラグインはこちらです。



そのため、さまざまなプロジェクトに使用できるプラグインを開発し、使いやすく、JIRAのすべてのバージョンで動作するようにします。



最初の要件を実装するには、プラグインのデータウェアハウスを整理する必要があります。ここで、開発中のカスタムフィールドのクエリ(JQL)およびその他の設定を保存できます。 検索クエリ(JQL)を保存するには、プラグインのデータコンテナー(com.atlassian.sal.api.pluginsettings.PluginSettings)を使用することをお勧めします。 この選択により、プラグインのJIRAの他のバージョンへの移植性に問題がないことに注意してください。 さらに、Javaオブジェクトシリアル化ライブラリ(たとえばXStream )を使用してオブジェクトを文字列として表す場合、任意の構造のデータを格納できます。 リポジトリを使用するには、次の行をatlassian-plugin.xmlプラグイン構成ファイルに追加する必要があります。



<!-- Plugin data manager --> <component key="queryfields-config" name="Query issues custom fields plugin configuration" class="ru.mail.jira.plugins.lf.QueryFieldsMgrImpl"/> <!-- Components which required for injection --> <component-import key="pluginSettingsFactory"> <interface>com.atlassian.sal.api.pluginsettings.PluginSettingsFactory</interface> </component-import>
      
      





また、必要な操作を実行するインターフェイスを決定します。

インターフェイスソースコード
 public interface QueryFieldsMgr { /** * Get "add null" option. */ boolean getAddNull(long cfId, long projId); /** * Get stored data for the custom field. */ String getQueryFieldData(long cfId, long projId); /** * Set "add null" option. */ void setAddNull(long cfId, long projId, boolean data); /** * Put data for the custom field. */ void setQueryFieldData(long cfId, long projId, String data); }
      
      







そしてそれを実装します:

インターフェイスのソースコードの実装
 import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory; public class QueryFieldsMgrImpl implements QueryFieldsMgr { /** * PlugIn key. */ private static final String PLUGIN_KEY = "QUERY_LINKING_ISSUE_CFS"; /** * Property separator. */ private static final String VAL_SEPARATOR = "||"; /** * Plug-In settings factory. */ private final PluginSettingsFactory pluginSettingsFactory; /** * Constructor. */ public QueryFieldsMgrImpl( PluginSettingsFactory pluginSettingsFactory) { this.pluginSettingsFactory = pluginSettingsFactory; } /** * Create property key. */ private String createPropKey(long cfId, long projId) { return (cfId + VAL_SEPARATOR + projId); } @Override public boolean getAddNull(long cfId, long projId) { String addNull = (String)pluginSettingsFactory.createSettingsForKey(PLUGIN_KEY).get(createPropKey(cfId, projId).concat(".addnull")); return Boolean.parseBoolean(addNull); } @Override public String getQueryFieldData( long cfId, long projId) { return (String)pluginSettingsFactory.createSettingsForKey(PLUGIN_KEY).get(createPropKey(cfId, projId)); } @Override public void setAddNull(long cfId, long projId, boolean data) { pluginSettingsFactory.createSettingsForKey(PLUGIN_KEY).put(createPropKey(cfId, projId).concat(".addnull"), Boolean.toString(data)); } @Override public void setQueryFieldData( long cfId, long projId, String data) { pluginSettingsFactory.createSettingsForKey(PLUGIN_KEY).put(createPropKey(cfId, projId), data); } }
      
      









その後、特定のデータマネージャーを、次のように、標準のJiraコンポーネントのサーブレットおよび拡張機能で使用できます。

 public class LinkerField extends TextCFType implements SortableCustomField<String> { /** * PlugIn data manager. */ private final QueryFieldsMgr qfMgr; /** * Constructor. */ public LinkerField( CustomFieldValuePersister customFieldValuePersister, GenericConfigManager genericConfigManager, QueryFieldsMgr qfMgr) { super(customFieldValuePersister, genericConfigManager); this.qfMgr = qfMgr; } ...
      
      







プラグイン構成管理ページを実装することもお勧めします。 ページで、すべてのプロジェクト管理フィールドのリストを印刷し、フィールドを設定するためのコントロールをページに提供することは理にかなっています。 管理ページを実装するクラスをcomからの継承者にすることをお勧めします。 atlassian.jira.web.action.JiraWebActionSupport 。 クラスの例はru.mail.jira.plugins.lf.QueryFieldsConfigです。 プラグインに接続するには、次の行をatlassian-plugin.xmlに追加するだけです

 <web-item key="queryfields-configuration" name="Query issues custom fields configuration link" section="admin_plugins_menu/mailru-admin-section" weight="95"> <label key="queryfields.admin.title"/> <condition class="com.atlassian.jira.plugin.webfragment.conditions.JiraGlobalPermissionCondition"> <param name="permission">admin</param> </condition> <link linkId="queryfields-configuration">/secure/QueryConfigCfsConfig.jspa</link> </web-item> <webwork1 key="queryfields_conf" name="Query issues custom fields configuration" class="java.lang.Object"> <actions> <action name="ru.mail.jira.plugins.lf.QueryFieldsConfig" alias="QueryConfigCfsConfig"> <view name="input">/templates/queryfieldsconf.vm</view> <view name="success">/templates/queryfieldsconf.vm</view> </action> </actions> </webwork1>
      
      







JIRA URLアクションを実装する方法の詳細については、 こちらをご覧ください

さらに、管理ページはXSRF攻撃から保護する必要があることに注意してください。 詳細についてはこちらをご覧ください



フィールドの表示方法を決定できない場合は、単純なテキストフィールド( ru.mail.jira.plugins.lf.LinkerField )を基にして展開できます。 チャートを構築してテキストフィールドから統計を収集することは不可能ですが、この機能を自分で実装できます: ru.mail.jira.plugins.lf.LirkerFieldSearcherru.mail.jira.plugins.lf.LirkerFieldCustomFieldValueProviderru.mail.jira.plugins.lf .LirkerFieldSearchInputTransformerおよびru.mail.jira.plugins.lf.LirkerFieldCustomFieldRenderer



その後、編集とプレゼンテーション用の外観をプログラムするだけで済みます: edit-linkerfield.vmview-linkerfield.vm



ビューのプログラミング方法がわからない場合は、標準フィールドwebapp / WEB-INF /クラス/テンプレート/プラグイン/フィールドの実装方法を確認することをお勧めします。



このアプローチを使用して、複雑なカスタムフィールドを実装できます。 たとえば、この方法では、カラーピッカー、計算フィールドのリスト、数式などを実装できます。



イベントハンドラー




2番目にコメントしたいプラグインは、JIRA MRIMリスナーです。 このプラグインは、JIRAイベント通知をMail.Ruエージェントに送信します。 このようなプラグインを作成するには、イベントハンドラーを1つだけ実装すれば十分です。 クラステンプレートは次のとおりです。

ソースコード
 public class MyListener implements InitializingBean, DisposableBean { /* * Logger. */ private static Log log = LogFactory.getLog(MyListener.class); /** * Event publisher. */ private EventPublisher eventPublisher; /** * Constructor. */ public MyListener ( EventPublisher eventPublisher) { this.eventPublisher = eventPublisher; } @Override public void afterPropertiesSet() throws Exception { //--> register ourselves with the EventPublisher eventPublisher.register(this); } @Override public void destroy() throws Exception { //--> unregister ourselves with the EventPublisher eventPublisher.unregister(this); } @EventListener public void onIssueEvent(IssueEvent issueEvent) { // your code here } }
      
      







ソースコードはこちらです。 ここでイベントをフィルタリングするには、前の例で説明したものと同様のプラグインデータストアを使用できることに注意してください。 イベントハンドラを使用すると、関連する要件を作成したり、添付ファイルに署名したり、HTTP要求を送信したりできます。



結論の代わりに




開発に興味を持っているが、以前にやったことがない人のために、本-JIRA Development Cookbookをお勧めします。https: //marketplace.atlassian.com/vendors/37127で無料のプラグインをフォローしてください



実際、私があなたに伝えたかったのはそれだけです。 ご質問がある場合、またはJIRAとConfluenceについてご意見をお聞かせください。コメントでお話しできることを嬉しく思います。 さらに、無料のプラグインのアイデアがある場合は、実装を作成、作成、または支援してください。




All Articles