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

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

dev:192.168.2.21
tags:192.168.2.30
tags:192.168.2.30

#dev只有一个

#tags可以有多个


排除文件EXCLUDE_CONF

.svn/
check_chk.html
index.html

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


流程说下:

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

dev

tags

2个目录


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

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


增量上线:

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


全量上线:

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


回滚:

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


如有问题,不吝赐教!