1 #!/bin/bash
2
3 # Node List
4 PRE_LIST="192.168.222.163" # 预生产环境节点
5 GROUP1_LIST="192.168.222.164" # 分组 1
6 ROLLBACK_LIST="192.168.222.163 192.168.222.164" # 回滚列表
7
8 # Date/Time Veriables
9 LOG_DATE='date "+%Y-%m-%d"'
10 LOG_TIME='date "+%H-%M-%S"'
11
12 CDATE=$(date "+%Y-%m-%d")
13 CTIME=$(date "+%H-%M-%S")
14
15 # Shell Env
16 SHELL_NAME="deploy_all.sh"
17 SHELL_DIR="/home/www/"
18 SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
19
20 # Code Env
21 PRO_NAME="web-demo"
22 CODE_DIR="/deploy/code/web-demo"
23 CONFIG_DIR="/deploy/config/web-demo"
24 TMP_DIR="/deploy/tmp"
25 TAR_DIR="/deploy/tar"
26 LOCK_FILE="/tmp/deploy.lock"
27
28 usage(){
29 echo $"Usage: $0 {deploy | rollback [ list | version ]}"
30 }
31
32 writelog(){
33 LOGINFO=$1
34 echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO} " >> ${SHELL_LOG}
35 }
36
37 shell_lock(){
38 touch ${LOCK_FILE}
39 }
40
41 shell_unlock(){
42 rm -f ${LOCK_FILE}
43 }
44
45 url_test(){
46 URL=$1
47 curl -s --head $URL | grep '200 OK'
48 if [ $? -ne 0 ];then
49 shell_unlock;
50 echo "test error" && exit;
51 fi
52 }
53
54 code_get(){
55 writelog "code_get";
56 cd $CODE_DIR && git pull # 事先要在部署机上 git clone 项目代码
57 cp -r ${CODE_DIR} ${TMP_DIR}/
58 API_VERL=$(git show | grep commit | cut -d ' ' -f2)
59 API_VER=$(echo ${API_VERL:0:6})
60 }
61
62 code_build(){
63 echo code_build
64 }
65
66
67 code_config(){
68 writelog "code_config"
69 /bin/cp -r ${CONFIG_DIR}/base/* ${TMP_DIR}/"${PRO_NAME}"
70 PKG_NAME="${PRO_NAME}"_"$API_VER"_"${CDATE}-${CTIME}"
71 cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}
72 }
73
74 code_tar(){
75 writelog "code_tar"
76 cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME}
77 writelog "${PKG_NAME}.tar.gz"
78 }
79
80
81 code_scp(){
82 writelog "code_scp"
83 for node in $PRE_LIST;do
84 scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/
85 done
86
87 for node in $GROUP1_LIST;do
88 scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/
89 done
90 scp ${TMP_DIR}/${PKG_NAME}.tar.gz 192.168.222.162:/opt/webroot/
91 }
92
93 pre_deploy(){
94 writelog "remove from cluster"
95 ssh $PRE_LIST "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
96 ssh 192.168.222.162 "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
97 ssh $PRE_LIST "rm -rf /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"
98 }
99
100 pre_test(){
101 url_test "http://${PRE_LIST}/index.html"
102 echo "add to cluster"
103 }
104
105
106 group1_deploy(){
107 writelog "remove from cluster"
108 for node in $GROUP1_LIST;do
109 ssh $node "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
110 ssh $node "rm -rf /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"
111 done
112 scp ${CONFIG_DIR}/other/192.168.222.163.crontab.xml 192.168.222.164:/webroot/web-demo/crontab.xml
113 }
114
115 group1_test(){
116 url_test "http://192.168.222.163:80/index.html"
117 echo "add to cluster"
118 }
119
120 rollback_fun(){
121 for node in $ROLLBACK_LIST;do
122 ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/$1 /webroot/web-demo"
123 done
124 }
125
126 rollback(){
127 if [ -z $1 ];then
128 shell_unlock;
129 echo "Please input rollback version" && exit;
130 fi
131 case $1 in
132 list)
133 ls -l /opt/webroot/*.tar.gz
134 ;;
135 *)
136 rollback_fun $1
137 esac
138 }
139
140 main(){
141 if [ -f $LOCK_FILE ];then
142 echo "Deploy is running" && exit;
143 fi
144 DEPLOY_METHOD=$1
145 ROLLBACK_VER=$2
146 case $DEPLOY_METHOD in
147 deploy)
148 shell_lock;
149 code_get;
150 code_build;
151 code_config;
152 code_tar;
153 code_scp;
154 pre_deploy;
155 pre_test;
156 group1_deploy;
157 group1_test;
158 shell_unlock;
159 ;;
160 rollback)
161 shell_lock;
162 rollback $ROLLBACK_VER;
163 shell_unlock;
164 ;;
165 *)
166 usage;
167 esac
168 }
169 main $1 $2