需求场景

      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. Spring 一二事(5) - 依赖注入

    <!-- 依赖注入的装配过程 --> <bean id="person" class="com.lee.spring007.di.xml.setter. ...

  2. maven总结3

    POM文件 maven版本:apache-maven-3.1.1 1.<modelVersion>4.0.0</modelVersion>  pom模型的版本,对于maven2 ...

  3. java 21 - 7 IO流小结的图解

  4. mysqli预处理和事务处理

    1 应用环境 mysqli预处理功能(大量数据处理时使用) 2 步骤 a)mysqli连接数据库 $mysqli = new mysqli('localhost','root','root','chu ...

  5. ArcGIS Engine 中 线加箭头

            ;             ICartographicLineSymbol pCartoLineSymbol = );             IArrowMarkerSymbol p ...

  6. 【转】【C#】ColorMatrix

    ColorMatrix(色彩矩阵),是GDI+里用来调整图片色彩的矩阵. 什么是矩阵,说白了就是C#里的二维数组. 那么这个矩阵调整色彩的原理是什么,他是怎么来调整色彩的呢?这个要从线性代数里的矩阵相 ...

  7. C语言 常用的时间函数

    //时间函数的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include& ...

  8. OpenCV人脸检测demo--facedetect

    &1 问题来源 在运行官网的facedetect这个demo的时候,总是不会出来result的图形,电脑右下角提示的错误是“显示器驱动程序已停止响应,而且已恢复 windows 8(R)”. ...

  9. LINUX SSH显示中文乱码

    ssh登陆后,执行: export LANG=zh_CN.gb2312就可以显示中文了.编辑/etc/sysconfig/i18n 将LANG="zh_CN.UTF-8" 改为 L ...

  10. python socket编程详细介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...