利用SVN的post-commit钩子实现多项目自动同步

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qicheng0211.blog.51cto.com/3958621/1563159

svn的post-commit钩子脚本在每次提交(commit)之后运行,我们可以在这个脚本里实现一些比较实用的功能,比如发送邮件提醒、自动备份版本库,自动同步代码到web服务器等。

这里用post-commit实现多项目自动同步,思路:在svn版本仓库根目录下划分多个项目文件夹,项目组成员在提交文件时,post-commit自动判断文件所属的项目,然后同步到相应的WEB服务器上。

测试环境配置:

SVN服务器:172.16.4.234

项目1WEB服务器:172.16.4.235

项目1代码库:svn://172.16.4.234/project1

项目2WEB服务器:172.16.4.236

项目2代码库:svn://172.16.4.234/project2

下面是操作步骤:

一、WEB服务器

WEB服务器作为SVN客户端,从SVN服务器上checkout一份代码到本地。注意要先切换到www用户再checkout,因为www是apache或nginx的执行用户(你的环境可能不一样)。

项目1WEB服务器,站点根目录为/data/apps/project1:


1

2

3

shell# su www

shell$ cd /data/apps/

shell$ svn co --username zb --password 123456 svn://172.16.4.234/project1

项目2WEB服务器,站点根目录为/data/apps/project2:


1

2

3

shell# su www

shell$ cd /data/apps/

shell$ svn co --username zb --password 123456 svn://172.16.4.234/project2

二、配置ssh无密码访问

SVN服务器需要无密码ssh访问WEB服务器,方便post-commit脚本ssh到WEB服务器上执行svn up。注意这里设置www用户无密码访问,因为WEB服务器上代码是www用户checkout出来的。

在SVN服务器上执行ssh-keygen -t rsa,然后一直按回车键,生成公钥和私钥保存在/root/.ssh/。

然后在WEB服务器上先切换到www用户,建立authorized_keys文件:


1

2

3

4

5

[[email protected] ~]# su www

[[email protected] root]$ cd

[[email protected] ~]$ mkdir .ssh

[[email protected] ~]$ chmod 755 .ssh/

[[email protected] ~]$ vi .ssh/authorized_keys

把SVN服务器上/root/.ssh/id_rsa.pub公钥文件的内容拷贝到authorized_keys文件里。然后设置authorized_keys文件权限为600。


1

[[email protected] ~]$ chmod 600 .ssh/authorized_keys

测试,SVN服务器登录项目1WEB服务器:


1

2

[[email protected] ~]# ssh [email protected]

[[email protected] ~]$

三、SVN服务器post-commit

post-commit在SVN的hooks目录下。

post-commit脚本内容:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

#!/bin/sh

REPOS="$1"                  # 仓库的路径

REV="$2"                    # 新提交的版本号

LOGFILE=/var/log/svn.log    # 钩子脚本的日志

# 脚本的标准输出和标准错误输出都打印到日志文件里

exec 1>>"$LOGFILE"

exec 2>&1

SVNLOOK=/usr/bin/svnlook

TIME=$(date "+%Y-%m-%d %H:%M:%S")

AUTHOR=$($SVNLOOK author -r $REV "$REPOS")  #提交作者

CHANGEDDIRS=$($SVNLOOK dirs-changed $REPOS) #修改的目录集合

MESSAGE=$($SVNLOOK log -r $REV "$REPOS")    #提交时的备注信息,不建议用中文

# SVN客户端配置,需要自行修改**********************************

CLIENT1=172.16.4.235        #project1的服务器

CLIENT2=172.16.4.236        #project2的服务器

CLIENTSVNROOT=/data/apps    #WEB服务器的代码根目录

SVNUSER="zb"

SVNPASSWD="123456"

#**************************************************************

function myecho() {

echo "$TIME" "$*"

}

myecho "**************************************************************"

myecho "提交版本:$REV 作者:$AUTHOR"

myecho "提交备注:$MESSAGE"

myecho "修改目录:$(echo $CHANGEDDIRS | tr ‘\n‘ ‘ ‘)"

MASTERDIR=$(echo "$CHANGEDDIRS" | head -1)  #CHANGEDDIRS里的最上级目录

# 遍历提交的代码目录,同步到WEB服务器上

while [ "$CHANGEDDIRS" != "" ];do

PROJECT=$(echo $MASTERDIR | awk -F / ‘{print $1}‘)

# 判断项目文件夹

if [ "$PROJECT" == "project1" ];then

myecho

myecho "项目:$PROJECT 同步目录:$MASTERDIR"

myecho "同步 $MASTERDIR 到 $CLIENT1:$CLIENTSVNROOT/$MASTERDIR"

# 无密码ssh连接到客户端服务器,执行svn up

/usr/bin/ssh [email protected]$CLIENT1 "export LANG=en_US.UTF-8; svn up --non-interactive --username $SVNUSER --password $SVNPASSWD ‘$CLIENTSVNROOT/$MASTERDIR‘"

elif [ "$PROJECT" == "project2" ];then

myecho

myecho "项目:$PROJECT 同步目录:$MASTERDIR"

myecho "同步 $MASTERDIR 到 $CLIENT2:$CLIENTSVNROOT/$MASTERDIR"

/usr/bin/ssh [email protected]$CLIENT2 "export LANG=en_US.UTF-8; svn up --non-interactive --username $SVNUSER --password $SVNPASSWD ‘$CLIENTSVNROOT/$MASTERDIR‘"

else

:

fi

# 在目录集合里删除子目录

