Mavenって便利ですね。本当に今さらですがw
だいたいは既存のプラグインで事足りたのですが、一つ困ったことがありました。
プロダクション環境へデプロイはCargoのJetty Remote Deployerで行っていましたが、自宅回線の上りが狭いため、1分以上かかっていました。
blog-java1のwarは11MBですが、ほとんどをjarファイルが占めているので「だったら差分転送すればいいじゃん!」と思い、勉強がてらにqdeploy-maven-pluginというプラグインを作ってみました。類似のものがあるかどうかは調べてませんw
Jetty Remote Deployerと同様、予め配備したWebアプリケーションqdeploy-maven-webappと連係して動作します。
jarに変更がなければ、jarを除外したwarファイル(200KB程度)の送信だけで済みます。
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も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してるのは、なんとなくです。
ステージング環境の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でプロジェクトを作ると、もうすぐに動きます。先人達の努力に感謝。