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

# はじめに

JIRA、Confluence、Bitbucket(旧Stash)といったAtlassian製品のプラグイン開発を効率化する、[QuickReload](https://developer.atlassian.com/docs/developer-tools/automatic-plugin-reinstallation-with-quickreload)について紹介する。


# QuickReloadとは

QuickReloadは、Atlassian製品のプラグイン開発用のSDKである[Atlassian Plugin SDK](https://developer.atlassian.com/docs/getting-started/set-up-the-atlassian-plugin-sdk-and-build-a-project)で使える開発者向けツールである。

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


なお、以前は同様の目的の[FastDev](https://developer.atlassian.com/docs/developer-tools/automatic-plugin-reinstallation-with-fastdev)というツールが使われていたが、リロードされないものがあったりと問題があった模様。現在は[FastDev](https://developer.atlassian.com/docs/developer-tools/automatic-plugin-reinstallation-with-fastdev)のサイトに行くと

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

とあり、非推奨になっている。そして[AMPS-1271](https://ecosystem.atlassian.net/browse/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は無効にすること。これをしないとクラッシュするらしい。

```xml: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-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のプラグインをリロードさせたみた場合に標準出力された内容。リロードされたことが示されている。

```bash
[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をたたいてログレベルを変更すれば出力されるようになる。

```bash
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](https://developer.atlassian.com/docs/developer-tools/automatic-plugin-reinstallation-with-quickreload)には書かれていないのだが、[QuickReloadのリポジトリ](https://bitbucket.org/atlassianlabs/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で試した)は残念ながらほぼ変わらず。

```bash:pom.xml設定変更前
Server startup in 159525 ms
```

```bash:pom.xml設定変更後
Server startup in 160276 ms
```

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


# もっと速くしたい！

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




# 参考リソース

* [QuickReloadのリポジトリ](https://bitbucket.org/atlassianlabs/quickreload)
* [開発者向けのドキュメントにあるAutomatic Plugin Reinstallation with QuickReload](https://developer.atlassian.com/docs/developer-tools/automatic-plugin-reinstallation-with-quickreload)
* [Does fastdev work with a plugin that uses servlets/rest?](https://answers.atlassian.com/questions/32972059/answers/32973137)