LoginSignup
10
9

More than 5 years have passed since last update.

QuickReloadでAtlassian製品のプラグイン開発を高速にしよう

Posted at

はじめに

JIRA、Confluence、Bitbucket(旧Stash)といったAtlassian製品のプラグイン開発を効率化する、QuickReloadについて紹介する。

QuickReloadとは

QuickReloadは、Atlassian製品のプラグイン開発用のSDKであるAtlassian Plugin SDKで使える開発者向けツールである。

Atlassian Plugin SDKを使うと、atlas-runコマンドを実行することでローカルで各種Atlassian製品が起動しつつビルドしたプラグインをデプロイし、動作確認することができるような仕組みになっている。しかしながら、総じてAtlassian製品は起動にめちゃくちゃ時間がかかる物であり、ソース修正→ビルド→起動→デプロイ→動作確認 を繰り返すと開発効率が非常に悪いという問題がある。
QuickReloadは名前のとおり、開発するプラグインを各プロダクトの再起動なしに動的にリロードし、この問題をかなり改善してくれるツールである。

なお、以前は同様の目的のFastDevというツールが使われていたが、リロードされないものがあったりと問題があった模様。現在はFastDevのサイトに行くと

FastDev and atlas-cli have been deprecated. Please use Automatic Plugin Reinstallation with QuickReload instead.

とあり、非推奨になっている。そしてAMPS-1271によると、昨年の2015/10/14にリリースされたAtlassian Plugin SDK 6.1.0からSDKもデフォルトでQuickReloadを使うようになったとのこと。今後はQuickReloadを使うべし!

使い方

設定

pom.xmlのcom.atlassian.maven.plugins:maven-(Atlassian製品名)-pluginの設定にて、<enableQuickReload>true</enableQuickReload>を設定する。注意点として、<enableFastdev>false</enableFastdev>としてFastDevは無効にすること。これをしないとクラッシュするらしい。

pom.xmlの例(Confluenceの場合)
    <build>
        <plugins>
            <plugin>
                <groupId>com.atlassian.maven.plugins</groupId>
                <artifactId>maven-confluence-plugin</artifactId>
                <version>${amps.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <productVersion>${confluence.version}</productVersion>
                    <productDataVersion>${confluence.data.version}</productDataVersion>
                    <enableQuickReload>true</enableQuickReload>
                    <enableFastdev>false</enableFastdev>
                    ...

なお、SDK付属のatlas-create-jira-pluginatlas-create-confluence-pluginコマンドを実行してプロジェクトを作るとデフォルトでQuickReloadは有効となっているが、atlas-create-bitbucket-pluginコマンドで作ってもデフォルトで有効となっていなかったりする(SDK 6.2.2で確認)。プロダクトによって差異があるので必要であれば手動でQuickReloadを使うように設定すること。

リロード

pom.xmlを設定後、後は今までどおりatlas-runコマンドを実行して起動する。起動後にプラグインをリロードさせるには、コマンドプロンプトをもう1つ立ち上げてプラグインをmvn package -DskipTestsなどでリビルドすると、自動的にリロードされるようになっている。QuickReloadがtargetディレクトリ配下にビルドされたプラグインを自動検知し、リロードする仕組みとなっている。
以下はConfluenceのプラグインをリロードさせたみた場合に標準出力された内容。リロードされたことが示されている。

[INFO] [talledLocalContainer] 2016-02-09 17:45:48,753 INFO [QuickReload - Plugin Installer] [plugins.quickreload.install.PluginInstallerMechanic] downArrowMsg
[INFO] [talledLocalContainer]                                           |
[INFO] [talledLocalContainer]                                           |
[INFO] [talledLocalContainer]                                           |
[INFO] [talledLocalContainer]                                           |
[INFO] [talledLocalContainer]                                           |
[INFO] [talledLocalContainer]                                           v
[INFO] [talledLocalContainer]
[INFO] [talledLocalContainer] [1;33mStarting Quick Reload - 'C:\Users\wadahiro\work\sample\target\sample-1.0.0-SNAPSHOT.jar'....[22;39m
[INFO] [talledLocalContainer]
[INFO] [talledLocalContainer]
[INFO] [talledLocalContainer] 2016-02-09 17:45:49,299 INFO [QuickReload - Plugin Installer] [atlassian.plugin.manager.DefaultPluginManager] updatePlugin Updating plugin 'sample.sample' from version '1.0.0-SNAPSHOT' to version '1.0.0-SNAPSHOT'
[INFO] [talledLocalContainer] 2016-02-09 17:45:49,299 INFO [QuickReload - Plugin Installer] [atlassian.plugin.manager.DefaultPluginManager] broadcastPluginDisabling Disabling sample.sample
[INFO] [talledLocalContainer] 2016-02-09 17:45:50,488 INFO [QuickReload - Plugin Installer] [plugins.quickreload.install.PluginInstallerMechanic] installPluginImmediately
[INFO] [talledLocalContainer]                                           ^
[INFO] [talledLocalContainer]                                           |
[INFO] [talledLocalContainer]                                           |
[INFO] [talledLocalContainer]                                           |
[INFO] [talledLocalContainer]                                           |
[INFO] [talledLocalContainer]                                           |
[INFO] [talledLocalContainer]
[INFO] [talledLocalContainer]           [34mStealing back time from Maven since 2013.[33m
[INFO] [talledLocalContainer]
[INFO] [talledLocalContainer] Quick Reload Finished (1719 ms) - 'sample-1.0.0-SNAPSHOT.jar'[22;39m

なお、プロダクトによってはログレベルを設定しないと上記のようなリロードのログは出ない場合がある。例えばBitbucket(またはStash)の場合は、下記のようにREST APIをたたいてログレベルを変更すれば出力されるようになる。

curl -u admin -v -X PUT -d "" -H "Content-Type: application/json" \
 http://localhost:7990/bitbucket/rest/api/latest/logs/logger/com.atlassian.labs.plugins.quickreload/info

他のオプションによる高速化?

開発者向けのドキュメントにあるAutomatic Plugin Reinstallation with QuickReloadには書かれていないのだが、QuickReloadのリポジトリを見ると、pom.xmlにて追加設定を行うことで速くなるらしい。

pom.xml
                    <enableQuickReload>true</enableQuickReload>
                    <enableFastdev>false</enableFastdev>

                    <!-- 以下を追加する -->
                    <enablePde>false</enablePde>
                    <skipRestDocGeneration>true</skipRestDocGeneration>
                    <allowGoogleTracking>false</allowGoogleTracking>
                    <skipManifestValidation>true</skipManifestValidation>
                    <extractDependencies>false</extractDependencies>
                    <skipManifestValidation>true</skipManifestValidation>

ただし、私の環境で試しても起動時間(Confluenceで試した)は残念ながらほぼ変わらず。

pom.xml設定変更前
Server startup in 159525 ms
pom.xml設定変更後
Server startup in 160276 ms

残念ながらこちらのオプションには期待しないほうが良さそう。

もっと速くしたい!

QuickReloadを使うことで各プロダクト自体の再起動は不要になるので大幅に時間の節約になるが、それでもまだまだフィードバックが遅くてこんなのやってられん! という気持ちになるかと思う。そういった方は、JRebelを買ってお金で解決したほうが良いでしょう。atlassian-plugin.xmlといった設定ファイル変更の反映はできないが、Javaクラスの修正であれば即座に反映が可能ですよ。

参考リソース

10
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9