SVN程式碼倉庫主從同步方案

jaymarco發表於2020-09-23

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章