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要素で別途定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | <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を実行します。
実行結果の例は次の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | [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] ------------------------------------------------------------------------ |