#!/bin/bash

#mkdir /deploy/tmp/EKP

#Node List
Dev_LIST="10.2.92.49 10.2.92.49"
UAT_LIST="10.177.104.215"
PRD_LIST=""
MASTER_LIST=""
# ROLLBACK_LIST="192.168.58.11 192.168.58.12"
 
# Date/Time Veriables
LOG_DATE='date "+%Y-%m-%d"'
LOG_TIME='date "+%H-%M-%S"'
 
CDATE=$(date "+%Y-%m-%d")
CTIME=$(date "+%H-%M-%S")
 
#Shell Env,存放于bamboo 服务器vim
SHELL_NAME=$0
SHELL_DIR="/deploy/logs"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
 
#Code Env,存放于bamboo 服务器
PRO_NAME="EKP"
CODE_DIR="/deploy/code/${PRO_NAME}" #代码存放路径,每次更新前同步仓库最新的代码
CONFIG_DIR="/deploy/config/$PRO_NAME" #该目录下的base目录用于存放最基础的代码的配置文件
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar/$PRO_NAME"
LOCK_FILE="/deploy/tmp/$0.lock" #用于判定当前脚本是否在运行

Keep_Logs(){
        LOGINFO=$1
        echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO}" 
        echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO}" >> ${SHELL_LOG}
}

usage(){
    Keep_Logs  $"Usage: $0 { [deploy | rollback] [DEV |PRD |UAT | MASTER ] [ version ]}"
    Keep_Logs  $"Example: $0  rollback DEV  1.0.0 "

}
 

 
Check_Exist(){
    local FUN=$1
    local TYPE=$2
    local FPATH=$3

 if [ "$FUN $FPATH" ];then
        Keep_Logs "info: succeed $FUN $FPATH "
        return "1"
    else
        Keep_Logs "Error: failed $FUN $FPATH "
        return "0"
    fi

}
   


Lock_Shell(){
    touch ${LOCK_FILE}
    Keep_Logs "Info:Create lockfile ${LOCK_FILE}"
}
 
Get_DeployList(){
         case $DEPLOY_ENV in  
    DEV )
        DEPLOY_LIST=$Dev_LIST;
        ;; 
    UAT )
        DEPLOY_LIST=$UAT_LIST;
        ;; 
    PRD )
        DEPLOY_LIST=$PRD_LIST;
        ;; 
    MASTER )
        DEPLOY_LIST=$MASTER_LIST;
        ;; 
    *)
            usage;
            Unlock_Shell && exit;

    esac


}



URL_Test(){
    local node=$1
    local URL="http://$node:8080"
    Keep_Logs "Info:…… URL_Test $URL";
    curl -s --head $URL | grep "200 OK";
    if [ -n $? ];then
        Keep_Logs "Info: succeed URL_Test ${URL}";    
        curl -s --head $URL;
    else
        Keep_Logs "Error:failed URL_Test ${URL}";
    fi
}
 
Unlock_Shell(){
    Keep_Logs "Info:……remove ${LOCK_FILE}"
    rm -f ${LOCK_FILE}
    Keep_Logs "Info:removed ${LOCK_FILE}"
}
 
Get_Code(){

    if [ -d ${CODE_DIR} ];then
            Keep_Logs "Info:……Get_Code  ${CODE_DIR} ";
            cd $CODE_DIR  && git checkout $DEPLOY_ENV && git pull orgin $DEPLOY_ENV
            cp -r ${CODE_DIR} ${TMP_DIR}
            API_VERL=$(git show | grep commit |cut -d ' ' -f2) 
            API_VER=$(echo ${API_VERL:0:6})
            Keep_Logs "Info:Get_Code is running ……";
    else
        echo "code dir ${CODE_DIR} is not exisit"  
    #mkdir -p ${CODE_DIR}
    #     Get_Code;
    fi
 }
 
Build_Code(){
     Keep_Logs "Build_Code:pass";
}
 
