基于 Maven 自动部署

假设当前项目的名称为 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
上一篇:PROTAC分子的重要应用丨疾病相关研究


下一篇:学透CSS- :root + vm/vh 实现响应式字体!!!