SVN程式碼倉庫主從同步方案
1 背景
由於現在公司產品做大,研發團隊都不是集中統一辦公。例如廣州、長沙、杭州等地區都有一波相應的產品開發團隊,現面臨的問題是產品開發的程式碼是屬於本地自管,導致程式碼分散、程式碼冗餘和程式碼無法共享、更嚴重的影響會導致程式碼丟失等問題。為了方便集中管理好新炬的產品程式碼,保障開發人員的能夠共享式開發,並提升開發團隊開發效率,現在設定研發中心基地在廣州由它作為程式碼倉庫基地來託管各地區產品程式碼。2017年下半年我們對研發中心程式碼倉庫進行改造建設,從單機改造從主備,基地倉庫自動備份、遠端地區程式碼同步倉庫基地和程式碼賬號讀寫許可權集中管控等一列系工作。之前有同事分享過SVN環境搭建,這裡不做重點介紹,今天主要介紹一下SVN主從同步實施。
附:程式碼基地倉庫建設方案
2 目標
為了保障各地區開發人員高效訪問廣州研發中心程式碼庫,已提升開發人員開發效率,同時也為了安全保障程式碼的安全不丟失等多方面問題,這裡採用主備雙機熱備方式來實現程式碼庫高可用。下面為了實現線上同步程式碼和 SVN 賬號到備機,以確保程式碼主庫當機,備機正常接管服務以保障開發人員正常工作。
3 主備同步(程式碼與 SVN 賬號)
在這裡我們是採用SVN自帶的svnsync機制來實現程式碼主庫上面的程式碼自動同步到程式碼庫(備機)。SVN賬號是透過資料同步方式來實現主備同步方式。
1. 在備機開啟同步程式碼鉤子
# 在備機開啟同步程式碼鉤子, cd /home/svn/coderepos/devops/hooks ## 進入當前版本庫目錄 cp pre-revprop-change.tmpl pre-revprop-change; chown apache:apache pre-revprop-change chmod +x pre-revprop-change
# 修改 pre-revprop-change 內容 echo “Changing revision properties other than svn:log is prohibited” >&2 ## 這行下面修改 exit 0 ( 1 修改為 0 ) 說明如下: 原指令碼的意思是如果修改的是 svn:log 屬性,將允許修改,返回 0 ;否則,不允許,返回 1 我們要將它改為允許修改所有的屬性,在指令碼中直接返回 0 |
2. 在備機上執行同步操作
# 初始化同步操作 svnsync init file:///home/svn/coderepos/devops/ http://192.168.15.170/svn/devops/ --username yanjiehong --password 123456
file:///home/svn/coderepos/devops/ 代表目標主機倉庫(備機倉庫) http://192.168.15.170/svn/devops 代表源主機倉庫路徑 -username --password 使用的是 源 SVN 帳號密碼
# 開始同步資料 svnsync sync file:///home/svn/coderepos/devops/ |
3. 定時同步指令碼
此指令碼是每2分鐘自動從主庫同步程式碼到備庫,此指令碼部署到備機。
## autosynccode.sh 自動同步指令碼 #!/bin/bash workdir="/opt/sysadmin/svnscritps/src_sync_target" maillist="yanjiehong@shsnc.com" v_time=`date +%Y%m%d` url="svnsync sync file:///reposdata/svn/svnrepos/" check(){ if [ `rpm -qa|grep -q mailx;echo $?` -ne 0 ]; then yum -y install mailx fi if [ `rpm -qa|grep -q postfix;echo $?` -ne 0 ]; then yum -y install postfix fi
echo 1 > $workdir/svnsync.lock for repos_name in `cat $workdir/sync_repos.conf|grep -v '^#'|awk '{print $1}'` do $url$repos_name >>$workdir/src_sync_success.log.$v_time if [ $? -eq 0 ];then echo "`date "+%Y-%m-%d %H:%M:%S"` svn repository $repos_name backup is success!" >>$workdir/src_sync_success.log.$v_time else echo "`date "+%Y-%m-%d %H:%M:%S"` svn repository $repos_name backup is fail!" >>$workdir/src_sync_error.log.$v_time echo "`date "+%Y-%m-%d %H:%M:%S"` svn repository $repos_name backup is fail!" >>$workdir/src_sync_error.log.$v_time echo "`date "+%Y-%m-%d %H:%M:%S"` svn repository $repos_name backup is fail!"|mail -s "`date "+%Y-%m-%d %H:%M:%S"` svn repository $repos_name backup is fail!" -r svn@root.cn ${maillist} fi done echo 0 > $workdir/svnsync.lock }
if [ $(awk '{print $1}' $workdir/svnsync.lock) != 1 ];then check else exit 0 fi ## 定時任務 ##master170 à slave 171 */1 * * * * /opt/svn/autosynccode.sh |
4 賬號同步
目前採用的apache+subversion+submin軟體實現程式碼庫管理,而SVN賬號是透過submin平臺管理的,然後SVN賬號資訊儲存在sqlite資料庫中,如果只是實現主備程式碼同步後,還需要實現主備SVN賬號同步才能算是完整的主備同步。下面我們採用指令碼定時去完成程式碼主庫的表資料同步到程式碼備庫中。
1. 主備互信關係
建立主備互信關係主要是為了下面的資料同步過程中免密碼登入
1) 、生成金鑰檔案 A 與 B 機執行: ssh-keygen -t rsa 2 )、公鑰檔案放入到主機 A 的 /root/.ssh/authorized_keys A 機: cat /root/.ssh/id_rsa.pub >/root/.ssh/authorized_keys A 機: ssh B cat /root/.ssh/id_rsa.pub >>/root/.ssh/authorized_keys A 機: scp B:/root/.ssh/authorized_keys /root/.ssh/ |
2. 資料同步
將相關SVN賬號儲存的表在程式碼主庫匯出,然後匯入到程式碼備庫中。每週定時同步一次
#!/bin/bash ##################################### #Migrate the submin source library database table to the target database #group_members #password_reset #groups #users #permissions #####################################
dumpdir=/opt/svn DataTime=$(date '+%Y%m%d') SumDir=/home/svn/submin
##Temporarily copy data files scp CodeServer1:$SumDir/authz $SumDir >/dev/null scp CodeServer1:$SumDir/conf/submin.db /tmp/submin.db.$DataTime >/dev/null
##Export source database table sqlite3 /tmp/submin.db.$DataTime ".dump group_members" > $dumpdir/submin.sql sqlite3 /tmp/submin.db.$DataTime ".dump password_reset" >> $dumpdir/submin.sql sqlite3 /tmp/submin.db.$DataTime ".dump groups" >> $dumpdir/submin.sql sqlite3 /tmp/submin.db.$DataTime ".dump users" >> $dumpdir/submin.sql sqlite3 /tmp/submin.db.$DataTime ".dump permissions" >> $dumpdir/submin.sql
##delete target database table sqlite3 $SumDir/conf/submin.db "drop table group_members" sqlite3 $SumDir/conf/submin.db "drop table password_reset" sqlite3 $SumDir/conf/submin.db "drop table groups" sqlite3 $SumDir/conf/submin.db "drop table users" sqlite3 $SumDir/conf/submin.db "drop table permissions"
##import target database table sqlite3 $SumDir/conf/submin.db < $dumpdir/submin.sql
##cleanup Temporarily files rm -rf $dumpdir/submin.sql rm -rf /tmp/submin.db.$DataTime |
有需要的朋友可以關注我的公眾號,文章每日一更
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2723432/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何從SVN遷移原始碼到Git倉庫原始碼Git
- git 同步fork的倉庫程式碼Git
- Linux(centos)搭建SVN倉庫LinuxCentOS
- Git上fork後的程式碼倉庫如何與原倉庫進行同步Git
- [資料庫]MYSQL主從同步資料庫MySql主從同步
- Git同步兩個遠端倉庫的分支程式碼Git
- 使用 SVN 搭建 Composer 私有倉庫
- 揭秘MySQL的主從同步實現方案MySql主從同步
- 搭建 mariadb 資料庫主從同步資料庫主從同步
- Github程式碼fork之後,如何與原倉庫進行同步?Github
- 使用GitBash從Git遠端倉庫下載程式碼Git
- 高併發架構系列:資料庫主從同步的3種方案架構資料庫主從同步
- 自動同步 Github 倉庫到 Gitee 倉庫GithubGitee
- github同步fork倉庫Github
- git 從遠端倉庫指定分支clone程式碼到本地Git
- RocketMQ主從同步MQ主從同步
- mysql主從同步MySql主從同步
- Redis主從同步Redis主從同步
- 建立svn倉庫步驟(創業公司需要)創業
- SVN倉庫備份和遷移基本操作
- mysql伺服器主從資料庫同步配置MySql伺服器資料庫
- 使用程式碼將github倉庫裡某個issue同步到CSDN部落格上Github
- Mongo主從同步原理Go主從同步
- MySQL主從同步配置MySql主從同步
- 使用SourceTree管理GitLab程式碼倉庫Gitlab
- gitee建立倉庫如何提交程式碼Gitee
- 直播帶貨系統原始碼,實現MYSQL資料庫的主從同步原始碼MySql資料庫主從同步
- 與遠端倉庫保持同步
- 【Git】fork遠端倉庫,fork倉庫同步和提交pull requestGit
- MySQL 資料主從同步MySql主從同步
- MySql主從同步介紹MySql主從同步
- redis主從同步機制Redis主從同步
- 資料庫讀寫分離,主從同步實現方法資料庫主從同步
- linux下mysql主從複製,實現資料庫同步LinuxMySql資料庫
- MySQL-主從複製之同步主從資料MySql
- svn程式碼統計工具
- MySQL主從同步(一主一從、一主多從、主從從)等結構的概述與配置MySql主從同步
- git本地倉庫與GitHub的同步Github