#!/bin/sh
# POST-COMMIT HOOK
# ... 省略
# http://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/
# mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
echo -e "[1 fo 6]================================\n`date`:这次更新将发布到测试和WEB。" 1>&2
# 库的路径
REPOS="$1"
# 新提交的版本号
REV="$2"
changed=$(svnlook changed -r $REV $REPOS)
echo $changed > /home/svn/hooks/last_changed
echo $REPOS >> /home/svn/hooks/last_changed
echo $REV >> /home/svn/hooks/last_changed
######################################################################################
# 配置自动发布到WEB服务器 编辑 post-commit 文件 ######################################
######################################################################################
# -------------------------------------------------------------------------------
# Filename: post-commit
# Description: WEB server with synchronization code by SVN
# -------------------------------------------------------------------------------
#Version 1.1
#当用戶把代碼提交完成时,把代碼中的最新更改同步到 WEB服務器,同時注意不包括刪除操作。
#Set variable
SVN=/svn/ygjk/repo
SVNUSER=adminsvn
SVNPASD=admin@ygjk
# 测试服务器路径
WEB1=/var/www/html/ygjk
#WEB2=/home/ftp/c/customer/wwwroot
# 远端服务器IP
WEBIP="120.26.64.214"
# 同步方式
RSYNC=rsync
# 同步日志
LOG=/svn/ygjk/post-commit.log
# 避免乱码
export LANG=en_US.UTF-8
mkdir -p $SVN
#更新文件到本地文件夹
svn update $WEB1 --username $SVNUSER --password $SVNPASD
#svn update $WEB2 --username $SVNUSER --password $SVNPASD
# 必须要检出成功才开始执行下面的 #####################################################
if [ $? == 0 ]
then
echo -e "[2 fo 6]================================\n`date`:文件顺利检出到测试项目。" 1>&2
######################################################################################
# 这里是解析本次操作的文件名 用于提高修改权限的速度 ##################################
######################################################################################
echo -e "[3 fo 6]================================\n`date`:正在改变文件归属,为上传到WEB服务器准备。" 1>&2
str=$changed
# 字符串变成类似数组的东西,下面的for可以一次打印一个出来
var=`echo $str | awk -F',' '{print $0}' | sed "s/,/ /g"`
# list为文件名和SVN标记码一次搞一个出来
for list in $var
do
# 获取每次list字符串的长度
filesneme_len=`expr length $list`
# 这个if对长度小于1的文件名过滤掉>符号需要转义
if [ "$filesneme_len" \> "1" ]
then
# 这里取得的是字符串的第一个/前后的字符串 分别为仓库名字和带路径文件名
#echo 仓库:${list%%/*}
#echo 文件:/${list#*/}
# 根据仓库名字给文件分派权限
if [ "${list%%/*}" == "ygjk" ]
then
#设定检出文件为用户组1
echo 设定检出文件为用户组1
echo 仓库:${list%%/*}
echo 文件:/${list#*/}
chown 1000:1100 $WEB1/${list#*/}
# 只同步修改的内容
rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB1/${list#*/}" "root@$WEBIP:$WEB1\_svn/${list#*/}" >> $LOG
fi
# if [ "${list%%/*}" == "customer" ]
# then
# #设定检出文件为用户组2
# echo 设定检出文件为用户组2
# echo 仓库:${list%%/*}
# echo 文件:/${list#*/}
# chown 1002:1100 $WEB2/${list#*/}
# # 只同步修改的内容
# rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list #"$WEB2/${list#*/}" "root@$WEBIP:$WEB2\_svn/${list#*/}" >> $LOG
# fi
fi
done
echo -e "[4 fo 6]================================\n`date`:文件归属修改完成。" 1>&2
######################################################################################
# 记录日志和上传文件 #################################################################
######################################################################################
echo "" >> $LOG;echo `date` >> $LOG;echo "##############################" >> $LOG
# 修改新检出文件的权限
# chown -R 1000:1100 $WEB
# chown -R 1002:1100 $WEB2
#同步代码从SVN服务器到WEB服务器 通过RSYNC
#$RSYNC -vaztpH --timeout=90 --exclude-from=$SVN/exclude.list $WEB root@$WEBIP:$WEB/ >> $LOG
echo -e "[5 fo 6]================================\n`date`:正上传到WEB服务器,并检查文件完整。" 1>&2
# 同步完整内容 如目录删除文件删除之类..
rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB1/" "root@$WEBIP:$WEB1\_svn/" >> $LOG
#rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB2/" "root@$WEBIP:$WEB2\_svn/" >> $LOG
echo -e "[6 fo 6]================================\n`date`:代码已经发布到远端WEB。" 1>&2
fi
# 利用钩子错误退出 输出过程信息
exit 1
SVN自动部署脚本
最新推荐文章于 2025-06-27 12:09:57 发布