Linux centos hook,CentOS7安装配置SVN及SVN Hook实战

一、概述

1、何为svn?

Apache Subversion(简称SVN,svn),一个开放源代码的版本控制系统;用来管理文档,程序代码等文档的版本;svn相对git来说有点古老,是一个中心控制的版本控制系统,时至今日仍有不少企业依然使用svn做为代码等文档的管理服务;

今天我们就来先介绍下在CentOS7下安装部署svn服务与日常使用以及重点介绍svn的两个hooks使用;

2、环境介绍

Svn server:CentOS7.4_x64 ip:172.16.3.167 subversion 1.97 (最新稳定版);何用yum安装

关闭selinux 关闭防火墙(生产线上务必添加好防火墙规则)

测试端win7 下载安装Tortoisesvn客户端请下载与系统版本对应的客户端软件

3、安装Subversion

添加repo源

[root@localhost ~]# cat /etc/yum.repos.d/svn.repo

[WandiscoSVN]

name=Wandisco SVN Repo

baseurl=http://opensource.wandisco.com/centos/$releasever/svn-1.9/RPMS/$basearch/

enabled=1

gpgcheck=0

安装

[root@localhost ~]# yum install subversion -y

注意 系统自带源中安装的是1.7.x的版本,所以通过此源安装最新的版本;

二、svn服务器的配置

1、添加到系统服务

默认安装完安装包中不提供systemd服务,因此需要自行配置,以下是我的配置

[root@localhost ~]# cat /usr/lib/systemd/system/svnd.service

[Unit]

Description=subversion server daemon

Documentation=man:svn(8) man:svn(5)

After=network.target

[Service]

Type=forking

#User=svn

#Group=svn

EnvironmentFile=/etc/sysconfig/svnd      ##相关配置参数所在文件

ExecStart=/usr/bin/svnserve -d --listen-port $PORT --pid-file $pid_file --log-file $log_file -r $SVN_HOME

ExecReload=/bin/kill -HUP $MAINPID

KillMode=process

Restart=on-failure

RestartSec=20s

[Install]

WantedBy=multi-user.target

[root@localhost ~]# cat /etc/sysconfig/svnd

##Configure for subversion

pid_file=/var/run/svn.pid

SVN_HOME=/data1/svn_data/projects      #svn主数据目录

log_file=/var/log/svnd.log

PORT=33690                  #自定义端口为33690

# systemed服务重载

[root@localhost ~]# systemctl daemon-reload

说明:以上的参数均是通过 svnserve --help 获取配置进去的!

创建目录

mkdir -pv /data1/svn_data/projects

启动服务

[root@localhost ~]# systemctl start svnd

[root@localhost ~]# systemctl status svnd

● svnd.service - subversion server daemon

Loaded: loaded (/usr/lib/systemd/system/svnd.service; disabled; vendor preset: disabled)

Active: active (running) since 五 2018-01-26 15:39:22 CST; 30min ago

Docs: man:svn(8)

Process: 4347 ExecStart=/usr/bin/svnserve -d --listen-port $PORT --pid-file $pid_file --log-file $log_file -r $SVN_HOME (code=exited, status=0/SUCCESS)

Main PID: 4348 (svnserve)

CGroup: /system.slice/svnd.service

└─4348 /usr/bin/svnserve -d --listen-port 33690 --pid-file /var/run/svn.pid --log-file /var/log/svnd.log -r /data1...

1月 26 15:39:22 localhost.localdomain systemd[1]: Starting subversion server daemon...

1月 26 15:39:22 localhost.localdomain systemd[1]: Started subversion server daemon.

添加开机启动:

[root@localhost ~]#  systemctl enable svnd

2、添加账号

由于添加账号和密码比较频繁与繁琐,因此编写脚本处理,参考如下:

#!/bin/bash

#Author: san

#version: 1.0

#date: 2018-01-26

###########################

SvnDataDir=/data1/svn_data/projects

pre_commit_config=${SvnDataDir}/pre-commit

