应用环境:在北京的svn服务器提供代码归档服务为开发和本地的持续集成编译测试环境,成都开发人员每个人都需要vpn连接并且不稳定。后来成都部署了本地持续集成环境换取代码,从北京同步完全不现实。触使了成都本地同步北京代码的必要性。
实现方式:
1.首先想到的是使用svn的镜像同步工具来同步即svnsync。但是通过这个方式同步数据,第一同步时不能有代码的提交,同步起来速度比较慢。后续同步(使用hook用北京的提交触同步命令)也很容易出现文件被锁的情况。
2.第二种方式使用linux的rsync的工具同步北京svn服务器的代码根目录到成都,建立起成都的svn服务设置访问目录就实现了完美同步,包括权限的等等,而且所以的数据都完全一直,同步速度也很不错。只要解决了成都svn服务器的vpn连接就可以稳定的运用。
ps:这种方式同步后的成都svn服务。完全和北京保持一直,本地的变动也会在下次的同被北京数据覆盖,所以运用的为成都的Teamcity的自动化环境获取代码也完美解决的,如果开发人员的获取提交想要在本地提交成都同步到北京还需要做一下两地的同步目录的相互同步。
3.解决两地同步的vpn网络问题实现vpn宕机的自动连接,就要写一个自动的连接脚本。首先vpn帐号密码由专门的人员管理,开发和运维是没有vpn的拨号密码的,所以就涉及到了脚本的加密。
操作过程:
1.配置成都svn服务器的和北京svn服务器的网络互通,cisco的vpn,linux服务拨号使用vpnc这个工具s
#!/bin/bash if [ `id -u` -ne 0 ];then echo "please use root user" exit fi ×××=`ifconfig | grep tun echo $××× if [ -z "$×××" ] then cd /home/sh ./vpnc.sh while [ 1 ] do Route=`route | grep 192.168.17.0` if [ -n "$Route" ] then route add -net 192.168.17.0 netmask 255.255.255.0 gw 192.168.21.1 break fi done else echo $××× >/dev/null fi
调用的启动脚本vpnc.sh
#!/usr/bin/expect set timeout 15 spawn vpnc --enable-1des expect { "Enter IPSec gateway address:" { exp_send "x.xxx.xxx.xx\r";exp_continue } "Enter IPSec ID for*" { exp_send "vpn4000\r";exp_continue } "Enter IPSec secret for*" { exp_send "cisco\r";exp_continue } "Enter username for*" { exp_send "chengdu38\r";exp_continue} "Enter password for*" { exp_send "passwd\r"} } interact #expect eof
到现在实现了vpn的自动连接。
加密shell脚本的方式有提供两种
第一是linux系统自带的gzexe
第二是shc的二进制编译
都可以实现shell中的明文密码ip等信息的不可见。
2.自动同步的操作
有一遍文章很详细的介绍了同步过程
http://www.jb51.net/article/17018.htm