美文网首页IT必备技能
java程序UAT的部署

java程序UAT的部署

作者: 夜醉梦紅尘 | 来源:发表于2019-12-18 22:11 被阅读0次

    UAT预发布环境

    环境准备

    apache-maven-3.6.2
    apache-tomcat-8.5.50
    jdk1.8.0_181

    /etc/profile

    export JAVA_HOME=/usr/local/java/jdk1.8.0_181
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    
    

    假设从jenkins得到的war包和jar包,放到了/app
    https://github.com/efsavage/hello-world-war/blob/master/dist/hello-world.war

    image.png

    配置部署

    基本认识
    .jar 包的文件可直接用 java -jar .jar包名可直接运行 .jar包文件
    .war 包需要将文件放入tomcat下的webapps目录下,并且配置conf/server.xml文件才能自动解压运行
    具体添加如下:

    <Context  path ="/hello"  docBase ="/usr/local/tomcat-8.5/webapps/hello-world"
            debug ="0"  privileged ="true"  reloadable ="false"  >  
    </Context>
    

    而后启动tomcat就能运行文件,访问IP:9090/hello 得到.war包的程序

    image.png

    jenkins流水线脚本

    #!/bin/bash
    
    PROJECT_NAME=$1
    SERVICE_STATUS=$2
    PUBLISH_TYPE=$3
    PACKAGE_VERSION=$4
    ROLLBACK_VERSION=$5
    
    #创建打包目录
    mkdir /data/nfs/maven-package
    
    cd /data/nfs/maven-package
    
    #拉取项目代码
    git clone git@gitlab.com:roucute/${PROJECT_NAME}.git
    
    #maven打包
    mvn clean package -Dmaven.test.skip=true
    
    #判断打包的时jar包还是war包,同时将包名该为项目名加版本号
    if [ -f '/data/nfs/maven-package/target/*.jar' ]; then
        cp -rp /data/nfs/maven-package/target/*.jar /java-app-package/${PROJECT_NAME}/${PACKAGE_VERSION}.jar
    else
        cp -rp /data/nfs/maven-package/target/*.war /java-app-package/${PROJECT_NAME}/${PACKAGE_VERSION}.war
    fi
    
    #指定发布方式
    if [ ${PUBLISH_TYPE} == publish ]; then
        ansible -i dev-hosts  -m copy -a 'src=/java-app-package/${PROJECT_NAME}/${PACKAGE_VERSION}.[jw]ar dest=/app'
    elif [ ${PUBLISH_TYPE} == reback_one ]; then
        REBACK=$(ls /java-app-package/${PROJECT_NAME}/ | sort -n |tail -2|head -1)
        ansible -i dev-hosts  -m copy -a 'src=/java-app-package/${PROJECT_NAME}/${REBACK}.[jw]ar dest=/app'
    else
        REBACK=$(ls /java-app-package/${PROJECT_NAME}/ | sort -n |tail -3|head -1)
        ansible -i dev-hosts  -m copy -a 'src=/java-app-package/${PROJECT_NAME}/${REBACK}.[jw]ar dest=/app'
    fi
    
    #指定版本回退
    if [ ! -z ${ROLLBACK_VERSION} ]; then
        ansible -i dev-hosts  -m copy -a 'src=/java-app-package/${PROJECT_NAME}/${ROLLBACK_VERSION}.[jw]ar dest=/app'
    fi
    
    

    实现自动化部署项目的脚本

    #!/bin/bash
    #传入项目名
    PROJECT_NAME=$1
    #获取应用网页状态码
    curl -I `hostname -i`:9090/${PROJECT_NAME}/ > /root/a.txt
    #导入配置文件
    conf="<Context  path =${PROJECT_NAME}  docBase ='/usr/local/tomcat-8.5/webapps/${PROJECT_NAME}' debug ='0'  privileged ='true'  reloadable ='false' > </Context> "
    #导入配置文件的位置
    let location=$(cat /usr/local/tomcat-8.5/conf/server.xml |wc -l )-4
    
    cp /app/*.[jw]ar /usr/local/tomcat-8.5/webapps/      
    #将包移动到tomcat目录下
    sed -ri "${location}i ${conf}" /usr/local/tomcat-8.5/conf/server.xml  
    #添加配置文件以启动app
    sh /usr/local/tomcat-8.5/bin/startup.sh             
    #启动tomcat
    
    #检查端口
    if [ $(ss -ntal |grep 9090|awk -F':::' '{print$2}') -eq 9090 ];then
      echo "tomcat的9090端口已经成功启动拉!"
    else 
      echo "tomcat的9090端口未能成功启动"
    fi
    #读取状态码文件
    while read line
    do
      if [ $(grep -o 200 /root/a.txt) -eq 200 ];then
        echo "应用访问成功"
      else
        echo "应用访问失败"
      fi
    uniq -d
    done</root/a.txt
    
    
    
    image.png

    而后我们执行ansible命令来执行这个脚本就能部署到生产环境了,或者直接在命令里改成ansible的命令

    此过程最大的难点就是配置文件加入的位置,与动态变化的应用路由,如果是同一个应用的更新,配置文件会一直重叠下去,可能会导致路由混乱,再有就是配置文件在预生产环境下可以这样做,生产环境则不行,生产环境可以在gitlab上建一个配置文件仓库,一旦配置文件更新,就参数构建触发更新,将这个新的配置文件覆盖过去,替换旧的文件,但这样做其实也有风险,修改配置文件的人员必须修改正确!

    相关文章

      网友评论

        本文标题:java程序UAT的部署

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