wagon-maven-plugin插件实现自动化构建部署到服务器

概述

一般情况下,小公司的基础设施不完善,并没有一个功能齐备完善的服务自动化构建发布pass平台,此时就需要我们手动将项目的构建物,如 jar/war 上传到 Linux 服务器,然后再手动启动 start 脚本。

于是产生这样的需求:能否实现将mvn install生成的 jar/war 上传部署到远程 Linux 服务器,并重启服务,实现一定程度的自动化?

wagon-maven-plugin就是能实现这个功能的一款maven插件。

实现

首先,在pom.xml文件的<build>里新增配置:

<extensions>
    <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ssh</artifactId>
        <version>3.0.0</version>
    </extension>
</extensions>

<build><plugins>下面新增配置:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>wagon-maven-plugin</artifactId>
    <version>1.0</version>
    <configuration>
        <serverId>114.215.175.236</serverId>
        <fromFile>target/${project.artifactId}.jar</fromFile>
        <url>scp://root@114.215.175.236/home/hpba/HPBA/ALM//extractor-alm</url>
        <commands>
			<command>sh /data/apps/arm-webapp/arm-webapp-jar-start.sh</command>
		</commands>
    </configuration>
</plugin>

同时还需要在本地 maven 的 setting.xml 文件里面配置这个 server 的用户名和密码,使得 ssh 可以正常连接到 server:

<server>
	<id>114.215.175.236</id>
	<username>root</username>
	<password>111</password>
</server>

完成上述配置项之后,打开maven面板,发现多了一个wagon plugin:
在这里插入图片描述
我们主要关注3项:

  • upload是上传整个文件夹,此时上述配置(仅仅只需要上传一个 jar)不生效
  • 使用upload-single,实现将单个文件scp上传部署到Linux server,默认覆盖原文件。
  • 使用sshexec,即执行 pom.xml 文件里面配置的command:sh /data/apps/arm-webapp/arm-webapp-jar-start.sh,注意使用sh执行脚本,不能使用./aaa.sh方式。否则报错:Failed to execute goal org.codehaus.mojo:wagon-maven-plugin:1.0:sshexec (default-cli) on project arm-webapp: Unable to execute remote command

步骤:

  1. 在 terminal 里输入命令: mvn clean install
  2. 双击 wagon:upload-single,第一次执行时,需要输入yes确认:在这里插入图片描述
    验证是否上传成功,进入到上述配置目录,使用 ll 目录查看 jar 的构建时间戳即可。
  3. 双击 wagon:sshexec,即可实现脚本执行。脚本的功能:杀掉当前服务进程,并重启。
    验证服务是否重启,输入 jps,若 pid 发生变化,则表明服务已重启。

至此,将大部分手动操作实现自动化。

附上:

#!/bin/bash

APP=arm-webapp;
PORT=6100;
DEBUG=false;

SH=$(readlink -f "$0")
if [ "$1" = "--debug=false" ]; then
  echo $SH
  sed -i "s/^DEBUG=true;/DEBUG=false;/g" "$SH"
  echo -e "\033[0;31m debug set false,please rerun \033[0m"
  exit 0
elif [ "$1" = "--debug=true" ]; then
  echo $SH
  sed -i "s/^DEBUG=false;/DEBUG=true;/g" "$SH"
  echo -e "\033[0;31m debug set true,please rerun \033[0m"
  exit 0
fi

BIN="$APP.jar"
DEBUG_PORT="3$PORT"
PWD=`pwd`
PID=`ps -eaf |grep java | grep $BIN | awk '{print $2}'`
SHELL_FOLDER=$(dirname $(readlink -f "$0"))
LOG_HOME="$SHELL_FOLDER/logs"
BIN_HOME="$SHELL_FOLDER/bin"

if [ -z "$APP" ]; then
  echo "no app";
  exit 1;
fi

if [ -n "$PID" ]; then
  echo "kill $PID"
  kill -9 $PID
fi

if [ "$DEBUG" = "true" ]; then
  echo -e "\033[0;31m debug is open,port=$DEBUG_PORT \033[0m"
  JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=y"
fi

JAVA_HEAP_DUMP_OPTS=-XX:HeapDumpPath=$LOG_HOME/dump.hprof
JAVA_OPTS="$JAVA_OPTS -Dserver.port=$PORT -Dlog.home=$LOG_HOME -Duse.flume=false -Xms128m -Xmx2048m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=1024m -Dfile.encoding=utf-8 -XX:+HeapDumpOnOutOfMemoryError $JAVA_HEAP_DUMP_OPTS"

nohup java $JAVA_OPTS -jar $BIN_HOME/$BIN >$LOG_HOME/console.log 2>&1 &
posted @ 2021-02-24 22:37  johnny233  阅读(15)  评论(0编辑  收藏  举报  来源