SVN备份方案--镜像库

原理: 在源库通过hook脚本实现每次提交都与镜像库进行同步。
实现该方案需要如下步骤:
1、在备份服务器上建立一个空库。
2、修改新建库hooks目录下的pre-revprop-change脚本,将其中的exit 1改为0。
3、在备份库执行svnsync init backupurl sourceurl --source-username xxx --source-password xxxxxx --sync-username xxx --sync-password xxxxxx
    eg: svnsync init file:///home/repo http://IP/SHRD-Doc/PAL/SZDoc

4、在源库执行svnsync sync backupurl进行初次同步。
    eg: svnsync sync http://IP/svn/backup/ (有可能存在权限问题:chmod -R o+rw /home/svn/)
5、设置hook脚本进行实时同步:
    在源库的hooks目录下编辑post-commit脚本,添加svnsync sync backupurl命令到脚本中(建立在命令中指定用户名和密码),eg:  
svnsync --non-interactive sync http://IP/repo --source-username xxxxx --source-password 'xxxxxxxxx' --sync-username xxxxx --sync-password 'xxxxxxxx'

错误:
1、svnsync sync:从目标版本库获得锁失败,当前被“Server-SHRD-Doc01:6b7981a6-f5d7-4a21-933f-7d2ba7aab77b”持有 (某次同步终端导致只加锁未解锁)
执行: svn propdel svn:sync-lock --revprop -r 0 file:///targeturl

1、 svnsync :  DAV request failed; it’s possible that the repository’s pre-revprop-cha
nge hook either failed or is non-existent
svnsync :  At least one  property  change failed; repository is unchanged
svnsync :   Error   setting   property  ‘ sync-lock :
could not remove a  property
目标服务器未设置 hook/pre-revprop-change 或者目录权限未更改为www-data。
2、中断同步进程 再次同步 出现 Failed to get lock on destination repos ,  currently held by ‘wonder : 83edc72d-1b3c-4531-815a-b80bf58efe07′ 错误。
: svn  propdel  svn:sync-lock  –revprop -r 0 http : //www.onoboss.com/ svn /chs
3、svnsync :  Destination HEAD (1021) is not the last merged revision (1019); have you committed to the destination without using svnsync
:svn  propset –revprop -r0  svn: sync-last-merged-rev 1021 http : //www.onoboss.com/ svn /chs

    全部完成之后,每次新的提交都会调起post-commit脚本进行同步了。
 
附:
通过jenkins对备份进行监控
之前设置了备份的实时进行,但是备份是否成功任然需要到镜像库的服务器上进行查看,这里将介绍如何使用jenkins对备份结果进行check。
这里也有两种方案
1,通过在hook脚本中添加对jenkins job的http请求来调起job进行check
Jenkins可以通过REST API进行交互,首先建立一个jenkins job,运行在镜像库所在的服务器上,通过输入的参数(镜像库地址,源库版本号,源库UUID)和镜像库参数的比较进行备份的验证。
在源库的hook脚本同步命令下面添加如下一条命令curl -X POST "http://jenkinsserver:8080/jenkins/view/backup_and_restore/job/jobname/buildWithParameters?version=${version}&backupurl=/home/svn/${REPOS}&uuid=${UUID}"
Curl是linux下面进行http交互的工具,没有的话需要安装,-X POST即以post方式调用目标链接,要调起jenkins job需要此方式才行,后面跟的链接中?前的部分既是jenkins job的路径,后面是需要传递过去的参数,参数可以在hook脚本中执行命令获取后传递给jenkins job。
2,通过jenkins上的svn插件对源库进行跟踪
Jenkins的svn插件可以实时跟踪指定svn库的提交情况,每次新的提交都会自动调起jenkins job。但是无法获取备份库的路径,只能在job里进行指定,不过可以避免登陆服务器修改hook脚本的工作。


示例:
REPOS="${1##/home/svn/system/}"
REV="$2"
UUID="`svnlook uuid $1`"

SVNSYNC=/usr/bin/svnsync
#SYNC_PROJECT=http://IP/SHSVN/SVNdata/
SYNC_PROJECT=http://IP/SHSVN/${REPOS}
$SVNSYNC sync --non-interactive $SYNC_PROJECT --source-username xxxx --source-password 'xxxxxx' --sync-username xxxx --sync-password 'xxxxxx'
curl -X POST "http://IP/jenkins/view/backup_and_restore/job/Backup_check_253/buildWithParameters?version=${2}&backupurl=/home/svn/SH/svnback/system/${REPOS}&uuid=${UUID}"

SVNSYNC=/usr/bin/svnsync
#SYNC_PROJECT=http://IP/SHSVN/SVNdata/
SYNC_PROJECT=http://IP/SHSVN/${REPOS}
$SVNSYNC sync --non-interactive $SYNC_PROJECT --source-username xxxx --source-password 'xxxxxx' --sync-username xxxx --sync-password 'xxxxxx'
#curl -X POST "http://IP/jenkins/view/backup_and_restore/job/jobname/buildWithParameters?version=${2}&backupurl=/home/svn/SHsvnback/system/${REPOS}&uuid=${UUID}"

RBUSER=`svnlook author -r "$2" /home/svn/system/SVNdata`
rbt post --server="http://IP" --username='xxxx' --password='xxxxxx' --submit-as=$RBUSER --repository-url="http://IP/SHSVN/SVNdata" $2

#RBUSER=`svnlook author -r "$2" /home/svn/system/SVNdata`
#rbt post --server="http://IP" --username='xxxx' --password='xxxxxx' --submit-as=$RBUSER --svn-user='xxx' --svn-password='xxxxxx' --repository-url="http://IP/repo" $2

curl -X POST "http://IP/view/Backup/job/Backup253_for_251/buildWithParameters?version=${2}&backupurl=/home/svn/SHRD-Doc/${REPOS}&uuid=${UUID}" --user username:password

猜你喜欢

转载自blog.csdn.net/V_hanfang/article/details/81066156