#!/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