CentOS6.5 配置Subversion

背景

需要部署Subversion进行版本控制,团队习惯用Subversion,自然Git也有部署,后续慢慢切入。
不基于Apache,也就是http无法访问,只通过svn访问。
不源码编译,版本兼容会有问题。

Subversion目录说明:
dav目录:是提供apache与mod_dav_svn使用的目录,让他们存储内部数据 db目录:就是所有版本控制的数据存放文件
hooks目录:放置hook脚本文件的目录 locks目录:用来放置subversion锁定数据的目录,追踪存取文件库的客户端
format文件:是一个文本文件,里面只放了一个整数。表示当前文件库配置的版本号 conf目录:是这个仓库的配置文件(仓库的用户访问账号、权限等)

安装

查询是否已经有安装,并查询安装信息:

1
2
3
4
5
6
7
8
# 查询是否安装及版本
rpm -qa subversion
# 移除
yum remove subversion
# 安装
yum install subversion
# 查询安装目录
rpm -ql subversion

基本配置

本次配置将针对多个版本库,其访问统一为:svn://ip/project1,可在下面分别创建多个库。

创建svn库并初始化

1
2
3
4
5
6
7
8
9
10
11
# 创建版本库路径
mkdir -p /home/svn/repos/project1
# 新建一个版本仓库
svnadmin create /home/svn/repos/project1
# 初始化版本库中目录
mkdir project project/server project/server/branches project/server/tags project/server/trunk project/android project/android/branches project/android/tags project/android/trunk project/ios project/ios/branches project/ios/tags project/ios/trunk
svn import project/ file:///home/svn/repos/project1 -m 'init svn folder'
# 可删除临时创建文件,或者保留以后创建其他版本库继续使用
rm -rf project
# 保留以后继续使用
mv project /home/svn/projectTemp

其中project目录为:

1
2
3
4
5
6
7
8
9
10
11
12
13
project/
├── android
│ ├── branches
│ ├── tags
│ └── trunk
├── ios
│ ├── branches
│ ├── tags
│ └── trunk
└── server
├── branches
├── tags
└── trunk

/home/svn/repos目录为:

1
2
3
4
5
6
7
8
/home/svn/repos/
└── project1
├── conf
├── db
├── format
├── hooks
├── locks
└── README.txt

配置svn

版本库用户统一管理,故这里会直接在/home/svn目录创建conf文件并保存其配置。

1
2
# 创建配置目录
mkdir /home/svn/conf

配置用户

移动用户配置文件:

1
mv /home/svn/repos/project1/conf/passwd /home/svn/conf/

配置文件:

1
vim /home/svn/conf/passwd

修改里面用户,格式username = passwd的条目即可。

1
2
[users]
hwangjr = hwangjr

修改访问策略

移动用户配置文件:

1
mv /home/svn/repos/project1/conf/authz /home/svn/conf/

配置文件:

1
vim /home/svn/conf/authz

修改里面配置,groups为定义用户群组,其他为配置访问权限,需要注意是* =表示除了上面配置的用户组之外,任何人都被禁止访问本目录,此必须加上

1
2
3
4
5
6
[groups]
dev = hwangjr

[project1:/]
@dev = rw
* =

修改svnserve,让配置生效

拷贝用户配置文件:

1
cp /home/svn/repos/project1/conf/svnserve.conf /home/svn/conf/

配置文件:

1
vim /home/svn/conf/svnserve.conf

修改里面配置。

1
2
3
4
5
[general]
anon-access = none
auth-access = write
password-db = /home/svn/conf/passwd
authz-db = /home/svn/conf/authz

启动/停止svn

1
2
3
4
5
6
7
8
9
10
svnserve -d -r /home/svn/repos
# 指定port
svnserve -d -r /home/svn/repos --listen-port 3391
# 停止svn
killall svnserve
# ps
ps -ef | grep svnserve
kill -9 pid
# 查看端口
netstat -tlnp | grep svn