[ -d ${SvnDataDir}/CodeAuth ] || mkdir -pv ${SvnDataDir}/CodeAuth

[ -f ${SvnDataDir}/CodeAuth/authz ] || touch ${SvnDataDir}/CodeAuth/authz

[ -f ${SvnDataDir}/CodeAuth/passwd ] || touch ${SvnDataDir}/CodeAuth/passwd

prog="$1"

if [ $# -eq 0 ]

then

echo  "Have no project's name input,progame exit." && exit 0

fi

cd $SvnDataDir

[ -d $prog ]|| mkdir -p ${SvnDataDir}/$prog

read -p "Give a paassword:-> " propwd

#echo $propwd >>propwd.txt

/usr/bin/svnadmin create $SvnDataDir/$prog

cd $SvnDataDir/$prog/conf

if [ -f ${SvnDataDir}/CodeAuth/passwd ]

then

echo "$prog = $propwd" >>${SvnDataDir}/CodeAuth/passwd

else

echo "[users]" >>${SvnDataDir}/CodeAuth/passwd

echo "$prog = $propwd" >>${SvnDataDir}/CodeAuth/passwd

fi

echo "[$prog:/]" >>${SvnDataDir}/CodeAuth/authz

echo "$prog = rw" >>${SvnDataDir}/CodeAuth/authz

sed -i 's/^# anon-access = read/anon-access = none/g' svnserve.conf

sed -i 's/^# auth-access = write/auth-access = write/g' svnserve.conf

sed -i 's/^# password-db = passwd/password-db = \/data1\/svn_data\/projects\/CodeAuth\/passwd/g' svnserve.conf

sed -i 's/^# authz-db = authz/authz-db = \/data1\/svn_data\/projects\/CodeAuth\/authz/g' svnserve.conf

sed -i "s/^# realm = .*./realm = $prog projects /g" svnserve.conf

cp $pre_commit_config ${SvnDataDir}/$1/hooks/ && chmod +x ${SvnDataDir}/$1/hooks/pre-commit

systemctl restart svnd

添加可执行权限

[root@localhost ~]# chmod +x add.sh

说明:脚本中有一个pre-commit文件,这个文件是svn hooks 钩子之一,用于控制向版本库中提交时的动作;比如很多开发人员提交代码到库中时不填写备注信息,导致后期回滚时或检查时找不到对应的说明,因此可以通过pre-commit钩子来强性让提交代码时填写点信息;这个文件默认是shell可执行文件;也可以是其他语言写的可执行文件;

以下就是强制提交代码时需要填写信息的钩子,作为默认的模板放在svn数据根目录下~

[root@localhost ~]# cat /data1/svn_data/projects/pre-commit

#!/bin/bash

REPOS="$1"

TXN="$2"

# Make sure that the log message contains some text.

SVNLOOK=/usr/bin/svnlook

#$SVNLOOK log -t "$TXN" "$REPOS" | \

#  grep "[a-zA-Z0-9]" > /dev/null || exit 1

# Check that the author of this commit has the rights to perform

# the commit on the files and directories being modified.

#commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`

if [ "$LOGMSG" -lt 5 ];#要求注释不能少于5个字符,您可自定义

then

echo -e "\nLog message cann't be empty! you must input more than 5 chars as comment!." 1>&2

exit 1

fi

# All checks passed, so allow the commit.

exit 0

此时就可以通过add.sh脚本来添加一个svn库(账号和库同名);如添加san账号也在/data/svn_data/projects/下创建了针对san的svn版本库,示例如下:

[root@localhost projects]# ./add.sh san

mkdir: 已创建目录 "/data1/svn_data/projects/CodeAuth"

Give a paassword:-> 123.com

[root@localhost projects]# ls

add.sh  CodeAuth  pre-commit  san

[root@localhost projects]# cat CodeAuth/authz

[san:/]

san = rw

[root@localhost projects]# cat CodeAuth/passwd

[users]

san = 123.com

到此svn server配置完成;接下看看客户端的使用!

三、svn客户端使用

1、安装Tortoisesvn

下载地址看上面,安装很方便直接下一步到完成!

2、添加版本库

在桌面上新建一个文件夹名字随便取这里叫work

把work目录作为库目录checkout 如下:

d711eea1ae44c911a6020e43eab663ba.png

弹出如下:填写版本库地址并输入账号密码

2cb98936cb234f7b9bebc2dc535a9646.png

点击OK 如图:表示版本库配置成功!

fd160ae18c9ea4c10fa79becb9721e44.png

3、向版本库提交文档

在库文件夹中创建1.txt文件添加到库中再提交如图:

529f7648b5fdb3e3c4ae204a26c7f458.png

bdffe7365c6c57d8be45669af13c49e4.png

900141da2db00acbf96cd9b0a1064af7.png

如果不添加备注信息则无法提交成功,出现如下图所示:

6a316891a9f5faea471fff14f2f324e2.png

以上步聚如果在linux下可以使用命令行处理;

checkout 目录为版本库目录

svn co svn://172.16.3.167:33690/san --username san --password 123.com 目录

如添加文件到版本库

svn add 1.txt

提交到库

svn commit -m "说明信息"

这里就不多说了!

四、svn之post-commit钩子使用

1、post-commit钩子说明

post-commit钩子默认和pre-commit钩子一样是没有启用的(所有钩子函数默认都没有 启用);但默认都有一个模板;位置在版本库的hooks下;如san账号对应的版本库

[root@localhost hooks]# ls

post-commit.tmpl  post-revprop-change.tmpl  pre-commit      pre-lock.tmpl            pre-unlock.tmpl

post-lock.tmpl    post-unlock.tmpl          pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl

2、使用post-commit

通过模板复制成post-commit

[root@localhost hooks]# cp post-commit.tmpl post-commit

默认内容如下:

[root@localhost hooks]# egrep -v '(^$|^#)' post-commit

REPOS="$1"

REV="$2"

TXN_NAME="$3"

mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf

让我们修改下,效果是:当我们使用san账号往san库中提交时,让post-commit给我发一份邮件包含版本号,提交时间,提交内容等信息;

[root@localhost hooks]# cat post-commit

#!/bin/bash

export LANG=en_US.UTF-8

REPOS="$1"

REV="$2"

LOGFILE=/data1/svn_data/projects/san/hooks/changedir.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")

echo "$CHANGEDDIRS" >>/data1/svn_data/projects/san/hooks/changedir.log

#获取修改子项目目录名

Rsync_Dir=`echo $CHANGEDDIRS |awk -F / '{print $1}'`

#echo "$Rsync_Dir at `date`" >/tmp/testdir.log

function myecho() {

echo "$TIME" "$*"

}

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

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

myecho "提交备注:$MESSAGE"

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

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

echo "$AUTHOR 代码更新成功,版本:$REV请熟知 时间:`date +%Y-%m-%d-%H:%M:%S`.项目内容:$Rsync_Dir" | mail -s "$AUTHOR 代码更新OK" xxxxxxxx@qq.com    #换成你的邮箱

注意:这里的mail命令如果系统中没有 ,需要yum install mailx -y;

再对版本库进行提交动作时就会向指定邮箱中发送邮件 ,发送多个邮箱地址需要空格隔开;

你会发现QQ邮箱默认当作垃圾邮件,因为你没有 备案 不是合法公网ip来源;如果这台主机备案过绑定过域名一般没有 这个问题,这里只测试下逻辑!

如图:

2e94bd12a4efdd19011d60a9f573d74f.png

总结:

我们通过svn管理版本,可以实现提交,回溯版本的功能,通过svn hooks可以完成提交前的处理,和提交后的处理工作;这里只是抛砖引玉,一般中小企业可以使用,比如提交后结合 rsync把更新的内容推到前端服务器上;但需要注意rsync时排除一些配置文件;网页形式的svn构建请看这里 https://www.linuxidc.com/Linux/2018-04/151896.htm

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值