はじめに
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は無効にすること。これをしないとクラッシュするらしい。
<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-plugin
、atlas-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
にて追加設定を行うことで速くなるらしい。
<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で試した)は残念ながらほぼ変わらず。
Server startup in 159525 ms
Server startup in 160276 ms
残念ながらこちらのオプションには期待しないほうが良さそう。
もっと速くしたい!
QuickReloadを使うことで各プロダクト自体の再起動は不要になるので大幅に時間の節約になるが、それでもまだまだフィードバックが遅くてこんなのやってられん! という気持ちになるかと思う。そういった方は、JRebelを買ってお金で解決したほうが良いでしょう。atlassian-plugin.xml
といった設定ファイル変更の反映はできないが、Javaクラスの修正であれば即座に反映が可能ですよ。