使用钩子脚本的意义:

我们在测试环境中搭建好svn后,开发人员可以正常的上传和下载写好的代码了。但是上传到测试服务器,在版本库中(tshop)是看不到这些数据的。所以在测试环境中(linux测试服务器)也看不到这些数据。所以我们还需要在linux测试服务器中,检出这些数据,放到lanmp(测试环境)中。这样开发才能在linux测试服务器上检测自己的代码是否有问题。这就用到了钩子脚本。

大致思路:

户提交程序到SVN,SVN触发hooks,按不同的hooks进行处理,这里用到的是post-commit(客户机在提交完成时,会执行post-commit中的内容),利用post-commit到代码检出到SVN服务器的本地硬盘目录(linux测试服务器上)

知识点:

1、SVN的hooks

# start-commit 提交前触发事务

# pre-commit 提交完成前触发事务

# post-commit 提交完成时触发事务

# pre-revprop-change 版本属性修改前触发事务

# post-revprop-change 版本属性修改后触发事务

我们现在客户机上以adm用户登录svn版本库。在版本库中创建wwwroot根目录。然后在客户端在检出。

编辑钩子脚本

mkdir /jianchu/www -p

svn co --username=adm --password=123 svn://192.168.3.10/tshop/wwwroot/ /jianchu/www

#将wwwroot下的目录检出到/jianchu/www下

mkdir /jianchu/wwwroot -p

useradd www

mkdir /var/log/svn

cd /data/svn/tshop/hooks/

cp post-commit.tmpl post-commit

chmod +x post-commit

vim post-commit

#!/bin/bash

export LANG=zh_CN.UTF-8

REPOS="$1"

REV="$2"

AUTHOR=`/usr/local/bin/svnlook author -r $REV $REPOS`

TIME=`date '+%F %T'`

echo "[$TIME]--[$AUTHOR] svn commit file:" >> /var/log/svn/svn_rain_update.log

lujing=`/usr/local/bin/svnlook changed -r $REV $REPOS | awk '{print $2}' | awk -F/ '{print $1}'|uniq`

if [ $lujing = wwwroot ];then

svnlook changed -r $REV $REPOS |while read line

do

updatePath=`echo $line |awk '{print $2}'|awk -F/ '{for(i=2;i<=NF;i++)printf $i"/"}{printf "\n"}'|sed 's/\/$//g'`

updatePath2=`echo $updatePath|awk -F/ '{for(i=1;i<=NF-1;i++)printf $i"/"}{printf "\n"}'`

fullUpdatePath="/jianchu/www/$updatePath"

fullUpdatePath2="/jianchu/wwwroot/$updatePath"

fullUpdatePath3=`echo $line |awk '{print $1}'`

if [ $fullUpdatePath3 = D ];then

/usr/local/bin/svn update --username adm --password 123 /jianchu/www/$updatePath2 >> /var/log/svn/svn_rain_update.log

rm -rf $fullUpdatePath2

else

/usr/local/bin/svn update --username adm --password 123 /jianchu/www/$updatePath2 >> /var/log/svn/svn_rain_update.log

/usr/bin/rsync -avz $fullUpdatePath $fullUpdatePath2 >> /var/log/svn/rsync.log

chown -R www.www $fullUpdatePath

chown -R www.www $fullUpdatePath2

fi

done

fi

解释:

一、命令格式:

svnlook author -r 更新的版本号(更新的第几次) 产品仓库路径

这条命令就可以获取更新数据的用户了。

例子:

[root@CentOS6-node1 hooks]# svnlook author -r 1  /data/svn/tshop/

adm

#adm用户提交的1版本

[root@CentOS6-node1 hooks]# svnlook author -r 2  /data/svn/tshop/

lisi

#lisi用户提交的2版本

二、

命令格式:

svnlook changed -r 更新的版本号(也是更新的第几次) 产品仓库路径

这条命令会获取更新最新的文件

例子:

[root@CentOS6-node1 hooks]# svnlook changed -r 1 /data/svn/tshop/ #A代表添加

A   abc/

[root@CentOS6-node1 hooks]# svnlook changed -r 2 /data/svn/tshop/

A   abc/asd/

三、

脚本中的

$AUTHOR :这个变量定义的是过滤出提交的用户谁。

$lujing :过滤出用户提交路径是否为wwwroot。我们在搭建服务时,定义的目录wwwroot是让所有的开发上传代码上传到这里。以便于管理(不至于根目录很乱)。adm用户管理根目录

$updatePath:提取上传的文件,并去掉每一行的"/"

例子:

本次11版本一共提交了3个文件如上

1[root@CentOS6-node1 ~]# svnlook changed -r 11 /data/svn/tshop/

A   wwwroot/11111/

A   wwwroot/33333/

A   wwwroot/44/

2[root@CentOS6-node1 ~]# svnlook changed -r 11 /data/svn/tshop/ |awk '{print $2}'

wwwroot/11111/

wwwroot/33333/

wwwroot/44/

3[root@CentOS6-node1 ~]# svnlook changed -r 11 /data/svn/tshop/ |awk '{print $2}'  |awk -F/ '{for(i=2;i<=NF;i++)printf $i"/"}'

11111//33333//44//[root@CentOS6-node1 ~]#

