本文讲述的是利用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找回上一版本,然后覆盖提交即可
如有问题,不吝赐教!