从svn服务器自动同步到另一台服务器

需求场景

      A            commit             B            post-commit            C
(workstation)  -------------->  (svn server) ---------------------> (major site)
(开发机)                                                              (线上站点)

开发机为A,有svn服务器B,以及线上站点所在服务器C。因为B硬盘不够等原因导致线上网站放在C上,不和svn服务器放在同一台机器B上。

现在,希望开发机A执行commit代码后,svn服务器B上自动同步代码到C服务器,使得线上网站自动更新。

我的方案

大体思路是用post-commit脚本,具体细节上有点麻烦,包括:

编写expect脚本->编写post-commit脚本->配置apache账户ssh-key->测试

下面是具体步骤

编写expect脚本

最先尝试用svn update root@xxx.xxx.xxx.xxx:/folder_name,但是命令不执行。考虑先ssh到C服务器,然后执行svn update。因为可以用ssh key,所以感觉不用密码登录C服务器,并执行后续操作,写到脚本中应该能行,做到自动化操作。
但是bash脚本中编写了ssh登录和svn update更新脚本,发现ssh登录后就不执行后续命令了。
发现expect这个解释器还是挺好用的,它是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。不多说,直接编写需要的脚本:

/var/svnroot/test/hooks/test.exp:

#!/usr/bin/expect -f
spawn ssh root@xxx.xxx.xxx.xxx   #换成你的服务器ip或域名
expect "~"
send "svn update ~/workspace/test >> /tmp/svn_test_update.log 2>&1\r"    #换成你的本地repo路径,记得先checkout过才行。日志文件名可修改。
send "exit\r"
expect eof

修改权限:

chown apache:apache test.exp
chown +x test.ext

编写post-commit脚本

就是去执行刚才的test.exp文件:

/var/svnroot/test/hooks/post-commit:

REPOS="$1"
REV="$2"

expect /var/svnroot/test/hooks/test.exp >> /tmp/svn_test_expect.log 2>&1      #/var/svnroot/test是svn服务器上repo的地址

修改权限:

chown apache:apache post-commit
chown +x post-commit 

配置apache账户ssh-key

post-commit脚本是被apache用户执行的,那么脚本中ssh登录语句执行时,会查找/var/www/.ssh路径下的rsa密钥,那么现在来生成它。

创建.ssh目录

mkdir -p /var/www/.ssh
chown -R apache:apache /var/www/.ssh

修改apache账户为可登录:

vipw
#或者 vim /etc/passwd

找到apache所在行,修改最后面的/sbin/nologin为/bin/bash

用apache账号登录,生成ssh-key:

su apache
cd /var/www/
ssh-keygen
#然后各种回车

cat .ssh/id_rsa.pub
#用鼠标复制rsa公钥,并粘贴到服务器root目录下的.ssh/authorized_keys文件中(追加方式)

exit   #退出apache账户

测试

测试用apache账户用ssh登录

ssh root@xxx.xxx.xxx.xxx
#按提示输入yes

这一步是必须的。因为初次用ssh登录,会提示验证同意,选择yes后,以后就不出这个提示了,就能正常执行post-commit脚本了。

好了,大概就是这个样子,希望对你有帮助。

时间: 2024-07-31 19:41:29

从svn服务器自动同步到另一台服务器的相关文章

把插入的数据自动备份到另一个表中 ~ 语境:本地和服务器自动同步

异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html 后期博客首发:http://dnt.dkill.net/Article/Detail/316 逆天最近在弄一个本地和服务器自动同步的东西,每天都会添加很多新数据,本地和服务器同样的ShopMenu表,我总不能每次都把服务器的清掉然后再把本地的导入进去吧~ 可能有人说~直接插服务器的数据库不就可以了吗? 可惜==> 本地的数据测试通过后才允许同步到服务器中 可能又有人说~设置一

java程序部署在一台服务器,图片存在另一台服务器

问题描述 java程序部署在一台服务器,图片存在另一台服务器,用户如何通过访问程序这台服务器拿到另外一台服务器上的图片,还是说用户有方法可以直接访问图片服务器 解决方案 通过访问程序访问,不然如果图片服务器不允许外网访问,那么外网用户就访问不了,只能通过程序访问.如果是web应用的话,假如图片服务器访问地址为:http://192.168.1.1:8080/context_path/images/xxxx.jpg直接用<img src="http://192.168.1.1:8080/co