CHANGEDDIRS=$(echo "$CHANGEDDIRS" | grep -v "^$MASTERDIR")

# 获取新的需要同步的最上级目录

MASTERDIR=$(echo "$CHANGEDDIRS" | head -1)

done

不要忘记给post-commit可执行权限。

四、测试

在项目1的"project1/client"和"project1/server"目录下分别上传一个"新建文本文档.txt",查看日志文件/var/log/svn.log:   

日志显示文件已经同步到项目1WEB服务器上了。

本文出自 “启程的Linux博客” 博客,请务必保留此出处http://qicheng0211.blog.51cto.com/3958621/1563159

时间: 2024-08-25 16:29:13

利用SVN的post-commit钩子实现多项目自动同步的相关文章

svn服务端hooks钩子可用于多项目自动同步

废话不多说,直接上post-commit脚本了: 日志会全部记录下来包括同步的文件 vim post-commit #!/bin/sh REPOS="$1" # 仓库的路径 REV="$2" # 新提交的版本号 export LC_ALL="zh_CN.UTF-8" expor LANG="en_US.UTF-8" LOGFILE=/var/log/svn-hooks.log # 钩子脚本的日志 # 脚本的标准输出和标准错误输

利用SVN钩子同步程序注意事项

暂时记下,此文章内容稍后验证. 前言:其实利用SVN实时同步到WEB服务器即时展现出来的文章已经到处都是,但是我在做的时候 还是有不少的小问题,很多文章也没有提出来过,还有同步也是,我还是记录下自己做过的尤其是一些细节,时间一长又会忘掉了. 同步程序思路:用户提交程序到SVN,SVN触发hooks,按不同的hooks进行处理,这里用到的是post-commit,利用post-commit到代码检出到SVN服务器的本地硬盘目录,再通过rsync同步到远程的WEB服务器上. 知识点:1.SVN的ho

yum搭建svn apache 利用钩子检出到web目录 自动同步

目的: 服务器上搭建svn,和apache,利用svn的 钩子 实现本地修改,同步到web目录下,使用yum装. 一: 关闭selinux,关闭防火墙或者开放相关端口. [[email protected] python]# vim /etc/selinux/config [[email protected] python]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SE

svn服务器的搭建以及利用svn hook与web根目录同步

svn原理图示 2.SVN服务器的搭建 1.查看是否安装svn   rpm -qa | grep subversion   2.安装 yum install subversion 3.测试是否安装成功   /usr/bin/svnserve --version   如提示以下内容,说明已安装成功   --------------------------------------   svnserve,版本 1.6.11 (r934486)      编译于 Apr 11 2013,17:28:04

如何利用svn自动同步更新到网站服务器

我们最终的目的是:当本地提交后,SVN服务器自动更新服务器端指定WEB目录内的文件 实现方法: 找到服务器端 SVN版本库所在的目录(目录名称是Repositories),这个目录是在安装VisualSVN Server设置的,根据你安装时的设置找到Repositories这个目录,在这个目录下面找到你创建的项目目录,在项目目录下面找到hooks目 录,在此目录中创建一个名为post-commit.bat的批处理文件,内容如下: @echo off "D:\VisualSVN Server\bi

利用SVN进行个人代码管理

本文记录利用SVN客户端TortoiseSVN来进行简单的个人代码管理.刚开始使用SVN客户端,随着版本管理的经验的积累,对SVN的理解不断加深,可以慢慢补充. 首先,安装TortoiseSVN. 选择一个空的目录 建立一个SVN Repository,右键->TortoiseSVN->Create repository here. 注意SVN的URL方式: 新建一个工作目录,个人理解就是开发目录.以后需要不断的上传同步的目录.此时这个目录为空. 此时,代码仓库还是空的,工作目录也是空的. 将

SVN学习笔记三——钩子的应用

钩子脚本的具体写法就是操作系统中shell脚本程序的写法,请根据自己SVN所在的操作系统和shell程序进行相应的写作所谓钩子就是与一些版本库事件触发的程序,例如新修订版本的创建,或是未版本化属性的修改.每个钩子都会被告知足够多的信息,包括那是什么事件,所操作的对象,和触发事件的用户名.通过钩子的输出或返回状态,钩子程序能让工作继续.停止或是以某种方式挂起. 所以钩子实际上是一个能够针对svn的操作触发特定操作的脚本,其实看一下其中的模板可以知道,钩子也是shell脚本,通过这些脚本来完成一些我

分享一个生产环境中利用SVN上线代码的脚本

本文讲述的是利用SVN+RSYNC上线代码的生产案例,适用于小型公司及企业,让运维从频繁的上线代码中解脱出来.以下对应的web服务器也适用于Windows服务器及Linux服务器 REPOS="$1" REV="$2" export LANG=zh_CN.UTF-8 export RSYNC_PASSWORD=RSYNC_PASSWORD RSYNC_USER=RSYNC_USER PROJECT_NAME=`basename $REPOS` SVN_DIR=/sv

利用SVN进行任意文件对比

都知道SVN可以比较已经上传的文件的内容,看到两个文件有什么不同的地方. 但是有时候并不想上传想要比较的文件,能不能利用SVN这样一个功能去比较别的两个文件呢? 琢磨来琢磨去, 发现只要在资源管理器里面同时选中两个文件,再在上面点击鼠标右键,选择[TortoiseSVN]→[Diff]就可以了. 效果和新旧版本文件对比是一样的. 这样就不用到处找文件对比软件了,好方便有木有~