lrx182125 发表于 2018-8-22 06:38:20

粗浅的增量代码上线shell脚本--菜鸟版

#!/bin/sh  
#set -x
  
#auther: gushao
  
#time: 2014-5-30
  

  

  
#设置初始变量
  
#$1 参数说明 1前台   2后台   3app
  

  
#用于区分测试环境上线和生产环境上线
  
env_test=1
  
case $env_test in
  
1)
  
REMOTE_IP=192.168.1.110
  
PARTS=22
  
#用于服务器重启时用
  
REMOTE_IP10=192.168.1.110
  
REMOTE_IP11=192.168.1.111
  
REMOTE_IP12=192.168.1.112
  
PARTS_RESIN10=22
  
PARTS_RESIN11=22
  
PARTS_RESIN12=22
  
;;
  
2)
  
REMOTE_IP=211.162.125.207
  
PARTS=1573
  
#用于服务器重启时用
  
REMOTE_IP10=211.***.125.2**
  
REMOTE_IP11=211.***.125.***
  
REMOTE_IP12=211.**.125.***
  
PARTS_RESIN10=1573
  
PARTS_RESIN11=10011
  
PARTS_RESIN12=10012
  
;;
  
*)
  
echo "输入参数有无,选择测试或正式环境"
  
exit 1
  
;;
  
esac
  

  
#中间路径变量
  
edir=`date +%Y-%m-%d`/`date +%H%M%S`
  
rdate=`date +%Y-%m-%d_%H%M%S`
  
NDATE=`date +%Y-%m-%d\ %H:%M:%S`
  
DET_RYD=/home/resin/project_name #本地同步代码
  
DET_TOMCAT=/home/resin/tomcat/webapps
  
DET_APP=/opt/tomcat_app/webapps
  
#用于ssh同步时,需要同步到的目录
  
DET_RYD_HOME=/home/resin/
  
DET_TOMCAT_HOME=/home/resin/tomcat
  
DET_APP_HOME=/opt/tomcat_app
  
SOURCE_RYD="/home/demo/demo_ryd/project_name"   #存放需要升级的代码路径
  
SOURCE_TOMCAT="/home/demo/demo_tomcat/webapps"
  
SOURCE_APP="/home/demo/demo_app/webapps"
  
#日志保存位置
  
LOG_RYD_BACK=/home/resin/log_back/project_name
  
LOG_TOMCAT_BACK=/home/resin/log_back/tomcat
  
LOG_APP_BACK=/home/resin/log_back/APP
  
LOG_PATH=/home/resin/codeupdate.log                        #日志文件位置
  
#将改变的代码,从服务器上保存到制定的路径
  
REVAL_RYD=/home/resin/reval_back/ryd/ryd
  
REVAL_TOMCAT=/home/resin/reval_back/tomcat/tomcat
  
REVAL_APP=/home/resin/reval_back/app/app
  
#保存这次上传的代码
  
CODE_RYD_BACK=/home/resin/code_bak/ryd/ryd
  
CODE_TOMCAT_BACK=/home/resin/code_bak/tomcat/tomcat
  
CODE_APP_BACK=/hom/resin/code_bak/app/app
  
DEBUG=1
  
#调试模块,判断代码执行结果,指令执行出错后输出出错信息
  
function altert() {
  
#usage:alert
  
if [ "$1" -ne 0 ]
  
then
  
echo ":$2 指令执行错误" >&2
  
echo "指令执行错误,请检查错误原因,继续请回车"
  
read x
  
fi
  
}
  
#此函数的做用是遍历$1的目录source,寻找$2目录中是否有一致的文件det,并输出不同的信息
  
#本脚本中此函数的变量$1为需要上传的文件,$2是服务器同步到本地的文件
  
