afnf.net

qdeploy-maven-pluginを作ったよ

Java Maven qdeploy-maven-plugin 2014/02/25 08:08

Mavenって便利ですね。本当に今さらですがw

だいたいは既存のプラグインで事足りたのですが、一つ困ったことがありました。

リモートデプロイが遅い!

プロダクション環境へデプロイはCargoのJetty Remote Deployerで行っていましたが、自宅回線の上りが狭いため、1分以上かかっていました。

blog-java1のwarは11MBですが、ほとんどをjarファイルが占めているので「だったら差分転送すればいいじゃん!」と思い、勉強がてらにqdeploy-maven-pluginというプラグインを作ってみました。類似のものがあるかどうかは調べてませんw

qdeployの仕組み

Jetty Remote Deployerと同様、予め配備したWebアプリケーションqdeploy-maven-webappと連係して動作します。

img

  1. ローカルのMavenで、qdeploy-maven-pluginのqdeploy:deployを実行する
  2. リモートのqdeploy-maven-webappへ、jarの一覧(サイズ、最終更新日)が送られる
  3. リモート側で、不足分のjarがあるかどうかチェック
  4. 2のレスポンスとして、不足分のjar一覧が返される
  5. 不足分があれば、ローカルからjarを送信
  6. ローカルから、jarを除いたwarファイルを送信
  7. リモート側で、warとjarのマージが行われ、Jettyのwebappsフォルダにコピーされる
  8. 自動または手動でJettyのリロードを行い、変更が適用される

jarに変更がなければ、jarを除外したwarファイル(200KB程度)の送信だけで済みます。

設定など

qdeploy-maven-webapp

qdeploy-maven-webappをcloneしてMavenのpackageを実行、warファイルをリモートにデプロイしておきます。

環境変数またはシステムプロパティーとして、以下を設定します。

key 説明
QDEPLOY_WARDIR warファイルコピー先のパス。/usr/local/jetty/webapps/とか、/usr/local/tomcat/webapps/のようになるはずです。
QDEPLOY_KEY 認証用の文字列。ローカルの設定と合わせる必要があります。十分に長い文字列を設定しておくべきですが、そもそもqdeploy-maven-webappをインターネットに公開しないよう注意してください。

qdeploy-maven-plugin

qdeploy-maven-pluginもcloneして、ローカルリポジトリにインストールしておきます。

pom.xmlの設定はこんな感じ。

<plugin>
    <groupId>net.afnf</groupId>
    <artifactId>qdeploy-maven-plugin</artifactId>
    <version>1.0.1</version>
    <configuration>
      <webappDir>target/myapp</webappDir>
      <finalName>myapp</finalName>
      <deployUrl>http://localhost:8080/qdeploy</deployUrl>
    </configuration>
</plugin>
var 説明
webappDir maven-war-pluginのpackage出力先。
finalName デプロイ後のコンテキスト名。
deployUrl デプロイ先のURL。sshトンネルを掘った方が良い。

環境変数またはシステムプロパティーとして、以下を設定します。

key 説明
QDEPLOY_KEY 認証用の文字列。リモートと合わせる必要があります。


goalは、前述の通りqdeploy:deployです。先にpackageを実行しておくようにしてください。参考までに、m2eの設定を晒します。cleanしてるのは、なんとなくです。

20140216_qdeploy production-normal

Jettyやnginxなど

ステージング環境のJettyについては、jetty-deploy.xmlのscanIntervalをデフォルトの1秒にしてあります。qdeploy:deploy完了直後にリロードが行われます。

プロダクション環境はscanIntervalを0とし、手動でJettyの再起動を行うようにしました。リロードを繰り返しているとOutOfMemoryErrorが出ますし、反映タイミングをコントロールしたかったので。

Jettyの再起動中は502エラーを返ることを利用して、"under maintenance"というhtmlが表示できるよう、nginxに以下を設定しました。

error_page  502  /maintenance.html;

良い感じです

junitも書いたし。テキトーだけど。

Mavenプラグインの作成はとても簡単です。maven-archetype-plugin archetypeでプロジェクトを作ると、もうすぐに動きます。先人達の努力に感謝。

Java Maven qdeploy-maven-plugin 2014/02/25 08:08
comments (0)

blog-java2 engine (build:2019-02-23 17:57 JST)