迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 操作系统 >

Linux服务器svn远程代码同步

作者:迹忆 最近更新:2016/05/14 浏览次数:

《搭建svn服务项目并且同步代码到项目目录》这篇文章中,我们简单介绍了使用svn将提交的代码同步到工作目录的实现方法。但是这里有一个问题,就是svn服务和我们的工作目录是在同一台服务器上面的。如果说我们的应用采用分布式部署的话,那岂不是在每一台应用服务器上面都部署svn服务,并且需要多次提交相同的代码。

本章我们就来介绍两种远程同步代码的方式

在hooks中使用scp命令进行远程同步

svn服务器:192.168.5.201
应用服务器:192.168.5.200

在这里我们需要借助scp远程拷贝文件命令。还有我们需要在5.201主机上面新建/STest目录,并且在该目录下检出一份代码。

# mkdir /STest
# cd /STest
# svn checkout svn://192.168.5.201 –username svnuser –password svnuser123

每次提交更新以后,我们先使用之前在一台服务器上面同步代码的方法更新到/STest目录下,然后利用svnlook changed 命令查看更新的文件(其实这里就是在查找/STest目录下更新的文件),最后再利用scp命令将/STest目录下更新的文件拷贝到5.200上对应的目录下。

在hooks目录下面新建post-commit文件,添加如下shell代码

#!/bin/bash
export LANG=zh_CN.UTF-8
 
REPOS="$1"
REV="$2"
SVN=/usr/bin/svn
SVNLOOK=/usr/bin/svnlook
WEB=/App
LOG=/data/home/auto_svn.log
 
#更新最新版本内容到本地的/STest
$SVN update $WEB --username svnuser --password svnuser123
 
#查看更新的文件
upfile=`$SVNLOOK changed -r $REV $REPOS`
 
#依次拷贝更新的文件到目标主机
for file in $upfile
do
 
  if [ -d /STest/${file} ]; then
#判断是否有新建的文件夹,如果是文件夹先利用ssh登录到目标主机,
#在目标主机上创建文件夹
        ssh root@192.168.18.239 "mkdir /www/App/${file}; exit"
  elif [ -f /STest/${file} ]; then
                   #如果更新的是文件,则直接利用scp命令远程拷贝文件到相应的目标文件
        scp  /STest/${file} root@192.168.18.239:/www/App/${file}
 
  fi
 
done

此种方式需要借助在5.201上存放一份儿代码,可以认为是scp拷贝文件临时借用的代码。虽说麻烦一些,但是在目标主机上的代码中不会存在.svn目录,可以说提高了应用的安全性。当然了,对于在应用代码中存在.svn的这种情况是可以通过nginx或者apache的重写功能过滤掉。

利用ssh登录目标主机更新文件

这种方式不同于上面的方式的是不需要在本地在存一份临时代码。

首先需要做的就是在目标主机5.200上新建应用项目/www/App,然后进入该应用目录,检出一份儿代码

#mkdir /www/App
#cd /www/App
#svn checkout svn://192.168.5.201 –username svnuser –password svnuser123

然后在每次有更新的代码提交的时候,使用ssh登录到目标主机,使用svn update 更新应用代码。

同样需要在hooks目录下新建post-commit 文件,编写shell代码如下

#!/bin/bash
export LANG=zh_CN.UTF-8
 
REPOS="$1"
REV="$2"
SVN=/usr/bin/svn
SVNLOOK=/usr/bin/svnlook
MASTERDIR=/www
TARGETDIR=/App
LOG=/data/home/auto_svn.log
#查看更新的文件夹
updirs=`$SVNLOOK dirs-changed -r $REV $REPOS`
 
CHANGEDIR=$(echo "$updirs" | head -1)  # updirs里的最上级目录
 
#使用ssh登录目标主机,进行更新操作
ssh root@192.168.5.200 “export LANG=zh_CN.UTF-8;  svn update --username svnuser --password svnuser123  ${MASTERDIR}${TARGETDIR}”

上面这种方法不好的地方就是代码中会存在.svn目录,这样存在安全性问题。不过这是可以通过nginx重写功能过滤掉的。

上面两种方式各有优劣,我个人喜欢使用第一种方式。希望本章的介绍能帮到大家。

除非注明转载,本站文章均为原创或翻译,欢迎转载,转载请以链接形式注明出处

本文地址:

迹忆客

专注技术分享,项目实战分享!

技术宅 乐于分享 7年编程经验
社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

热门文章

教程更新

热门标签