需求场景

      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脚本了。

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

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

  1. LINUX安装SVN+添加自动同步+远程下载最新代码

    LINUX安装SVN+添加自动同步+远程下载最新代码---------------------1. 新建一个用户:svnroot ,以下操作非特别说明皆为root用户操作--------------- ...

  2. jenkins自动部署代码到多台服务器

    下面讲一下如何通过一台jenkins服务器构建后将代码分发到其他的远程服务器,即jenkins自动部署代码到多台服务器. 1.下载 pulish over ssh 插件 2.系统管理 -> 系统 ...

  3. [转]svn提交自动同步到web服务器

    参考博文:http://my.oschina.net/wddqing/blog/201567 同步程序思路:用户提交程序到SVN,SVN触发hooks,按不同的hooks进行处理,这里用到的是post ...

  4. svn提交自动同步到web目录

    环境:CentOS6.5  测试线   svn和web服务器在同一台机器上   SVN版本1.6 情景:在测试环境下,开发部提出希望提交到SVN的代码能自动同步到WEB站点目录下,解决每次都要传双份这 ...

  5. SQL SERVER怎样将某个服务器上面的数据自动备份到另一台服务器上面(异地备份)

    一:试验背景 异地备份好处:(待补充) 1:异地备份了把原有服务器数据放在另外一个位置,避免些物理损害.  比把数据刻录光盘和原始数据放同房间了房间失火了备份数据也没有了要放另外地方避免了  就是备份 ...

  6. 在服务器上远程链接另一台服务器的数据库的方法how to connet the database from the other host

    iwangzheng.com 16:57 [root@a02.cmsapi]$ mysql -u<username> -p<password> -h10.103.xx.xx W ...

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

    有时,对于多文件需要上传到服务器的时候将会很麻烦,但是如果使用svn的钩子脚本就容易实现本地提交svn后,自动同步代码文件到远程服务器的网站目录下,而不必手动上传了. 首先,在网站目录下checkou ...

  8. svn版本库更新后自动同步到www

    注意:www目录一定要用SVN服务器 checkout出Repositories的代码 步骤: (1)新建www根目录 mkdir -p /data/www/lehuo (2)在www根目录下检出(c ...

  9. centos搭建svn 服务器 并同步到web 目录(总结)

    配置搭建步骤: Linux平台的SVN服务器的配置及搭建 从本地提交代码到svn代码库. 将代码库中代码同步到web目录: 1.在web目录中checkout版本库 进入/home/www目录下  ( ...

随机推荐

  1. Android SQLite (一) 数据库简介

    大家好,今天来介绍一下SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准 ...

  2. GridPanel中getSelectionModel

    GridPanel中getSelectionModel 更多 2014/5/1 来源:extjs学习浏览量:6783 学习标签: GridPanel extjs 本文导读:Ext.grid.GridP ...

  3. f2fs源码解析(五) node管理结构梳理

    node是f2fs重要的管理结构, 它非常重要! 系统挂载完毕后, 会有一个f2fs_nm_info结构的node管理器来管理node的分配. f2fs_nm_info中最让人疑惑的是几颗基数树: s ...

  4. 【Mysql】 my.ini配置一例

    # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-co ...

  5. 文件“D:\file.txt”正由另一进程使用,因此该进程无法访问该文件。

    关于如题的解决方案! 都是有一定编程基础的人,我就不讲其它的了. 1.在实例化一个FileStream后,用完它一定要关闭.先试试这一条: 2.第一条不起作用的话,用本条.在实例化FileStream ...

  6. css 兼容

    color:#0000FF\9; ;/*ie6,ie7,ie8*/ *color:#FFFF00;/*ie7*/ _color:#FF0000;/*ie6*/ body:nth-of-type(1) ...

  7. LeetCode 笔记24 Palindrome Partitioning II (智商碾压)

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  8. Java四种引用包括强引用,软引用,弱引用,虚引用。

    Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...

  9. vs2010 “SetScrollSizes”: 找不到标识符

    SetScrollSizes是CScrollView的成员函数,你的view类必须从CScrollView派生

  10. 尝试EJB整合Mybatis部署时报错:获得带有类加载器MybatisUtil的ModuleClassLoader的反射信息出错,请问大神如何解决

    mybatis的配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configurati ...