使用antrun实现远程服务器自动部署

背景:
后端开发的日常,频繁的mvn打包,且每次都需要上传到服务器并启动服务,如果仅有Tomcat服务还可以忍受,但是当服务比较复杂需要部署多个jar包war包时,不仅效率低下而且容易出错,手工部署就会变成程序员的噩梦。
antrun只需要简单的几部,就可以实现自动化部署,解放程序猿的双手~

步骤:
一、maven工程的pom.xml中配置antrun的相关插件(注意是工程的主pom)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <inherited>false</inherited>
            <id>default-cli</id>
            <configuration>
                <target>
                    <echo>start stopping provider</echo>
                    <sshexec host="${deploy.server.host}" username="root"
                        password="${deploy.server.password}" command="export PATH=$PATH:${deploy.jdk.bin.path};echo $PATH;${deploy.provider.path}/stop.sh"
                        failonerror="false" verbose="true" trust="true" />
                    <echo>start copying provider jar</echo>
                    <scp
                        localFile="demo/target/demo-0.0.1-SNAPSHOT.jar"
                        remoteToFile="root:${deploy.server.password}@${deploy.server.host}:${deploy.provider.path}/demo-0.0.1-SNAPSHOT.jar"
                        verbose="true" trust="true" />
                    <echo>start starting provider jar</echo>
                    <sshexec host="${deploy.server.host}" username="root"
                        password="${deploy.server.password}" command="export PATH=$PATH:${deploy.jdk.bin.path};echo $PATH;${deploy.provider.path}/run.sh"
                        failonerror="false" verbose="true" trust="true" />
                    <echo>start stopping Tomcat</echo>
                    <sshexec host="${deploy.server.host}" username="root"
                        password="${deploy.server.password}" command="export PATH=$PATH:${deploy.jdk.bin.path};echo $PATH;${deploy.tomcat.bin.path}/shutdown.sh"
                        failonerror="false" verbose="true" trust="true" />
                    <echo>start copying Tomcat war</echo>
                    <scp localFile="demo/target/demo.war"
                         remoteToFile="root:${deploy.server.password}@${deploy.server.host}:${deploy.tomcat.webapps.path}/demo.war"
                         verbose="true" trust="true" />
                    <echo>start starting Tomcat</echo>
                    <sshexec host="${deploy.server.host}" username="root"
                        password="${deploy.server.password}" command="export PATH=$PATH:${deploy.jdk.bin.path};echo $PATH;${deploy.tomcat.bin.path}/startup.sh"
                        failonerror="false" verbose="true" trust="true" /> 
                </target>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-jsch</artifactId>
            <version>1.10.1</version>
        </dependency>
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>
    </dependencies>
</plugin>

这段代码片段做了以下几件事:
1、关闭dubbo provider服务
2、将打包的provider服务jar包上传到服务器相应的路径
3、启动dubbo provider服务
4、关闭Tomcat
5、将打包的war包上传到服务器相应的路径
6、启动Tomcat

这里使用了maven-antrun-plugin插件,它可以执行ant target,进行拷贝文件,执行sh脚本、linux命令等。
1、sshexec

<sshexec host="${deploy.server.host}" username="root" password="${deploy.server.password}" command="export PATH=$PATH:${deploy.jdk.bin.path};echo $PATH;${deploy.provider.path}/stop.sh"
failonerror="false" verbose="true" trust="true" />

作用是建立一个远程的shell连接。远程服务器的地址、用户名、密码可以通过变量自行定义。command=后面跟着的就是Linux命令。可以同时发送多条指令,指令间用“;”分隔。(command后的指令在后面进行具体分析)
注意:trust属性一般设置为true, 如果为默认值false时,那么就要求你所连接的host必须存在于你的knownhosts文件中,并且这个文件也必须是存在的
2、scp

<scp localFile="demo/target/demo-0.0.1-SNAPSHOT.jar"
remoteToFile="root:${deploy.server.password}@${deploy.server.host}:${deploy.provider.path}/demo-0.0.1-SNAPSHOT.jar" verbose="true" trust="true" />

作用是将本地的文件拷贝到远程服务器。localFile指定本地文件放置的位置,也就是打包后的jar包或者war包位置;remoteToFile指定了远程服务器的地址、用户名、密码、文件拷贝位置。

涉及到的变量可以在pom.xml中通过properties来配置,如下:

<properties>
    <deploy.server>webserver</deploy.server>
    <deploy.server.host>xxx.xx.xx.xx</deploy.server.host>
    <deploy.server.password>abc123</deploy.server.password>
    <deploy.tomcat.bin.path>/home/demo/apache-tomcat-8.5.31/bin</deploy.tomcat.bin.path>
    <deploy.tomcat.webapps.path>/home/demo/apache-tomcat-8.5.31/webapps</deploy.tomcat.webapps.path>
    <deploy.provider.path>/home/demo/provide</deploy.provider.path>
    <deploy.jdk.bin.path>/data/jdk1.8.0_181/bin</deploy.jdk.bin.path>
</properties>

二、编写shell脚本,实现服务的关闭和启动
从第一步可以看出,停止和启动服务,是通过远程调用shell脚本来实现的,下面我们就来编写脚本。
1、启动dubbo provider脚本

#!/bin/bash
java -jar /home/demo/provide/demo-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
echo $! > /home/demo/provide/demo.pid
sleep 20

a、后台运行的方式启动jar包;
b、将进程的pid记录到文件。为了关闭该进程做准备;
c、等待20s。因为紧接着要启动Tomcat,需要延时一会儿是为了保证dubbo服务完全启动。

2、关闭dubbo provider脚本

#!/bin/bash
PID=$(cat /home/demo/provide/demo.pid)
kill -9 $PID

a、从文件中读取进程pid
b、kill进程

3、关闭、启动Tomcat的脚本
shutdown.sh和startup.sh是Tomcat自带,不需要另写,只要把脚本所在位置配置好即可。

三、执行过程中遇到的问题:
启动jar包和war包时,找不到JAVA_HOME的环境变量,导致运行失败。
原因:
ant的sshexec连接的时候,是不会执行/etc/profile ~/.profile ~/.bash_profile的,于是这个会话当中etc/profile定义的JAVA_HOME环境变量就没有生效。
解决办法:
第一步中的代码片段可以看到解决办法:

<sshexec host="${deploy.server.host}" username="root" password="${deploy.server.password}" command="export PATH=$PATH:${deploy.jdk.bin.path};echo $PATH;${deploy.provider.path}/stop.sh"
failonerror="false" verbose="true" trust="true" />

command后有三条指令:

export PATH=$PATH:${deploy.jdk.bin.path}
echo $PATH
${deploy.provider.path}/stop.sh

a、将jdk的路径配置到环境变量中,只在该shell中生效;
b、回显环境变量path,看一下是否成功配置;
c、执行脚本。

以上。

参考文档:
https://www.cnblogs.com/chenpi/p/5715029.html
http://sky425509.iteye.com/blog/2074264
https://blog.csdn.net/hnoysz/article/details/78666272
https://blog.csdn.net/u79501/article/details/68925353

猜你喜欢

转载自blog.csdn.net/eleanoryss/article/details/81455931