测试访问

本地测试即可:

1
svn co svn://127.0.0.1/project1 --username hwangjr --password hwangjr

新增一个版本库

本次配置可管理多个版本库,且用户共用,新增一个版本库很简单:

1
2
3
4
mkdir /home/svn/repos/project2
svnadmin create /home/svn/repos/project2
rm -rf /home/svn/repos/project2/conf/passwd /home/svn/repos/project2/conf/authz
cp /home/svn/conf/svnserve.conf /home/svn/repos/project2/conf/

此版本库已经新增完毕,如果需要初始化目录,则可采用上面方式:

1
svn import /home/svn/projectTemp/  file:///home/svn/repos/project2 -m 'init svn folder'

可编辑/home/svn/conf/passwd来新增/删除用户,可编辑/home/svn/conf/authz来控制权限。举个authz栗子:

1
2
3
4
5
6
7
[project1:/]
@dev = rw
* =

[project2:/]
@dev = rw
* =

自启动

通过服务来启动即可,编辑vim /etc/init.d/svnserve,修改OPTIONS为-r /home/svn/repos,片段为:

1
2
3
4
5
6
### END INIT INFO

OPTIONS="-r /home/svn/repos"

# Source function library.
. /etc/rc.d/init.d/functions

设置服务自启动:

1
chkconfig svnserve on

防火墙

如果对防火墙有疑问,可以参考另一篇iptables,开放所需端口即可:

1
2
3
4
5
# 查看端口
netstat -tlnp | grep svn
# 开放端口
iptables -A INPUT -p tcp --dport 3690 -j ACCEPT # SVN
/etc/init.d/iptables save

或者编辑配置文件:

1
2
-A INPUT -p tcp -m tcp --dport 3690 -j ACCEPT
service iptables restart

常用配置

强制提交写LOG

配置pre-comit文件,要求用户提交前必须写LOG。

1
2
3
cd /home/svn/repos/project1/hooks
vim pre-commit
chmod +x pre-commit

pre-commit文件内容:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
# 5(要求的LOG长度,依实际需要修改)
if [ "$LOGMSG" -lt 5 ];
then
echo -e "\nEmpty log message not allowed. Commit aborted!" 1>&2
exit 1
fi

可修改LOG

配置pre-revprop-change文件,此文件在show log中修改log时会运行,得到修改的权限,否则会报错:

1
DAV request failed; it’s possible that the repository’s pre-revprop-change hook either failed or is non-existent. At least one property change failed; repository is unchanged

1
2
3
cd /home/svn/repos/project1/hooks/
vim pre-revprop-change
chmod +x pre-revprop-change

文件内容如下:

1
2
3
4
5
6
7
8
#!/bin/sh

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
if ["$PROPNAME" = "svn:log"];then exit 0;fi
exit 1

HTTP服务器(未进行验证 )

转换密码

HTTP不支持明文,Perl脚本来进行转化密码,脚本目录下会多一个webpasswd文件:

1
2
3
4
cd /home/svn/conf/
vim ptopw.pl
chmod +x ptopw.pl
./ptopw.pl

脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl

use warnings;
use strict;

#open the svn passwd file
open (FILE, "../conf/passwd") or die ("Cannot open the passwd file!!!\n");

#clear the apache passwd file
open (OUT_FILE, ">webpasswd") or die ("Cannot open the webpasswd file!!!\n");
close (OUT_FILE);

