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

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

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

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

投稿日:2019年5月5日 更新日:


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


(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

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

執筆者:

関連記事

テキストファイルマスクツール

本番環境での性能検証でNGになってしまった。 どの処理でどれほどの処理時間がかかっているかを把握するためにログレベルを変更して、ログを取得した。 対応方法を自社の担当者と検討するために、本番環境からこ …

wildflyアップロードサイズ上限

多くのWebサーバやAPサーバでは、サーバリソースの過剰な消費やDoS攻撃に対する対処として、アップロードの最大サイズが決められている。(厳密には、ブラウザから入力値やファイル等のデータを送信するため …

保守運用

運用 と 保守 の 違い

若い頃は 運用 と 保守 の違いを調べても良くわからなかった… この辺を使い分けられる人をほとんど見たことない… ある事項が運用なのか保守なのかの話をすると認識が合わない&#8 …

EAP7のインストールとパッチ適用

仕事でredhat社のEnterprise Application Server7(EAP7)を扱うことが多いので備忘録として記載します。 なお、このサイトでWebアプリを公開したいと考えていますが、 …

CentOS7のマルチホーム化

サイトの存在を隠しつつも、sftpサーバを公開し、後輩と1G以上のファイルのやりとりしたい。 パブリック側のIPアドレスを教えてしまうと、どこのサーバだろうかとブラウザで開いたりするとサイトの存在がわ …

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