JavaEEベースのツールを公開しているが、デプロイの都度、warファイルをサーバにコピーしてwildflyにデプロイするのが面倒なので、mavenで自動化しました。
前提
- mavenのプラグインと後述のwarデプロイスクリプトで実現します。
- 使用するmavenプラグインはmaven-antrun-pluginです。maven-antrun-pluginでリモートコピー、リモート実行するために、jschとant-jschを使用します。
- リモートのLinux上のwildflyにデプロイするために、warデプロイスクリプトが配置されているものとします。配置場所は、”~someuser/deploying/deploy.sh”を前提としています。
- リモートサーバへのファイルコピーやスクリプト実行のため、リモートサーバにsshで接続します。この際の認証は、パスワード認証ではなく、公開鍵認証を使う前提です。
mavenの構成
開発環境であるローカルで作成したwafファイルを、リモートのLinuxサーバで稼働するwildflyにデプロイします。
コマンドラインやeclipse上からmavenのdeployフェーズを実行した際にこの処理を実行できるようpom.xmlを構成します。
環境に依存する可能性のある変数群はprofile要素で別途定義します。
<project ...
<build>
<!-- 最終成果物warの名称: バージョン情報を除外 -->
<finalName>${project.artifactId}</finalName>
<!-- 既定のdeployフェーズの動作をスキップ -->
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<!-- 既定のdeployフェーズとしてmaven-antrun-pluginでantを実行 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>deply-to-remote</id>
<phase>deploy</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo message="デプロイ開始==========" />
<scp
file="${project.build.directory}/${project.artifactId}.war"
todir="${deploy.username}@${deploy.server}:${deploy.todir}/"
password=""
keyfile="${deploy.keyfile}"
trust="true" />
<sshexec host="${deploy.server}"
username="${deploy.username}"
keyfile="${deploy.keyfile}"
trust="true"
command="${deploy.todir}/${deploy.exec}" />
<echo message="デプロイ終了==========" />
</target>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
<dependency>
<!-- 1.6.5等の古い版だと標準出力が出なくなる -->
<!-- 1.7からgroupIdが変更 -->
<!-- <groupId>ant</groupId> -->
<!-- <artifactId>ant-jsch</artifactId> -->
<!-- <version>1.6.4</version> -->
<groupId>org.apache.ant</groupId>
<artifactId>ant-jsch</artifactId>
<version>1.10.5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>activeProfile</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<deploy.server>someserver</deploy.server>
<deploy.username>someuser</deploy.username>
<deploy.todir>~/deploying</deploy.todir>
<deploy.keyfile>C:\xxx</deploy.keyfile>
<deploy.exec>deploy.sh</deploy.exec>
</properties>
</profile>
</profiles>
</project>| 行番号 | 説明 |
|---|---|
| 9-18 | deployフェーズに対応する既定のmavenプラグインが実行されるとエラーになってしまうので、これを抑制(skip)する。 |
| 29-30 | deployフェーズ実行時にmaven-antrun-pluginのgoalを実行(ant実行)する。 |
| 36-41 | scpコマンドでリモートサーバにwarファイルをコピーする。 |
| 42-46 | ssh経由でリモートのスクリプトを実行する。 |
| 52-68 | 上記のsshやsshexecの実行に必要なライブラリの宣言。 |
| 74-86 | 上記で参照しているプロパティの定義。 |
実行方法
eclipseから実行すること場合、プロジェクトを選択し、[実行] – [実行の構成]を選択します。
構成の作成、管理、および実行ウインドウで、[mavenビルド]を選択し、deployを実行します。
実行結果の例は次の通りです。
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< xxx >-------------------
[INFO] Building xxx 1.0.0
[INFO] --------------------------------[ war ]---------------------------------
...
[INFO] Building war: C:\xxx\sampleapp.war
[INFO] WEB-INF\web.xml already added, skipping
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ xxx ---
...
[INFO]
[INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ xxx ---
[INFO] Skipping artifact deployment
[INFO]
[INFO] --- maven-antrun-plugin:1.8:run (deply-to-remote) @ xxx ---
[INFO] Executing tasks
main:
[echo] デプロイ開始==========
[scp] Connecting to someserver:22
[scp] done.
[sshexec] Connecting to someserver:22
[sshexec] cmd : ~/deploying/deploy.sh
[2019-05-05 20:13:55.143] start deploying
[2019-05-05 20:14:03.858] backup to: /home/someuser/deploying/old/sampleapp.war.20190505_201355
[2019-05-05 20:14:03.906] end deploying(result: 0)
[echo] デプロイ終了==========
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.731 s
[INFO] Finished at: 2019-05-05T20:14:15+09:00
[INFO] ------------------------------------------------------------------------