function ergodic(){
  
#echo "$4"
  
INIT_PATH=$3
  
#usage: ergodic $1$2 $3=$1
  
for file in ` ls $1`
  
do
  

  
   #此段代码的目的,是通过文本的方式完整文件或目录路径
  
   echo ${1}/${file}> /tmp/tmp_wenijian.txt
  
   #然后将路径替换$1删除,替换为${DET}的路径
  
   eval sed -i "s#${INIT_PATH}##"/tmp/tmp_wenijian.txt
  
   UNX=`cat /tmp/tmp_wenijian.txt | head -n 1`
  
   DET1=${2}$UNX
  
   path_a=${file}
  
   if [ -d ${1}/${file} ];then
  
      ergodic ${1}/${file} ${2} $3 $4
  
   else
  
      #此代码段目的,用于无论循环到哪层目录,通过完成路径截取
  
      echo ${1}/${file}> /tmp/tmp_wenijian.txt
  
      eval sed -i "s#${INIT_PATH}##"/tmp/tmp_wenijian.txt
  
                #unx是去除文件投的相对路径
  
      UNX=`cat /tmp/tmp_wenijian.txt | head -n 1`
  
      DET1=${2}$UNX
  
                   if [ -e ${DET1} ];then
  
            echo "[$NDATE]检测到改变文件:$UNX"   | tee -a$LOG_PATH
  
            #此代码的目的是复制的时候讲文件的路径一起
  
                        cp--parent ${2}$UNX$4_${rdate}
  
          else
  
            echo "[$NDATE]检测到新文件:$UNX"   | tee -a$LOG_PATH
  
            fi
  
    fi
  
done
  
}
  
#此函数的做用是遍历$1的目录,并对比$2中的文件,是否一致,输出不同的信息
  
function DIFF_RYD(){
  
INIT_PATH=$3
  
for file in ` ls $1`
  
do
  
   echo ${1}/${file}> /tmp/tmp_wenijian.txt
  
   eval sed -i "s#${INIT_PATH}##"/tmp/tmp_wenijian.txt
  
   UNX=`cat /tmp/tmp_wenijian.txt | head -n 1`
  
   DET1=${2}$UNX
  
   path_a=${file}
  
      if [ -d ${1}/${file} ];then
  
                   DIFF_RYD ${1}/${file} ${2} $3
  
      else
  
         echo ${1}/${file}> /tmp/tmp_wenijian.txt
  
         eval sed -i "s#${INIT_PATH}##"/tmp/tmp_wenijian.txt
  
         UNX=`cat /tmp/tmp_wenijian.txt | head -n 1`
  
         DET1=${2}$UNX
  
                         if [ -e ${DET1} ];then
  
                  #比较上传到生产的文件和上传文件的差异
  
                  diff -q${DET1}${1}/${file}   | tee -a$LOG_PATH
  
                  else
  
                     echo"[$NDATE]上传文件与本地文件不同步,请检测"   | tee -a$LOG_PATH
  
                     echo "[$NDATE]检测到新文件:${1}/${file}"   | tee -a$LOG_PATH
  
                  fi
  
      fi
  
done
  
}
  
#project_name上传代码,$1是需要上传的代码SOURCE,$2是本地的同步目录DET,$3是同步代码的上一级目录DET_HOME
  
#$4是${CODE_BACK},$5是${LOG_BACK},$6是${REVAL},$7 remote_ip ,$8 port
  
#$INIT_PATH是需要上传的代码,$DET是本地同步的代码,$DET_HOME是同步代码的上一级目录
  