4svnlook changed -r 11 /data/svn/tshop/ |awk '{print $2}'  |awk -F/ '{for(i=2;i<=NF;i++)printf $i"/"}{printf "\n"}'

11111//

33333//

44//

(5)最后一部在去掉每行末尾的/

svn钩子脚本的更多相关文章

  1. 转:Windows下WSH/JS实现SVN服务器钩子脚本阻止提交空日志信息和垃圾文件

    http://blog.csdn.net/caikanxp/article/details/8279921 如何强制用户在提交SVN时填写日志信息? 如果用户使用的都是TortoiseSVN客户端,可 ...

  2. centos7配置svn钩子hooks脚本自动同步代码到项目目录

    由于项目需要,svn提交后的代码希望再测试服务器上测试,每次提交后还要手动去svn update一次 十分麻烦,配置好svn钩子以后就省去了这些麻烦. 进入svn版本库目录找到hooks目录找到文件p ...

  3. svn钩子(hooks)

    首先你需要搭建出自己的svn环境出来,并能成功导入导出,并且了解svn,这是看这篇文章的前提.... 出于公司开发部需要svn同步更新服务器代码,需要用到svn钩子(hooks)技术,以前从来没听过, ...

  4. 钉钉自定义机器人配合SVN钩子事件进行消息的推送实践

    目前很多公司还是使用SVN(TortoiseSVN)进行版本控制,使用简单,适合管理一般项目.协同办公软件目前钉钉比较成熟,阿里也一直在宣传推广,这两年公司也在使用,主要用于信息的沟通,其它的绩效.考 ...

  5. 使用TortoiseSVN的客户端钩子脚本触发Jenkins构建

    我们项目在开发过程中使用了Jenkins构建Windows版本,为了通过自动触发使构建的版本保持最新,可以采用的方法如下: Jenkins Poll SCM:设置Jenkins定时检查变更,在SVN版 ...

  6. 使用python编写svn钩子

    同上一篇trac中安装插件的文章的出发点一样,感觉用文档和口头制定规则在执行上会有偏差并且需要经常引导新人去熟悉规则. 所以,又费了几个小时去琢磨怎么改进svn提交代码的钩子,现有的钩子的功能比较简单 ...

  7. linux 设置svn钩子实现自动更新

    一.svn安装设置 1.安装svn启动 yum install subversion 2.建个svn的根目录,因为项目不止一个 mkdir -p /home/svn/3.新建一个新的空的版本仓库(su ...

  8. 使用SVN钩子强制提交日志和限制提交文件类型

    Subversion本身有很好的扩展性,用户可以通过钩子实现一些自定义的功能.所谓钩子实际上是一种事件机制,当系统执行到某个特殊事件时,会触发我们预定义的动作,这样的特殊事件在Subversion里有 ...

  9. svn钩子(hooks)

    目录 钩子脚本的具体写法就是操作系统中shell脚本程序的写法,请根据自己SVN所在的操作系统和shell程序进行相应的写作 所谓钩子就是与一些版本库事件触发的程序,例如新修订版本的创建,或是未版本化 ...

随机推荐

  1. 【编程思想】【设计模式】【行为模式Behavioral】中介者模式Mediator

    Python版 https://github.com/faif/python-patterns/blob/master/behavioral/mediator.py #!/usr/bin/env py ...

  2. Maven的聚合工程(多模块工程)

    在开发2个以上模块的时候,每个模块都是一个 Maven Project.比如搜索平台,学习平台,考试平台.开发的时候可以自己管自己独立编译,测试,运行.但如果想要将他们整合起来,我们就需要一个聚合工程 ...

  3. MyEclipse配置Spring框架(基础篇)

    一.新建项目,添加spring的相关jar包等 二.创建相关类以及属性和方法 Student.java package com.yh; public class Student implements ...

  4. java中二维数组初始化的几种方法

    /* 第一种方式 */ int tdarr1[][] = { { 1, 3, 5 }, { 5, 9, 10 } }; /* 第二种方式 */ int tdarr2[][] = new int[][] ...

  5. java中的++i是线程安全的吗?

    java中的++i是线程安全的吗?为什么?怎么使它线程安全呢? 先说答案: 非线程安全 先说下为什么是非线程安全的? 从Java内存模型说起 Java内存模型规定了所有的便利都存储在主内存中,每个线程 ...

  6. Docker从入门到精通(四)——常用命令

    话不多说,本篇文章给大家介绍 docker 的常用命令,基本上会覆盖我们日常使用的命令. 1.万能帮助命令 docker 命令 --help 假设你想用某个命令,但是又不知道该命令的一些参数怎么用,这 ...

  7. MySQL——基础查询与条件查询

    基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 1.查询列表可以是:表中的字段.常量值.表达式.函数 2.查询的结果是一个 ...

  8. 微信小程序项目使用npm安装vant-weapp的正确步骤,简单易懂!!

    微信小程序项目使用npm安装vant-weapp的正确步骤 1.在当前小程序项目目录npm init -y 构建npm项目 2.运行命令 npm install vant-weapp -S --pro ...

  9. vue-cli3 vue2 保留 webpack 支持 vite 成功实践

    大家好! 文本是为了提升开发效率及体验实践诞生的. 项目背景: 脚手架:vue-cli3,具体为 "@vue/cli-service": "^3.4.1" 库: ...

  10. java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求

    1.Java中客户端和服务器端通信的简单实例 Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一 ...