利用hooks中的post-commit和ssh无密连接
先实现ssh无密连接
1.在svn服务器下生成公钥/私钥对。
ssh-keygen -t rsa -P ''
-P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车。
它在当前账号的默认目录下(不设置就是root)下生成.ssh目录,.ssh下有id_rsa和id_rsa.pub。
2.把刚刚生成的id_rsa.pub复制到另一台服务器。
在要同步到的服务器对应的默认文件夹(默认root),生成.ssh/authorized_keys文件,将id_rsa.pub内容复制过来。
3.将文件改成600权限
chmod 600 .ssh/authorized_keys
4.设置之后登录一次
ssh xxx.xxx.xxx.xxx
yes/no选yes,之后就ok了
ssh无密连接完成后,配置svn的post-commit
在svn目录下,hooks文件夹,创建post-commit文件
#!/bin/sh REPOS="$1" # 仓库的路径 REV="$2" # 新提交的版本号 LOGFILE=/var/log/svn.log # 钩子脚本的日志 # 脚本的标准输出和标准错误输出都打印到日志文件里 exec 1>>"$LOGFILE" exec 2>&1 SVNLOOK=/usr/bin/svnlook TIME=$(date "+%Y-%m-%d %H:%M:%S") AUTHOR=$($SVNLOOK author -r $REV "$REPOS") #提交作者 CHANGEDDIRS=$($SVNLOOK dirs-changed $REPOS) #修改的目录集合 MESSAGE=$($SVNLOOK log -r $REV "$REPOS") #提交时的备注信息,不建议用中文 # SVN客户端配置,需要自行修改********************************** CLIENT1=xxx.xxx.xxx.xxx #需要同步到的服务器 CLIENTSVNROOT=/data/apps #WEB服务器的代码根目录 SVNUSER="zb" SVNPASSWD="123456" #************************************************************** function myecho() { echo "$TIME" "$*" } myecho "**************************************************************" myecho "提交版本:$REV 作者:$AUTHOR" myecho "提交备注:$MESSAGE" myecho "修改目录:$(echo $CHANGEDDIRS | tr '\n' ' ')" MASTERDIR=$(echo "$CHANGEDDIRS" | head -1) #CHANGEDDIRS里的主目录 # 遍历提交的代码目录,同步到WEB服务器上 while [ "$CHANGEDDIRS" != "" ];do PROJECT=$(echo $MASTERDIR | awk -F / '{print $1}') # 判断项目文件夹 myecho myecho "项目:$PROJECT 同步目录:$MASTERDIR" myecho "同步 $MASTERDIR 到 $CLIENT1:$CLIENTSVNROOT/$MASTERDIR" # 无密码ssh连接到客户端服务器,执行svn up /usr/bin/ssh root@$CLIENT1 "export LANG=en_US.UTF-8; svn up --non-interactive --username $SVNUSER --password $SVNPASSWD '$CLIENTSVNROOT/$MASTERDIR'" # 在目录集合里删除已经同步好的目录 CHANGEDDIRS=$(echo "$CHANGEDDIRS" | grep -v "^$MASTERDIR") # 获取新的需要同步的主目录 MASTERDIR=$(echo "$CHANGEDDIRS" | head -1) done
保存即可