概述
一般情况下,小公司的基础设施不完善,并没有一个功能齐备完善的服务自动化构建发布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
步骤:
- 在 terminal 里输入命令:
mvn clean install
- 双击
wagon:upload-single
,第一次执行时,需要输入yes确认:
验证是否上传成功,进入到上述配置目录,使用 ll
目录查看 jar 的构建时间戳即可。 - 双击
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 &