java程序UAT的部署

UAT預(yù)發(fā)布環(huán)境

環(huán)境準備

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

假設(shè)從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

#創(chuàng)建打包目錄
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

#指定發(fā)布方式
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

實現(xiàn)自動化部署項目的腳本

#!/bin/bash
#傳入項目名
PROJECT_NAME=$1
#獲取應(yīng)用網(wǎng)頁狀態(tài)碼
curl -I `hostname -i`:9090/${PROJECT_NAME}/ > /root/a.txt
#導(dǎo)入配置文件
conf="<Context  path =${PROJECT_NAME}  docBase ='/usr/local/tomcat-8.5/webapps/${PROJECT_NAME}' debug ='0'  privileged ='true'  reloadable ='false' > </Context> "
#導(dǎo)入配置文件的位置
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端口已經(jīng)成功啟動拉!"
else 
  echo "tomcat的9090端口未能成功啟動"
fi
#讀取狀態(tài)碼文件
while read line
do
  if [ $(grep -o 200 /root/a.txt) -eq 200 ];then
    echo "應(yīng)用訪問成功"
  else
    echo "應(yīng)用訪問失敗"
  fi
uniq -d
done</root/a.txt


image.png

而后我們執(zhí)行ansible命令來執(zhí)行這個腳本就能部署到生產(chǎn)環(huán)境了,或者直接在命令里改成ansible的命令

此過程最大的難點就是配置文件加入的位置,與動態(tài)變化的應(yīng)用路由,如果是同一個應(yīng)用的更新,配置文件會一直重疊下去,可能會導(dǎo)致路由混亂,再有就是配置文件在預(yù)生產(chǎn)環(huán)境下可以這樣做,生產(chǎn)環(huán)境則不行,生產(chǎn)環(huán)境可以在gitlab上建一個配置文件倉庫,一旦配置文件更新,就參數(shù)構(gòu)建觸發(fā)更新,將這個新的配置文件覆蓋過去,替換舊的文件,但這樣做其實也有風(fēng)險,修改配置文件的人員必須修改正確!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容