假设当前项目的名称为 osmp
1、在 Linux 服务器上创建一个新的账户, 账户名为 dev
。该账户主要用户部署程序
2、在 ~ 目录(用户的根目录)下,新建 osmp
文件夹,在 osmp
下新建 deploy
文件夹
Note
由于当前用户为 dev , 则当前用户的根路径一般为 /dev 。除非实施人员通过配置文件修改过用户名。所以,上面目录结构中, op 文件夹的全路径为 /dev/osmp/deploy/op
添加 Maven Plugin
在发布工程 pom.xml
文件中,分别引入资源管理插件和maven远程发布插件:
-
maven-resources-plugin
: 在执行后面的 mvn 指令时,会自动将app-run.sh
上传到服务器 -
wagon-maven-plugin
: 用于执行 sh 脚本
示例如下:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy setting file</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>app-run.sh</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>2.0.0</version>
<configuration>
<fromDir>target</fromDir>
<includes>*.jar,*.properties,*.yml,*.sh</includes>
<url>scp://dev:mypwd@10.14.2.27/dev/osmp/deploy/op</url>
<commands>
<command>cd /dev/osmp/deploy/op;sed -i 's/\r$//' app-run.sh;chmod 777 app-run.sh;./app-run.sh deploy</command>
</commands>
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>
</plugin>
</plugins>
配置 wagon-maven-plugin 插件
-
wagon-maven-plugin
标签下的url
标签,路径组成:
## scp://linux服务器账号:密码@linux服务器地址/项目发布目录
## scp 是 linux 的命令,请不要在 windows 上进行测试。
scp://dev:mypwd@10.14.2.27/dev/osmp/deploy/op
- command标签,该处的项目发布目录与中的项目发布目录一致,其他不需要改动,如:
## cd 项目发布目录;chmod 777 app-run.sh;./app-run.sh deploy
cd /dev/osmp/deploy/op;chmod 777 app-run.sh;./app-run.sh deploy
新建 app-run.sh
在工程的 resources
目录下,新建文件:app-run.sh
,内容如下:
Note
.sh 是 Linux 的脚本文件。 类似于 Windows 平台的 .bat 文件。
这里使用 Maven 插件,有换行符问题,有下面两种解决版本。
-
使用 Linux 的 sed 命令 (本文档中使用)
-
使用 Linux 的 dos2unix 工具
yum -y install dos2unix
apt-get install dos2unix
需要修改的地方有三处:
- 将
jar
的值:op-web
,改为发布的jar包名称 - 将
SERVICE_NAME
的值:op
,改为发布的工程名称 - 将
APP_PATH
的值:/dev/osmp/deploy
,改为实际发布的工程目录
#将jar的值:op-web,改为发布的jar包名称
JAR=op-web
RUN_JAR=$JAR-running
#将SERVICE_NAME的值:op,改为发布的工程名称
SERVICE_NAME=op
JAVA_OPTS=" -Xms256M -Xmx512M"
#将APP_PATH的值:/dev/osmp/deploy,改为实际发布的工程目录
APP_PATH=/dev/osmp/deploy
#设置链路跟踪的地址 Dskywalking
Dskywalking_Server=10.14.2.27:11800
deploy(){
echo "=============================deploy=============================="
if [ -f "$APP_PATH/$SERVICE_NAME/$RUN_JAR.jar" ];then
if [ -f "$APP_PATH/$SERVICE_NAME/$RUN_JAR.jar.old" ];then
echo "remove old file"
rm $RUN_JAR.jar.old -f
fi
echo "save current jar to old file"
mv $RUN_JAR.jar $RUN_JAR.jar.old
echo "rename current jar to running"
mv $JAR.jar $RUN_JAR.jar
stop
fi
mv $JAR.jar $RUN_JAR.jar
start
}
start() {
echo "=============================start=============================="
PID_CMD="ps -ef | grep $RUN_JAR | grep -v grep | awk '{print \$2}'"
PID=$(eval $PID_CMD)
if [[ -n $PID ]]; then
echo "Application is already running, PID is $PID"
else
nohup java $JAVA_OPTS -javaagent:$APP_PATH/apm/agent/skywalking-agent.jar -Dskywalking.agent.service_name=$SERVICE_NAME -Dskywalking.collector.backend_service=$Dskywalking_Server -jar $RUN_JAR.jar >/dev/null 2>&1 &
echo "Application has run by skywalking-agent!!!"
PID=$(eval $PID_CMD)
if [[ -n $PID ]]; then
echo "Start Application successfully, PID is $PID"
else
echo "Failed to start Application!!!"
fi
fi
echo "=============================start=============================="
}
stop() {
echo "=============================stop=============================="
PID_CMD="ps -ef | grep $RUN_JAR | grep -v grep | awk '{print \$2}'"
PID=$(eval $PID_CMD)
if [[ -n $PID ]]; then
kill -15 $PID
sleep 5
PID=$(eval $PID_CMD)
if [[ -n $PID ]]; then
echo "Stop Application failed by kill -15 $PID, begin to kill -9 $PID"
kill -9 $PID
sleep 2
echo "Stop Application successfully by kill -9 $PID"
else
echo "Stop Application successfully by kill -15 $PID"
fi
else
echo "Application is not running!!!"
fi
echo "=============================stop=============================="
}
restart() {
echo "=============================restart=============================="
stop
start
echo "=============================restart=============================="
}
status() {
echo "=============================status=============================="
PID_CMD="ps -ef | grep $RUN_JAR | grep -v grep | awk '{print \$2}'"
PID=$(eval $PID_CMD)
if [[ -n $PID ]]; then
echo "Application is running, PID is $PID"
else
echo "Application is not running!!!"
fi
echo "=============================status=============================="
}
info() {
echo "help: help info"
}
help() {
echo "deploy: deploy server"
echo "start: start server"
echo "stop: shutdown server"
echo "restart: restart server"
echo "status: display status of server"
echo "info: display info of server"
echo "help: help info"
}
case $1 in
deploy)
deploy
;;
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
info)
info
;;
help)
help
;;
*)
help
;;
esac
exit $?
使用
在发布工程所在目录,执行命令:
mvn clean package -DskipTests wagon:upload wagon:sshexec