アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

1. システムエンジニアリング eap/wildfly maven シェルスクリプト

リモートからのwarデプロイの自動化

投稿日:


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] ------------------------------------------------------------------------






-1. システムエンジニアリング, eap/wildfly, maven, シェルスクリプト

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Windows Updateが終わらない問題

ふと会社で使っているPCのWindows Updateがほとんど当たっていないことに気づいた。 手動でWindows Updateを実行すると、30分、1時間たっても終わらない… これは何 …

開発環境のJBoss EAP7にリモートアクセス

開発中のものを他者に見せたり、問題が発生している開発者の開発物を参照するために、eclipse上で起動しているEAP7のWebアプリに別のPCからアクセスしたい場合があります。 このための手順を記載し …

マスタデータ生成ツール

開発や結合試験、本番環境等で使用するマスタデータをExcelで管理することがあります。 そのようなExcelファイルからDBに登録するためのインサート文を作成するために、いつもツールに悩むので作成して …

Wildfly11のインストール

このサイトでWebアプリを公開したい。 仕事ではJBoss Enterprise Application Server(JBoss EAP)を使う機会が多いのでそれを使いたいがライセンス料がかかる。無 …

技術検証

Linuxでの gdrive の使い方

wordpressのデータをgoogle driveにバックアップするための基礎調査を行っている。 google driveに接続可能なライブラリは幾つかあるようだが、ここでは無料でお手軽に始められそ …



プロフィール ゆっきーです。
都内でシステムエンジニアをやっています。
もっと詳細を見る