Config_Code(){
    PKG_NAME="${PRO_NAME}"_"${API_VER}"_"${CDATE}-${CTIME}" 
    Keep_Logs "Info:……Config_Code $DEPLOY_ENV_$PKG_NAME"

    /bin/cp -r ${CONFIG_DIR}/$DEPLOY_ENV/* ${TMP_DIR}/${PRO_NAME}/ #待确认配置文件的覆盖方式
    Keep_Logs "Info:……cp -r ${CONFIG_DIR}/$DEPLOY_ENV/* ${TMP_DIR}/${PRO_NAME}/" #待确认配置文件的覆盖方式
    cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}
    Check_Exist "Config_Code" "-d" "${TMP_DIR}/${PKG_NAME}";

    if [ "$?" -eq "0" ];then
        Keep_Logs "Error: failed Config_Code ${PKG_NAME} and process will exit"
        Unlock_Shell && exit;
    else
        Keep_Logs "Info: succeed Config_Code ${PKG_NAME}"
    fi
}
 
Tar_Code(){
    Keep_Logs "Info:……Tar_Code ${PKG_NAME}"
    cd ${TMP_DIR} && tar cfz ${PKG_NAME}.tar.gz ${PKG_NAME}
    Check_Exist "Tar_Code" "-f" "${TMP_DIR}/${PKG_NAME}.tar.gz";
    if [ "$?" -eq "0" ];then
        Keep_Logs "Error: failed Tar_Code ${PKG_NAME} and process will exit"
        Unlock_Shell && exit;
    else
        Keep_Logs "Info: succeed tar_Code ${PKG_NAME} ,path:${TMP_DIR}/ ${PKG_NAME}.tar.gz "
    fi

}
 
Scp_Code(){
    local node=$1
    Keep_Logs "Scp_Code $node"
    scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/
    # Check_Exist -d "${TMP_DIR}\\${PKG_NAME}.tar.gz";
    # if [ $? -eq 0 ];then
    #     Keep_Logs "process will exit"
    #     exit
    # fi
}
 
 
Deploy_Code(){
    local node=$1
    Keep_Logs "Deploy_Code $1"
    ssh $node "cd /opt/ && tar xfz ${PKG_NAME}.tar.gz"
    ssh $node "rm -rf /opt/$PRO_NAME && ln -s /opt/${PKG_NAME} /opt/${PRO_NAME} && cd /opt/apache-tomcat/bin  && sh catalina.sh stop -force  && sleep 1m && sh catalina.sh start "
    if [ $? ];then
        Keep_Logs "Info:…… Deploy Code "
    else    
        Keep_Logs "WARN : failed Deploy_Code"
    # Check_Exist -d "${TMP_DIR}\\${PKG_NAME}.tar.gz";
    # if [ $? -eq 0 ];then
    #     Keep_Logs "process will exit"
    #     exit
     fi
}
 

 
Rollback(){
    local node=$1
    Keep_Logs "Info:…… Rollback $ROLLBACK_VER on $node"
    if [ -z 'ssh $node "ls /opt|grep ${#ROLLBACK_VER} "' ];then
        Keep_Logs "Error: version $$ROLLBACK_VER is not available on $node ,Rollback failed" ;

    else
        ssh $node "rm -rf /opt/${PRO_NAME} && ln -s /opt/${ROLLBACK_VER}  /opt/${PRO_NAME}"
        Keep_Logs "Info:succeed Rollback on $node  " ;

    fi

    }
 
main(){
    #判定操作方式

    DEPLOY_METHOD=$1
    #deploy 或rollback     
    DEPLOY_ENV=$2
    #部署环境(DEV、UAT、PRD、MASTER)     
    ROLLBACK_VER=$3
    #回滚系统版本
    Keep_Logs "Begin"
    # 锁定判断
    if [ -f ${LOCK_FILE} ];then
        Keep_Logs "Deploy is running,you can try it later."  && exit;   
    else
        Lock_Shell;
        Keep_Logs "Info:Deploy method:${DEPLOY_METHOD} ,Deploy ENV:${DEPLOY_ENV} .";
        Get_DeployList; 
        Keep_Logs "Info:Deploy Server list is:$DEPLOY_LIST";

        case ${DEPLOY_METHOD} in
    deploy)
            Get_Code;
            Build_Code;
            Config_Code;
            Tar_Code;
            for node in $DEPLOY_LIST;do
                Scp_Code $node;
                Deploy_Code $node;
                URL_Test $node;
                echo $node;
            done
            ;;

    rollback)
            
            Keep_Logs "Info:Version  $ROLLBACK_VER";

            if [ -n ROLLBACK_VER  -a -d $TMP_DIR/$ROLLBACK_VER  ];then
     
                for node in $DEPLOY_LIST;do
                    Rollback $node;
                done

            else
                Keep_Logs "Please input valid rollback version,Available history are as" ;
                ls -l /opt/|grep EKP_ | cut -b 47- |cut -d "." -f1;
                usage;

            fi
           
            ;;
    *)
            usage;
    esac

    Unlock_Shell;
    fi


}
main $1 $2 $3
#echo $PRO_NAME
#echo $CODE_DIR
#echo $CONFIG_DIR
#echo $TMP_DIR
#echo $TAR_DIR
#echo $LOCK_FILE

 

posted on 2020-09-23 10:25  vmsky  阅读(316)  评论(0)    收藏  举报