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

配置部署
基本认识
.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包的程序

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

而后我们执行ansible命令来执行这个脚本就能部署到生产环境了,或者直接在命令里改成ansible的命令
此过程最大的难点就是
配置文件加入的位置
,与动态变化的应用路由
,如果是同一个应用的更新,配置文件会一直重叠下去,可能会导致路由混乱,再有就是配置文件在预生产环境下可以这样做,生产环境则不行,生产环境可以在gitlab上建一个配置文件仓库,一旦配置文件更新,就参数构建触发更新,将这个新的配置文件覆盖过去,替换旧的文件,但这样做其实也有风险,修改配置文件的人员必须修改正确!
网友评论