共计 7070 个字符,预计需要花费 18 分钟才能阅读完成。
一、概述
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 如下:
弹出如下: 填写版本库地址并输入账号密码
点击 OK 如图: 表示版本库配置成功!
3、向版本库提交文档
在库文件夹中创建 1.txt 文件添加到库中再提交如图:
如果不添加备注信息则无法提交成功, 出现如下图所示:
以上步聚如果在 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 来源; 如果这台主机备案过绑定过域名一般没有 这个问题, 这里只测试下逻辑!
如图:
总结:
我们通过 svn 管理版本, 可以实现提交, 回溯版本的功能, 通过 svn hooks 可以完成提交前的处理, 和提交后的处理工作; 这里只是抛砖引玉, 一般中小企业可以使用, 比如提交后结合 rsync 把更新的内容推到前端服务器上; 但需要注意 rsync 时排除一些配置文件; 网页形式的 svn 构建请看这里 https://www.linuxidc.com/Linux/2018-04/151896.htm