1. 程式人生 > >SVN備份方案--映象庫

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/SZDoc4、在源庫執行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:///targeturl1、svnsync: DAV request failed; it’s possible that the repository’s pre-revprop-change hook either failed or is non-existentsvnsync
: At least one property change failed; repository is unchangedsvnsync:Errorsettingproperty ‘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/chs3、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進行checkJenkins可以通過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" $2curl -X POST "http://IP/view/Backup/job/Backup253_for_251/buildWithParameters?version=${2}&backupurl=/home/svn/SHRD-Doc/${REPOS}&uuid=${UUID}" --user username:password