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

主に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, シェルスクリプト

執筆者:


comment

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

関連記事

.NET Core: Azure AD B2Cユーザアカウント操作のサンプル

概要 管理者がAzure AD B2Cのユーザアカウントの管理が行えるASP.NET Coreのアプリの開発を想定している。Azure AD B2Cユーザアカウントの作成や更新等の操作はMicroso …

grid

Excelで月初日、第1週日、第2週日を算出する

プロジェクト管理で毎年、毎月のタスクを管理するために、この辺の操作を行うためのExcel関数を調べたので記載しておきます。 Excelの関数式 ここでは、基本的に5営業日単位で管理したいことと、最初の …

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

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

パスワード情報の保管方式の比較

Webアプリの開発でパスワードを使ったユーザ認証を設計・実装する機会がよくある。 後輩への説明や勉強会ネタとして、この辺の話を纏めてみようと思う。 概要 オンラインバンキングやネットショッピングのサイ …

localhost(pfx)をPEM形式の証明書と鍵に変換

開発環境にて、Visual Studioのインストール時に追加されるlocalhostサーバ証明書(IIS Express Development Certificate)を、Apache httpd …