Linux服务器svn远程代码同步
在《搭建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重写功能过滤掉的。
上面两种方式各有优劣,我个人喜欢使用第一种方式。希望本章的介绍能帮到大家。
相关文章
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 Linux 中更新 YUM
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
本文介绍了 Linux 中的 yum update 命令。本文将教我们如何在 Linux 中更新 YUM,以及如何在 Linux 系统上安装、更新、删除、查找和管理包。
在 Linux 中安装 Deb 文件
发布时间:2023/05/04 浏览次数:130 分类:操作系统
-
本文介绍如何在 Linux 中安装 deb 文件。在这篇 Linux 文章中,我们将学习如何在 Linux 系统上安装 .deb(Debian 软件包)文件。 我们还将看到如何在安装后删除 .deb 文件。
Linux 中的 lsof 命令
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
在这篇 Linux 文章中,我们将了解 Linux 操作系统中的 lsof 命令。 我们将看到如何在 Linux 中将此命令用于不同目的。
Linux 解决不能执行二进制文件问题
发布时间:2023/05/04 浏览次数:187 分类:操作系统
-
在本文中,我们将学习如何在 Linux 中执行二进制文件。 如果 Linux 无法执行二进制文件,我们还将学习如何解决错误。
Linux 中错误 Mesg: Ttyname Failed: Inappropriate Ioctl for Device Error
发布时间:2023/05/04 浏览次数:145 分类:操作系统
-
本文介绍如何在 Linux 中解决 mesg: ttyname failed: inappropriate ioctl for device 错误。在 Linux 中,这个错误是由于默认的 vagrant 配置 config.ssh.shell 与 bash -l 交互导致的。
Linux 中的 ps aux 命令
发布时间:2023/05/04 浏览次数:69 分类:操作系统
-
本篇文章将讨论 Linux 中的 ps aux 命令。如果将 aux 快捷方式与 ps 命令一起使用,它将显示用户需要的最多信息,并可以为您提供系统运行进程的当前状态。
Linux 中的 NTP
发布时间:2023/05/04 浏览次数:137 分类:操作系统
-
本篇文章将讨论 Linux 中的 ntp。NTP 是大多数 IT 基础设施使用的核心协议。 使用它的目的是同步日期和时间信息。
在 Linux 中计算文件中的唯一行
发布时间:2023/05/04 浏览次数:70 分类:操作系统
-
计算文件中的唯一行是 Linux 中的一项常见任务,可以使用多种不同的工具和方法来执行此操作。使用 sort 和 uniq 命令计算文件中的唯一行数