zoukankan      html  css  js  c++  java
  • CICD:通过Shell 将打包后的代码部署到各环境

    #!/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
  • 相关阅读:
    Oracle修改字段类型
    JS解析JSON字符串
    C#Json转DataTable
    解决前台和后台传值出现中文乱码
    Oracle 存储过程简单语法
    EasyUI 冻结列
    EasyUI 数据网格行过滤
    windows计划任务
    C#日志文件
    bat 读取 ini 配置文件
  • 原文地址:https://www.cnblogs.com/vmsky/p/13716709.html
Copyright © 2011-2022 走看看