function MODEL_UPLOAD() {
  

  

  
#同步上产脚本主体函数
  

  
#预先创建各类自定义目录
  
test -e $2   || mkdir -p$2
  
test -e $4_${rdate}   || mkdir -p$4_${rdate}
  
test -e $5   || mkdir -p$5
  
test -e $6_${rdate}   || mkdir -p$6_${rdate}
  
test -e $1 || echo "[$NDATE]没有找到${2}部署文件"| tee -a$LOG_PATH
  
test -e $1 || exit
  
echo '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' >$LOG_PATH
  
echo "[$NDATE]开始自动部署${2}版本上传"| tee -a$LOG_PATH
  
chown -R resin:resin$1
  
#这个我定义的函数
  
ergodic $1 $2 $1 $6
  
chown -R resin:resin$2
  
echo "--------------------------------"   | tee -a$LOG_PATH
  
echo "判断两次同步期间${2}服务器是否有改动"   | tee -a$LOG_PATH
  
rsync -vzrtopg--delete --progress "-e ssh -p $PARTS"resin@$REMOTE_IP:$2   $3| tee -a$LOG_PATH
  
sleep 2
  
echo "第二次进行判断"
  
rsync -vzrtopg--delete --progress "-e ssh -p $PARTS"resin@$REMOTE_IP:$2   $3| tee -a$LOG_PATH
  
echo "判断结束"| tee -a$LOG_PATH
  
echo "-------------------"   | tee -a$LOG_PATH
  
echo "-----------------------------------------"
  
echo "将本地文件同步到远程服务器"| tee -a$LOG_PATH
  
rsync -vzrtopg   --progress "-e ssh -p $PARTS" $1resin@$REMOTE_IP:$3   | tee -a$LOG_PATH
  
sleep 2
  
echo "第二次"
  
rsync -vzrtopg   --progress "-e ssh -p $PARTS" $1resin@$REMOTE_IP:$3   | tee -a$LOG_PATH
  
echo "------------------------------------------"| tee -a$LOG_PATH
  
echo "将改变文件同步到本地服务器"| tee -a$LOG_PATH
  
rsync -vzrtopg   --progress "-e ssh -p $PARTS" $1$3   | tee -a$LOG_PATH
  
echo "--------------------------------------------------"
  
#此操作用于对比上传的文件和服务器同步到本地文件是否一致
  
echo "将运程服务器与本地服务器同步"| tee -a$LOG_PATH
  
rsync -vzrtopg--delete --progress "-e ssh -p $PARTS"resin@$REMOTE_IP:$2   $3| tee -a$LOG_PATH
  
sleep 2
  
echo "第二次"
  
rsync -vzrtopg--delete --progress "-e ssh -p $PARTS"resin@$REMOTE_IP:$2   $3| tee -a$LOG_PATH
  
echo "------------------------------"   | tee -a$LOG_PATH
  
echo "文件检测开始:"    | tee -a$LOG_PATH
  
DIFF_RYD $1 $2 $1
  
echo "文件检测结束"    | tee -a$LOG_PATH
  
echo "-------------------------------------------------------------------------------------"    | tee -a$LOG_PATH
  
#将此次需要长传的文件打包保存
  
mv$1$4_${rdate}
  
echo "文件上传结束"
  
#cat $LOG_PATH
  
cat $LOG_PATH > $5/${rdate}.log
  
}
  

  

  

  
case $1 in
  
1)
  
MODEL_UPLOAD $SOURCE_RYD $DET_RYD $DET_RYD_HOME $CODE_RYD_BACK $LOG_RYD_BACK $REVAL_RYD
  
;;
  
2)
  
MODEL_UPLOAD $SOURCE_TOMCAT $DET_TOMCAT$DET_TOMCAT_HOME $CODE_TOMCAT_BACK$LOG_TOMCAT_BACK $REVAL_TOMCAT
  
;;
  
3)
  
MODEL_UPLOAD $SOURCE_APP $DET_APP$DET_APP_HOME $CODE_APP_BACK$LOG_APP_BACK $REVAL_APP
  
;;
  
*)
  
echo "Usage:$0 {1project_name|2tomcat|3app}" | tee -a$LOG_PATH
  
exit 1
  
;;
  
esac
  
exit 0


页: [1]
查看完整版本: 粗浅的增量代码上线shell脚本--菜鸟版