#begin
foreach (<FILE>) {
if($_ =~ m/^[^#].*=/) {
$_ =~ s/=//;
`htpasswd -b webpasswd $_`;
}
}

修改httpd配置

编辑/etc/httpd/conf/httpd.conf,在末尾添加svn:

1
2
3
4
5
6
7
8
9
10
<Location /repos>
DAV svn
SVNPath /home/svn/repos/
AuthType Basic
AuthName "svn for repos"
AuthUserFile /home/svn/conf/webpasswd
AuthzSVNAccessFile /home/svn/conf/authz
Satisfy all
Require valid-user
</Location>

修改权限

1
chown -R apache.apache /home/svn/repos

重启服务

1
/etc/init.d/httpd restart

测试

浏览器打开http://ip/repos/server测试。

邮件提醒(未验证)

  • 安装Perl模块Module::Build

    1
    2
    3
    4
    5
    6
    7
    8
    # wget http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/Module-Build-0.36_11.tar.gz
    # tar xvf Module-Build-0.36_11.tar.gz
    # cd Module-Build-0.36_11
    # perl Build.PL
    # ./Build
    # ./Build test
    # ./Build install
    # cd ..
  • 安装Perl模块Authen::SASL

    1
    2
    3
    4
    5
    6
    7
    # wget http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/Authen-SASL-2.15.tar.gz
    # tar xvf Authen-SASL-2.15.tar.gz
    # cd Authen-SASL-2.15
    # perl Makefile.PL
    # make test
    # make install
    # cd ..
  • 安装Perl模块Net::SMTP_auth

    1
    2
    3
    4
    5
    6
    7
    # wget http://search.cpan.org/CPAN/authors/id/A/AP/APLEINER/Net-SMTP_auth-0.08.tar.gz
    # tar xvf Net-SMTP_auth-0.08.tar.gz
    # cd Net-SMTP_auth-0.08
    # perl Makefile.PL
    # make test
    # make install
    # cd ..
  • 安装Perl模块SVN::Notify

    1
    2
    3
    4
    5
    6
    7
    8
    # wget http://search.cpan.org/CPAN/authors/id/D/DW/DWHEELER/SVN-Notify-2.80.tar.gz
    # tar xvf SVN-Notify-2.80.tar.gz
    # cd SVN-Notify-2.80
    # perl Build.PL
    # ./Build
    # ./Build test
    # ./Build install
    # cd ..
  • 启动邮件服务器

    1
    2
    3
    4
    # service sendmail restart
    Shutting down sendmail: [FAILED]
    Starting sendmail: [ OK ]
    Starting sm-client: [ OK ]
  • 配置自动发邮件脚本
    修改post-commit脚本,以支持邮件通知功能。

    1
    2
    # cd /home/svn/repos/project1/hooks/
    # vim post-commit

内容如下:

1
2
3
4
5
#!/bin/sh
REPOS="$1"
REV="$2"

/usr/bin/svnnotify –repos-path “$1″ –revision “$2″ –to huangjianrong2010@gmail.com –from project1@svn.com –handler “HTML::ColorDiff” –with-diff –smtp localhost –smtp-user root –smtp-pass passwd -c “UTF-8″ -g zh_CN -o raw –svnlook /usr/bin/svnlook –subject-prefix ‘[SVN Update]‘

to参数代表接收邮件的地址,可以有多个。from参数是虚拟的,代表你的发送地址,一般情况下,这个参数 不重要,但如果接收者的邮件服务器有反垃圾邮件的功能,需要判定源地址的话,这个参数是否合法就显得很重要了

再给该脚本添加可执行权限

1
# chmod +x post-commit

  • 再次提交时,就会给指定邮件地址发信了。ALL DONE!

备份管理

采用简单方式,定时备份仓库目录。

  • 新建备份目录

    1
    mkdir /home/svn/backup
  • 编写备份脚本

    1
    2
    3
    cd /home/svn/scripts
    vim backup.sh
    chmod +x backup.sh

backup.sh内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

cd /home/svn/repos
now=`/bin/date +%Y%m%d`
/bin/tar czvf "project_backup_$now.tar.gz" project1/ && rm -rf /home/svn/backup/* && /bin/mv project_backup_*.tar.gz /home/svn/backup/
if [ $? == 0 ]
then
result=”OK!!”
else
result=”False!!”
fi

#send mail to administrator
/bin/mail mail@gmail.com -s “project_backup_$now” <<MESSAGE
Result: `/bin/echo $result`
MESSAGE

  • 设置每日执行
    1
    crontab -e

输入:

1
2
# 每晚23点备份
0 23 * * * /home/svn/scripts/backup.sh

svnstat分析svn数据(未验证)

  • 安装JAVA

    1
    2
    chmod +x jre-xxx-rpm.bin
    ./jre-xxx-rpm.bin
  • 下载svnstat

    1
    2
    wget http://iweb.dl.sourceforge.net/project/svnstat/svnstat/Release-1.1-beta/SvnStat-1.1-beta.zip
    unzip SvnStat-1.1-beta.zip
  • 更新代码

    1
    svn co svn://ip/project1
  • 生成数据

    1
    2
    3
    4
    5
    pwd
    # /root
    svn log project1 -v -xml -non-interactive > project1.log
    cd SvnStat-1.1-beta
    java -classpath SvnStat-all.jar de.agentlab.svnstat.SvnStat -jar SvnStat-all.jar -r /root/project.log -d /var/www/html/
  • 查看
    打开浏览器即可查看

statsvn分析svn数据(未验证)

  • 下载statsvn

    1
    2
    3
    wget http://downloads.sourceforge.net/project/statsvn/statsvn/0.7.0/statsvn-0.7.0.zip?use_mirror=jaist
    unzip statsvn-0.7.0.zip
    cd statsvn-0.7.0
  • 生成statsvn数据

    1
    2
    mkdir /var/www/html/statsvn
    java -jar statsvn.jar -verbose -output-dir /var/www/html/statsvn/ /root/project.log /root/project
  • 查看
    打开浏览器查看

配置codestriker(未验证)

  • 依赖包

    1
    perl -MCPAN -e 'install "Template"'
  • 下载

    1
    2
    3
    4
    5
    # wget http://downloads.sourceforge.net/project/codestriker/codestriker/1.9.10/codestriker-1.9.10.tar.gz?use_mirror=jaist&ts=1279246587
    # mkdir /var/www/codestriker
    # cd /var/www/codestriker
    # tar xvf /path/codestriker-1.9.10.tar.gz
    # chown -R apache.apache codestriker-1.9.10
  • 配置数据库

    1
    2
    # service mysqld restart
    # mysql -uroot mysql

执行:

1
2
3
4
CREATE DATABASE codestrikerdb CHARACTER SET utf8;
GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,ALTER,CREATE,DROP,REFERENCES ON codestrikerdb.* TO codestriker@localhost IDENTIFIED BY ‘cspasswd’;
FLUSH PRIVILEGES;
quit

  • 配置codestriker
    1
    2
    # cd codestriker-1.9.10/
    # vim codestriker.conf

注意以下几点(详细可查看codestriker的安装文档)
a.数据库的用户名密码要配对
b.svn的数据仓库要配对,如下:

1
2
3
4
@valid_repositories =
(
'svn:file:///home/svn/repos/project1',
)

  • 执行安装脚本

    1
    2
    cd bin/
    ./install.pl
  • 配置http支持

    1
    # vim /etc/httpd/conf/httpd.conf

在最后面加上如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
Alias /codestriker/  /var/www/codestriker/codestriker-1.9.10/cgi-bin/
Alias /codestrikerhtml/ /var/www/codestriker/codestriker-1.9.10/html/

<Directory “/var/www/codestriker/codestriker-1.9.10/cgi-bin/”>
SetHandler perl-script
PerlHandler ModPerl::Registry
Options +ExecCGI
</Directory>

<Directory “/var/www/codestriker/codestriker-1.9.10/html/”>
AllowOverride None
Allow from all
</Directory>

  • 查看
    重启httpd服务:
    1
    service httpd restart

浏览器输入http://ip/codestriker/codestriker.pl

REFS

CentOS Linux搭建SVN Server配置详解
Centos 6.5+ 搭建SVN服务器(实用简写版)-LINUX技术文章,经验分享,HI-DOCS