SQLServer 2000 数据库同步详细步骤[两台服务器]_MsSql

为什么要同步SQL Server 2000 数据库,它都用在什么场合 SQL Server 2000 数据库同步配置的原理 从0开始一步一步配置SQL Server 2000 数据库同步,非常细 已经非常熟练,可以看精品版SQL Server 2000 数据库同步配置 配置SQL Server 2000 数据库同步时的 常见问题 为什么要同步SQL Server 2000 数据库,它都用在什么场合 数据实时备份同步,数据库服务器出问题时我们也有其正常工作时的备份 数据实时备份同步,一台服务器负载

SQLServer 2000 数据库同步详细步骤[两台服务器]

为什么要同步SQL Server 2000 数据库,它都用在什么场合 SQL Server 2000 数据库同步配置的原理 从0开始一步一步配置SQL Server 2000 数据库同步,非常细 已经非常熟练,可以看精品版SQL Server 2000 数据库同步配置 配置SQL Server 2000 数据库同步时的 常见问题 为什么要同步SQL Server 2000 数据库,它都用在什么场合 数据实时备份同步,数据库服务器出问题时我们也有其正常工作时的备份 数据实时备份同步,一台服务器负载

旧台服务器IP秒切到新台服务器

因个别的服务器没有做备份,是独立一台提供服务的,又不能影响服务,只能把IP切到另外一台服务器上去:这时,可能你会觉得切ip不是很简单,切IP是很简单,但是切过IP是否能正常通信呢? 先说下方法: 比如说我要将IP 192.168.110.12  切到192.168.110.13 这台服务器上, 首先我需要在110.12 上操作 down 掉接口:之后在110.13 上UP出一个子接口,然后向网关声明新的地址 # ifconfig em1:0 192.168.110.12/24 && arp

当邮箱服务器与主控网站在同一台服务器时,邮箱虚拟主机请用8888端口_星外虚拟主机

默认状态下,主控端占用了80端口的空的主机头 当主控端检查到 http://mail.xxxx.com的格式时 会自动将它转向到 http://mail.xxxx.com:8888/ 如果你不用8888端口,就无法实现这样的转向了,因此,平台在自动设置时,会将Winwebmail的虚拟主机自动设置成8888端口的空的主机头,而对于Imail,您需要手工在Imail的管理器中,修改imail的web端口为8888

Linux中svn提交文件后自动同步更新到网站目录

 下面来为各位介绍Linux中svn提交文件后自动同步更新到网站目录希望文章对各位有帮助.     有时,对于多文件需要上传到服务器的时候将会很麻烦,但是如果使用svn的钩子脚本就容易实现本地提交svn后,自动同步代码文件到远程服务器的网站目录下,而不必手动上传了. 首先,在网站目录下checkout代码,例如我的目录是/data/www/test svn co https://127.0.0.1/test/trunk/ /data/www/test/ 注意,这是因为有时我会在服务器上直接修改代

项目管理实践【六】自动同步数据库【Using Visual Studio with Source Control System to synchronize database automatically】

在上一篇项目管理实践[五]自动编译和发布网站中,我们讲解了如何使用MSBuild+Robocopy+WebDeployment来自动编译和部署网站,今天,我们来看一下,如何使用MSBuild +SVN来自动同步数据库. 首先,将我们项目中的数据库文件和数据库日志文件放到某个目录下,这里放到StartKitDB目录下,然后在该目录下新建一个名为StartKitDB的文本文件,修改扩展名为proj,实际上,在理论上任何扩展名都可以,然后,使用记事本或其他程序打开文件,将下面的内容复制到其中,保存.

服务器文件同步管理

原文 http://www.cnblogs.com/yanxiaodi/archive/2011/03/21/2296462.html 前几天有台服务器电源坏了,还好数据没有丢.因此必须做好服务器文件内容的备份.服务器主要是用来提供网站服务,带着一个数据库,数据库可以用分发和订阅来解决,网页文件开发电脑也有备份,因此重点在上传的文件部分.   手动上传复制备份的方法显然不可行,需要做到自动将上传的文件同步到另一台服务器上.   找到了一个免费开源的文件同步工具:  FreeFileSync,官方