本文讲述的是利用SVN+RSYNC上线代码的生产案例,适用于小型公司及企业,让运维从频繁的上线代码中解脱出来。以下对应的web服务器也适用于Windows服务器及Linux服务器

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
REPOS=
"$1"
REV=
"$2"
export 
LANG=zh_CN.UTF-8
export 
RSYNC_PASSWORD=RSYNC_PASSWORD
RSYNC_USER=RSYNC_USER
 
PROJECT_NAME=`
basename 
$REPOS`
 
SVN_DIR=
/svndata/project/
${PROJECT_NAME}/
WEB_DIR=
/app/
${PROJECT_NAME}/
 
HOST_CONF=
"/svndata/conf/host/${PROJECT_NAME}"
EXCLUDE_CONF=
"/svndata/conf/exclude/${PROJECT_NAME}.txt"
 
if 
[ ! -d $WEB_DIR ];
then
mkdir 
-p $WEB_DIR
/usr/bin/svn 
checkout 
file
:
//
$SVN_DIR $WEB_DIR
else
/usr/bin/svn 
update $WEB_DIR
fi
 
test 
-f $HOST_CONF || 
exit 
3
 
DEV_VERSION=`
/usr/bin/svnlook 
changed $SVN_DIR|
grep 
"dev"
|
awk 
'{print $2}'
|
awk 
-F
'/' 
'{print $2}'
|
head 
-n1`
if 
[ $DEV_VERSION ];
then
        
for 
HOST 
in 
`
cat 
$HOST_CONF|
sed 
's/^[ \t]*//g'
|
grep 
-
v 
'^#'
|
grep 
'dev:'
|
awk 
-F
':' 
'{print $2}'
`
        
do
        
/usr/bin/rsync 
-rvzP --delete --port=873 --exclude=
'.svn/'  
$WEB_DIR
/dev/  
$RSYNC_USER@${HOST}::${PROJECT_NAME} >>
/tmp/dev_
${PROJECT_NAME}_`
date 
+%Y%m%d`.log
        
done
fi
tags_check=`
/usr/bin/svnlook 
changed $SVN_DIR|
grep 
'tags'
|
awk 
'{print $1}'
|
grep 
-E 
"A|U" 
|
wc 
-l`
if 
[ $tags_check -
ne 
0 ];
then
        
TAGS_VERSION=`
/usr/bin/svnlook 
changed $SVN_DIR|
grep 
"tags"
|
awk 
'{print $2}'
|
awk 
-F
'/' 
'{print $2}'
|
head 
-n1`
        
TAGS_SIZE=`
du 
-s $WEB_DIR
/tags/
${TAGS_VERSION}|
awk 
'{print $1}'
`
        
if 
[ $TAGS_VERSION ] && [ $TAGS_SIZE -gt 20 ];
then
 
        
for 
HOST 
in 
`
cat 
$HOST_CONF|
sed 
's/^[ \t]*//g'
|
grep 
-
v 
'^#'
|
grep 
'tags:'
|
awk 
-F
':' 
'{print $2}'
`
        
do
        
echo 
"`date +%Y-%m-%d_%H:%M:%S` start to sync $PROJECT_NAME to ${HOST} WebServer "
>>
/tmp/tags_
${PROJECT_NAME}_`
date 
+%Y%m%d`.log
        
/usr/bin/rsync 
-rvzP --delete --port=873 --exclude-from=${EXCLUDE_CONF}  $WEB_DIR
/tags/
${TAGS_VERSION}/ $RSYNC_USER@${HOST}::${PROJECT_NAME} >>
/tmp/tags_
${PROJECT_NAME}_`
date 
+%Y%m%d`.log
        
echo 
"sync end to ${HOST}"
>>
/tmp/tags_
${PROJECT_NAME}_`
date 
+%Y%m%d`.log
        
done
 
        
echo 
"###`date +%Y-%m-%d_%H:%M:%S`###############################################"
>>
/tmp/tags_
${PROJECT_NAME}_`
date 
+%Y%m%d`.log
        
fi
fi
 
unset 
RSYNC_PASSWORD
exit 
0

主机配置文件HOST_CONF

1
2
3
dev:192.168.2.21
tags:192.168.2.30
tags:192.168.2.30

#dev只有一个

#tags可以有多个

排除文件EXCLUDE_CONF

1
2
3
.svn/
check_chk.html
index.html

可以实现某些文件不做同步,如生成的缓存及上传的图片等等

流程说下:

项目下面有2个文件夹,SVN判断提交的文件夹目录来判断同步的是测试服务器还是生产服务器

dev

tags

2个目录

开发人员将在本机测试好的程序提交到dev目录,程序自动同步到测试服务器进行测试。

由测试人员,测试OK后,将应用程序增量或者全量上线到生产服务器

增量上线:

比如开发在dev下增加或者修改了a.php文件,现在只需要将此文件放到最近的一个tags/{版本号}/对应的目录下面即可

全量上线:

只需要利用svn的新建分支功能即可,分支的路径为/dev/{自定义版本号},即可实现全量上线

回滚:

利用svn找回上一版本,然后覆盖提交即可

如有问题,不吝赐教!