ITPub博客

首页 > 自动化运维 > DevOps > SVN代码仓库主从同步方案

SVN代码仓库主从同步方案

原创 DevOps 作者:jaymarco 时间:2020-09-23 12:40:56 0 删除 编辑

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
负责数据库、中间件、大数据等基础软件建设、优化和业务保障工作。具有10年的电信与银行企业一线/二线运维管理经验。目前专注研究云计算、中间件和数据库等领域技术研究。持有Oracle OCP、weblogic OCP、Docker容器、PGCE和阿里云ACP等认证

注册时间:2020-06-22

  • 博文量
    36
  • 访问量
    14415