shell批量发布站点

网站发布是运维人员不可避免的日常日常工作,使用较多的开源的发布系统有walle,或者jenkins+插件方式。

这里介绍下如何shell如何批量发布,首先确定下流程。

1、 确定语言类型,php还是java还是其它。因为java发布,虽然重启动tomcat
2、 获取代码
3、 编辑(可选)使用ant maven
4、 打包命名
5、 文件分发 (scp salt-cp rsync ansible)
6、 将待部署节点,从集群中摘除(是否存在灰度坏境)
7、 是否存在灰度坏境,先灰度发布
8、 解压源码包
9、 创建软链接
10、 重启web服务(java需要重新启动)
11、 测试验证
12、 加入集群
13、 回滚

PHP发布具体代码

基础坏境:
发布机子和web服务器机子新增一个nginx用户,配置key登陆,注意目录权限。

##Node List
NODE_LIST=’192.168.1.234’
ROLLBACK_LIST=’192.168.1.234’

##Shell Env
SHELL_DIR=”/data/shell/“
SHELL_NAME=”web_deploy.sh”
SHELL_LOG=”${SHELL_DIR}/${SHELL_NAME}.log”

代码坏境

PRO_NAME=”auto-deploy” #项目名字
CODE_DIR=”/data/code/deploy/${PRO_NAME}”
TMP_DIR=”/ data /deploy_tmp”
TAR_DIR=”/ data /deploytar”
CDATE=date "+%Y-%m-%d"
CTIME=`date “+%H
%M_%S”`

##部署目录坏境
WEB_SOURCE_DIR=”/data/Webroot_source”
WEB_DIR=”/data/Webroot”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
shell_lock(){
if [ -f /var/run/deploy-start/deploy-start.lock ];then
echo "Deploy is running" && exit;
fi
touch /var/run/deploy-start/deploy-start.lock
echo -e "\033[32m 1、shell_locak \033[0m"

}
shell_unlock(){
rm -f /var/run/deploy-start/deploy-start.lock
}


usage(){
echo $"Usage: $0 { deploy | rollback [list | version] }"
}
writelog(){
LOGINFO=$1
echo "${CDATE} ${CTIME}:${LOGINFO} " >> ${SHELL_LOG}
}
code_get(){
echo -e "\033[32m 2、code_get start \033[0m"
writelog "code_get";
cd $CODE_DIR && git pull
cp -r ${CODE_DIR} ${TMP_DIR}/
API_VERL=`git show|grep commit |cut -d ' ' -f2`
API_VER=$(echo ${API_VERL:0:6})
echo -e "\033[32m 2、code_get version=${API_VERL} finish \033[0m"
}

code_config(){
/bin/cp -r ${CONFIG_DIR}/* ${TMP_DIR}/${PRO_NAME} > /dev/null 2>&1
PKG_NAME="${PRO_NAME}"_"$API_VER"-"${CDATE}"-"${CTIME}"
cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}
echo -e "\033[32m 3、code_config finish \033[0m"
}
code_tar(){
writelog "code_tar"
cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME}
writelog "$PKG_NAME.tar.gz"
echo -e "\033[32m 4、code_tar ${PKG_NAME}.tar.gz finish \033[0m"
}
code_scp(){
writelog "code_scp"
for node in ${NODE_LIST};do
scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:${WEB_SOURCE_DIR}
echo -e "\033[32m 5、code_scp $node:${WEB_SOURCE_DIR} finish \033[0m"
done
}
cluster_node_remove(){
writelog "cluster_node_remove";

}

code_test(){
URL=$1
curl -s --head http://$1:82/index.html|grep "200 OK" >> /dev/null
if [ $? -ne 0 ];then
shell_unlock;
writelog "$1 test error" && echo -e "\033[31m 7、code_test $1 test False \033[0m" && exit;
else
echo -e "\033[32m 7、code_test $node test sucess \033[0m"
fi

}

code_deploy(){
for node in ${NODE_LIST};do
ssh $node "cd ${WEB_SOURCE_DIR} && tar zxf ${PKG_NAME}.tar.gz &&rm -f ${WEB_DIR}/${PRO_NAME} && ln -s ${WEB_SOURCE_DIR}/${PKG_NAME} ${WEB_DIR}/${PRO_NAME}"
echo -e "\033[32m 6、code_deploy $node deploy finish \033[0m"
echo "--------------------------------------------------------"
code_test $node;
done
}
rollback_fun(){
if [ -z $1 ];then
echo "Please input list|version"
fi
for node in $ROLLBACK_LIST;do
ssh $node "if [ -d ${WEB_SOURCE_DIR}/$1 ];then rm -f ${WEB_DIR}/${PRO_NAME} && ln -s ${WEB_SOURCE_DIR}/$1 ${WEB_DIR}/${PRO_NAME} && echo "$node $1 rollback success!";else echo "$1 rollback false";fi"
writelog "$node $1 rollback finish"
done
}

rollback_list(){
ls -l ${TMP_DIR}/*.tar.gz
}

rollback(){
#echo $1
case $1 in
list)
rollback_list;
;;
*)
rollback_fun $1;
;;
esac
}
main(){
ROLLBACK_VER=$2
case $1 in
deploy)
shell_lock;
code_get;
#code_build;
code_config;
code_tar;
code_scp;
#cluster_node_remove;
code_deploy;
#cluster_node_in;
shell_unlock;
;;

rollback)
shell_lock;
rollback ${ROLLBACK_VER};
shell_unlock;
;;
*)
usage;
esac
}
main $1 $2

Comments

2017-02-20