自动化部署流程

1.获取代码(直接拉取)               
2.编译(可选)
3.配置文件
4.打包
5.SCP到目标服务器
6.将目标服务器移除集群
7.解压
8.放置到webroot
9.SCP差异文件
10.重启(可选)
11.测试
12.加入集群上线

回滚流程

#正常回滚
1.列出回滚版本
2.目标服务移除集群
3.执行回滚
4.重启和测试
5.加入集群

#紧急回滚
1.列出回滚版本
2.执行回滚(重启)

#特急回滚
1.列出回滚上个版本(重启)

 

 

#!/bin/bash
#自动部署脚本
#需要配置
#mkdir -p /deploy/code/web-demo 
#mkdir -p /deploy/config/web-demo/other
#mkdir -p /deploy/tar
#mkdir -p /deploy/tmp
#mkdir -p /opt/webroot
#mkdir -p /webroot
#给与相应权限
#chown -R root:root /deploy
#chown -R root:root /opt/webroot
#chown -R root:root /webroot

#部署节点
NODE_LIST="192.168.1.104 192.168.1.104"
ROLLBACK_LIST="192.168.1.104"

#脚本环境变量
SHELL_NAME="deploy.sh"
SHELL_DIR="/root"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
#日期和时间变量
LOG_DATE=`date "+%Y-%m-%d"`
LOG_TIME=`date "+%H-%M-%S"`
CDATE=`date "+%Y-%m-%d"`
CTIME=`date "+%H-%M-%S"`

#代码变量
CODE_DIR="/deploy/code/web-demo"
CONFIG_DIR="/deploy/config/web-demo"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
LOCK_FILE="/tmp/run/deploy.lock"
PRO_NAME="web-demo"

#shell函数
usage(){
echo $"Usage: $0 [ deploy | rollback] | list  sersion"
}
shell_lock(){
 echo "11" > ${LOCK_FILE}
}
writelog(){
 LOGINFO=$1
 echo "${CDATE} ${CTIME}: $SHELL_NAME : ${LOGINFO}">> ${SHELL_LOG}
}

shell_unlock(){
 rm -f ${LOCK_FILE}
}
#获取代码
code_get(){
 writelog "code_get";
 cd $CODE_DIR && echo "git pull" 
        /bin/cp -r ${CODE_DIR} ${TMP_DIR}/
 API_VER="v2.0"
}

#编译
code_build(){
echo build
}
#配置文件
code_config(){
 writelog "code_config"
 /bin/cp -r ${CONFIG_DIR}/* ${TMP_DIR}/"${PRO_NAME}"
 PKG_NAME="${PRO_NAME}"_"$API_VER"_"${CDATE}"-"${CTIME}"
 cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}
}
#打包
code_tar(){
writelog "code_tar"
cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME}
writelog " ${PKG_NAME}.tar.gz"
}
#SCP到目标服务器
code_scp(){
writelog "code_tar"
for node in $NODE_LIST
do
 scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/
done
}
#移除集群
cluster_node_remove(){
echo remove
writelog "cluster_remove"
}
#解压部署
code_deploy(){
writelog "code_tar-deploy"
for node in $NODE_LIST
do
ssh $node "cd /opt/webroot/ && tar zxf ${PKG_NAME}.tar.gz"
ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"
done
}

#差异配置文件
config_diff(){
scp ${CONFIG_DIR}/othe/eiff-config.xml 192.168.1.104:/opt/webroot/${PKG_NAME}/cheyi.config.xml
}
#测试
code_test(){
 
 curl -s -I http://192.168.1.104/index.html|grep "200"
 if [ $? -ne 0 ];then
 shell_unlock;
 writelog "test erro" && exit;
 fi
}

cluster_node_in(){
echo cluster-in
}
rollback_fun(){
if [ -z $1 ];then
 echo "rollback [没输入回滚的版本]"
 shell_unlock;
 exit
fi
  for node in $ROLLBACK_LIST
  do
          ssh $node "if [ -d /opt/webroot/$1 ];then /usr/bin/rm -f /webroot/web-demo && ln -s /opt/webroot/$1 /webroot/web-demo;fi"
   done
 }
rollback(){
 
 
case $1 in
 list)
  ssh $ROLLBACK_LIST  "ls -l /opt/webroot/*.tar.gz"
  ;;
 *)
  rollback_fun $1
  ;;
esac
}

main(){
 if [ -f $LOCK_FILE ];then
  echo "此脚本正在执行" && exit;
 fi
 case $1 in
     deploy)
      shell_lock;
      code_get;
      code_build;
      code_config;
      code_tar;
      code_scp;
      cluster_node_remove;
      code_deploy;
      config_diff;
      code_test;
      cluster_node_in;
      shell_unlock;
      ;;
    rollback)
     shell_lock;
     rollback $2;
     shell_unlock;
     ;;
           *)
     usage;
    esac
}
main $1 $2