NDW

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

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






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


comment

メールアドレスが公開されることはありません。

関連記事

ASP.NET Core: 日本語の文字化け

ダイジェスト Visual Studio 2019で作成したASP.NET Coreプロジェクトで、プログラム(Razor)から日本語を出力するとHTMLエンコードされてしまいます。例えば「さしすせそ …

開発・検証用のダミーメールサーバの構築(fakeSMTP)

アプリ開発や検証等でメールサーバを利用したい場合がある。 プロジェクトで共有の検証用メールサーバを構築できると効率が良いか、その準備が間に合わなかったり、使用者が限定的な場合は、使用者の開発環境上に構 …

WindowsにApacheを構築

アプリケーション開発環境として主にWindowsを使っています。 開発時の検証で使用するミドルウェアがApacheを使用することが多いので、ここでは開発環境であるWindowsにApacheを構築する …

Webアプリテスト用のHTTPヘッダの追加

フロントに配置されたリバースプロキシサーバやロードバランサで設定されたHTTPヘッダを使用するWebアプリを開発することが多々あります。 このようなシナリオでは、設計に基づいて実装することはできますが …

JSFラジオボタン・チェックボックスとbootstrap

boostrapでラジオボタンやチェックボックスを使用する場合、div, input, label要素にbootstrapのCSSクラスを指定する必要がある。 JSFでラジオボタンを使用する場合、se …