tomcat-war包一键部署脚本

作者: 新签名 | 来源:发表于2019-04-19 16:22 被阅读15次

    背景

    目前大多数服务仍是以tomcat-war形式进行部署,在一些不具备自动化部署环境下,更换war包仍需手动,步骤重复且复杂,大概分为以下步骤:

    • 1、kill 掉tomcat。
    • 2、备份war包中属于该环境下的特有配置文件,如classes下的配置文件、web.xml
    • 3、删除webapps目录下之前的war包和已解压的包。
    • 4、移动新war包到webapps目录下,解压。
    • 5、替换原环境下的配置文件。
    • 6、启动tomcat

    部署次数少还可以接受,如果服务数量多起来,这样重复的步骤做不了几次就会让你崩溃,此时肯定会想如果能换上自动化部署工具(如:jenkins)就好了,但是自己说话没有话语权,仍需要忍着并不断的干着。

    既然不能改变环境,那就适应它,所以制作了一个中间脚本去适应它。

    需求

    先不放脚本而是说下需求,我们需要这个脚本干什么

    • 以上6个流程,肯定要一键帮我完成。
    • 该环境的配置文件有特有的配置,能单独拎出来,不用我再在一堆繁琐的tomcat中找;部署新包时也要能覆盖包里的文件。
    • 不要侵入这个tomcat,意味着tomcat文件夹下不要随意新增无用的文件,避免被别人说。

    介绍

    准备

    ok,有了上述需求,那我们就可以下手code了,下面贴出我的代码

    #!/bin/bash
    project_name=abc
    tomcat_path=/root/tomcat/tomcat-8080-abc
    work_path=/share/tmp/abc
    
    if [[ !(-f ${work_path}/war/${project_name}.war) ]]
    then
        echo "工作目录中,未检测到war包"
        exit 1;
    fi
    ######################################### kill启动过tomcat #########################################
    ## 建议tomcat目录命名格式为:tomcat-端口-项目名
    echo "1、kill之前启动过的${project_name}"
    eval $(ps --no-heading -aux |grep "${project_name}" | grep -v "grep"|awk '{print "kill -9 " $2}')
    
    ######################################### 备份配置文件 #########################################
    echo "2、备份${project_name}配置文件"
    #备份class下的配置文件
    if [[ !(-d "${work_path}/conf") ]]
    then
        mkdir -p "${work_path}/conf"
    fi
    if [[ -d "${tomcat_path}/webapps/${project_name}" ]]
    then
        awk 'BEGIN { cmd="cp -iR '"${tomcat_path}"'/webapps/'"${project_name}"'/WEB-INF/classes/* '"${work_path}"'/conf"; print "n" |cmd; }'
        echo ""
    else
      echo "未检测到部署的${project_name}文件夹"
    fi
    
    #备份web.xml文件
    if [[ !(-d "${work_path}/web") ]]
    then
        mkdir -p "${work_path}/web"
    fi
    if [[ -d "${tomcat_path}/webapps/${project_name}" ]]
    then
        awk 'BEGIN { cmd="cp -i '"${tomcat_path}"'/webapps/'"${project_name}"'/WEB-INF/web.xml '"${work_path}"'/web"; print "n" |cmd; }'
        echo ""
    else
      echo "未检测到部署的${project_name}文件夹"
    fi
    ######################################### 清除旧文件 #########################################
    echo "3、清除旧${project_name}文件"
    rm -rf "${tomcat_path}/webapps/${project_name}"*
    
    ######################################### 解压并移动 #########################################
    echo "4、解压并移动新的${project_name}文件"
    if [[ !(-d "/tmp/${project_name}") ]]
    then
        mkdir "/tmp/${project_name}"
    fi
    
    cp  "${work_path}/war/${project_name}.war" "/tmp/${project_name}/"
    cd "/tmp/${project_name}/"
    jar -xf "${project_name}.war"
    rm -f "/tmp/${project_name}/${project_name}.war"
    mv "/tmp/${project_name}" "${tomcat_path}/webapps/"
    rm -rf "/tmp/${project_name}"
    
    ######################################### 替换配置文件 #########################################
    echo "5、替换配置文件"
    cp -Rf "${work_path}/conf/"* "${tomcat_path}/webapps/${project_name}/WEB-INF/classes/"
    cp -Rf "${work_path}/web/web.xml" "${tomcat_path}/webapps/${project_name}/WEB-INF/web.xml"
    
    echo "6、重启${project_name}"
    
    ${tomcat_path}/bin/startup.sh
    
    
    

    这个shell中需要我们填写的信息有:

    • 项目名,即war包名去掉后缀。
    • 要替换的tomcat路径。
    • 工作区间路径。

    项目名tomcat路径很好明白,这里有必须要说下工作区间的概念,工作区间是具有特殊目录结构,包含要替换文件的目录。

    .
    ├── replace.sh
    └── war
        └── abc.war
    
    • replace.sh就是刚才一堆脚本,它的位置不强制放在工作区间下。
    • war包目录要求必须有,它仅包含了一个要部署的war包。

    运行

    放置好war包后,就可以执行replace.sh运行了。运行后,它会按照以上6个步骤执行,同步将配置文件抽取出来放到工作区间内,以下是运行后的工作目录:

    .
    ├── conf
    │   └── logback.xml
    ├── replace.sh
    ├── war
    │   └── abc.war
    └── web
        └── web.xml
    
    • conf目录自动生成,存放WEB-INF/classes/下的所有配置文件,可以编辑里面的文件内容,运行时会自动覆盖webapps/abc/WEB-INF/classes下的配置文件。
    • web目录自动生成,目前仅存放WEB-INF/下的web.xml文件,可以编辑web.xml,运行时会自动覆盖webapps/abc/WEB-INF/web.xml
    • 如有其他覆盖需求,请自行添加。

    结尾

    docker的volumes也支持类似的覆盖机制。

    相关文章

      网友评论

        本文标题:tomcat-war包一键部署脚本

        本文链接:https://www.haomeiwen.com/subject/sfhcgqtx.html