CentOS 6 搭建SVN支持httpd和svnserve独立服务器两种模式 以及邮件配置

Linux下SVN服务器同时支持Apache的http和svnserve独立服务器两种模式且使用相同的访问权限账号

服务器操作系统:CentOS 6.x

1、在服务器上安装配置SVN服务;

2、配置SVN服务同时支持Apache的http和svnserve独立服务器两种模式访问;

3、Apache的http和svnserve独立服务器两种模式使用相同的访问权限账号。

具体操作:

一、关闭SELINUX

vim /etc/selinux/config

 

#SELINUX=enforcing #注释掉

#SELINUXTYPE=targeted #注释掉

SELINUX=disabled #增加

setenforce 0   #使配置立即生效

 

二、开启防火墙

基于Apache的http模式,默认端口为80

基于svnserve的独立服务器模式,默认端口为3690

vim /etc/sysconfig/iptables #编辑防火墙配置文件

# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

:wq! #保存退出

service iptables restart 

三、安装Apache

yum install httpd 

#安装基于Apache的http模式访问的支持模块:

yum -y install mod_dav_svn mod_auth_mysql 
chkconfig httpd on                service httpd start    

cd /etc/httpd/modules/

#查看是否有mod_dav_svn.so和mod_authz_svn.so模块,如果有,说明mod_dav_svn安装成功!

#mod_auth_mysql模块是用数据库存储账号信息,本次教程没有涉及,可以不安装!

注意:如果Apache启动之后提示错误:

httpd:httpd: Could not reliably determine the server's fully qualif domain name, using ::1 for ServerName

解决办法:

vi /etc/httpd/conf/httpd.conf #编辑

ServerName www.example.com:80 #去掉前面的注释

:wq! #保存退出

四、安装SVN

yum install subversion
svnserve --version #查看svn版本信息

五、配置SVN

1、创建svn版本库

复制代码
mkdir -p /home/svn #创建svn版本库存放目录

cd /home/svn #进入目录

svnadmin create /home/svn/project1 #创建svn版本库project1

svnadmin create /home/svn/project2 #创建svn版本库project2

svnadmin create /home/svn/project3 #创建svn版本库project3
复制代码

 

2、设置配置文件

mkdir -p /home/svn/conf #创建配置文件目录

cp /home/svn/project1/conf/passwd /home/svn/conf/passwd #拷贝账号密码配置文件模板

cp /home/svn/project1/conf/authz /home/svn/conf/authz #拷贝目录权限配置文件模板

cp /home/svn/project1/conf/svnserve.conf /home/svn/conf/svnserve.conf #拷贝全局配置文件模板

vi /home/svn/conf/passwd #编辑,添加以下代码

复制代码
[users]

# harry = harryssecret

# sally = sallyssecret

osyunwei=123456

osyunwei1=123456

osyunwei2=123456

osyunwei3=123456
复制代码

vi /home/svn/conf/authz #编辑,添加以下代码

复制代码
[groups]

admin = osyunwei

project1 = osyunwei1

project2 = osyunwei2

project3 = osyunwei3

[/]

@admin = rw

* =

[project1:/]

@admin = rw

@project1 = rw

* =

[project2:/]

@admin = rw

@project2 = rw

* =

[project3:/]

@admin = rw

@project3 = rw

* =
复制代码

 

vi /home/svn/conf/svnserve.conf #配置全局文件,在最后添加以下代码

复制代码
[general]

anon-access=none #禁止匿名访问,设置为none。默认为read,参数:read,write,none

auth-access=write #授权用户写权限

password-db=/home/svn/conf/passwd #用户账号密码文件路径,可以写绝对路径

authz-db=/home/svn/conf/authz #访问控制权限文件路径,可以写绝对路径

realm=svn #每个SVN项目的认证命,会在认证提示里显示,建议写项目名称。
复制代码

3、启动SVN

svnserve -d -r /home/svn --config-file /home/svn/conf/svnserve.conf --listen-port 3690

#--config-file后面跟全局配置参数文件

ps -ef|grep svn|grep -v grep #查看进程

netstat -ln |grep 3690 #检查端口

killall svnserve #关闭svn

4、添加svn服务开机启动脚本:

  vi /etc/init.d/svn     #编辑,添加以下代码

复制代码
#!/bin/sh

# chkconfig: 2345 85 85

# processname: svn

svn_bin=/usr/bin

svn_port=3690

svn_home=/home/svn

svn_config=/home/svn/conf/svnserve.conf

if [ ! -f "$svn_bin/svnserve" ]

then

echo "svnserver startup: cannot start"

exit

fi

case "$1" in

start)

echo "Starting svnserve..."

$svn_bin/svnserve -d -r $svn_home --config-file $svn_config --listen-port $svn_port

echo "Successfully!"

;;

stop)

echo "Stoping svnserve..."

killall svnserve

echo "Successfully!"

;;

restart)

$0 stop

$0 start

;;

*)

echo "Usage: svn { start | stop | restart } "

exit 1

esac
复制代码
chmod +x /etc/init.d/svn #添加执行权限

chkconfig svn on #开机自启动

service svn start #启动

六、配置svn支持http访问

1、创建账号密码认证文件

htpasswd -cm /home/svn/conf/http_passwd osyunwei

htpasswd -m /home/svn/conf/http_passwd osyunwei1

htpasswd -m /home/svn/conf/http_passwd osyunwei2

htpasswd -m /home/svn/conf/http_passwd osyunwei3

根据提示输入2次密码即可。

注意:

/home/svn/conf/目录下面passwd文件是svnserve独立服务器使用的认证文件,密码没有加密,明文显示。

/home/svn/conf/目录下面http_passwd文件是Apache的http模式使用的认证文件,密码使用MD5加密。

passwd和http_passwd文件中,账号密码必须设置相同。

2、设置Apache配置文件

vi /etc/httpd/conf.d/subversion.conf #编辑,在最后添加以下代码

复制代码
<Location /svn>

DAV svn

#SVNPath /home/svn

SVNParentPath /home/svn

# # Limit write permission to list of valid users.

# <LimitExcept GET PROPFIND OPTIONS REPORT>

# # Require SSL connection for password protection.

# # SSLRequireSSL

#

AuthType Basic

AuthName "Authorization SVN"

AuthzSVNAccessFile /home/svn/conf/authz

AuthUserFile /home/svn/conf/http_passwd

Require valid-user

# </LimitExcept>

</Location>
复制代码

3、设置目录权限

chown apache:apache /home/svn -R #设置svn目录所有者为Apache服务运行账号apache

4、重启Apache服务

service httpd restart 

七、测试svn

Windows下安装svn客户端TortoiseSVN。

TortoiseSVN下载地址:http://tortoisesvn.net/downloads.html

安装完成之后,桌面-右键单击,选择TortoiseSVN-版本库浏览器

URL输入:svn://192.168.21.134/project1

用户名:osyunwei1

密码:123456

勾选:保存认证

确定

可以进入project1版本库目录,右键单击之后,可以选择创建文件夹等操作。

URL输入:http://192.168.21.134/svn/project1

用户名和密码跟上面一样,可以进入project1版本库目录,右键单击之后,可以选择创建文件夹等操作。

project1访问:

svn://192.168.21.134/project1

http://192.168.21.134/svn/project1

用户名:osyunwei1

密码:123456

project2访问:

svn://192.168.21.134/project2

http://192.168.21.134/svn/project2

用户名:osyunwei2

密码:123456

project3访问:

svn://192.168.21.134/project3 #svnserve独立服务器模式

http://192.168.21.134/svn/project3 #Apache的http模式

用户名:osyunwei3

密码:123456

扩展阅读:

1、Apache htpasswd命令选项参数说明

-c 创建一个加密文件

-n 不更新加密文件,只将apache htpasswd命令加密后的用户名密码显示在屏幕上

-m apache htpasswd命令采用md5算法对密码进行加密

-d apache htpasswd命令采用CRYPT算法对密码进行加密

-p apache htpasswd命令不对密码进行进行加密,即明文密码

-s apache htpasswd命令采用SHA算法对密码进行加密

-b 在apache htpasswd命令行中一并输入用户名和密码而不是根据提示输入密码

-D 删除指定的用户

2、SVNPath 与 SVNParentPath区别:

SVNParentPath:支持多个相同父目录的SVN版本库。

SVNPath:只支持一个主目录的SVN版本库,如果在主目录下面建新项目,则提示无权访问。

 如果需要备份svn仓库可以使用 svnadmin dump D:\Repositories\pc-api >  C:\Users\Administrator\Desktop\svnbak\pc-api.dump

 恢复使用:svnadmin load /home/svn/pc-api < /home/svn/pcapi.dump

 八、 邮件配置

将sendmail.py和post-commit文件放到对应仓库hooks文件目录下:

 sendmail.py    需要更改邮箱的一些配置 (邮箱smtp地址、账号密码、仓库名、收件人列表)

复制代码
#coding:utf-8

import sys

import os

import smtplib

from email.mime.text import MIMEText

from email.header import Header



mail_host= 'smtp.163.com' #发送邮件的smtp地址
mail_user= 'your_username' # 发送通知邮件的用户名
mail_pass= 'your_passwd' # 用户的密码
me= '版本库:你的仓库名' + '<' + 'svn' + '@' + 'test.com' + '>' #发送邮件人的地址标识
to_list= ['test1@test.com','test2.test.com'] # 收件人

html_template= """
<html> 
        <h2 style="color:#FFFFFF; background: #008040;">基本信息</h2> 
        <div> <b>版本库:</b> 
                <a href="svn:%s">%s</a> 
        </div> 
        <div>
                <b>版本号:</b>%s 
        </div> 
        <div> 
                <b>提交者:</b>%s 
        </div> 
        <div> 
                <b>提交时间:</b>%s 
        </div> 
        <h2 style="color:#FFFFFF; background: #4682B4;">提交说明</h2> <font size="4" color="#BF6000"><xmp>%s</xmp></font> 
        <h2 style="color:#FFFFFF; background: #5353A8;">文件清单</h2> 
        <xmp>%s</xmp> 
        <hr> 
        <center> 
                Powered by "xx科技" 
                <a href="http://xxx.com">SCM</a> 
        </center> 
</html> 

"""

 

def get_repo_name(repo):  
        return os.path.basename(repo)  
  
def get_author(repo, rev):  
        """svnlook author -r REV REPOS 获得提交者 
        """  
        cmd = '%s author -r %s %s' % (svnlook_bin_path, rev, repo)  
        output = os.popen(cmd).read()  
        return output  
  
def get_date(repo, rev):  
        """svnlook date -r REV REPOS 获得提交时间 
        """  
        cmd = '%s date -r %s %s' % (svnlook_bin_path, rev, repo)  
        output = os.popen(cmd).read()  
        return output
  
def get_log(repo, rev):  
        """svnlook log -r REV REPOS 获得提交日志 
        """  
        cmd = '%s log -r %s %s' % (svnlook_bin_path, rev, repo)  
        output = os.popen(cmd).read()  
        return output  
  
def get_file_list(repo, rev):  
        """svnlook changed -r REV REPOS 获得发生变更的文件 
        """  
        cmd = '%s changed -r %s %s' % (svnlook_bin_path, rev, repo)  
        output = os.popen(cmd).read()  
        return output  
  
def send_mail(msg, sender, to_list):  
        try:  
                s = smtplib.SMTP()  
                s.connect(mail_host)  
                s.login(mail_user,mail_pass)  
                s.sendmail(sender, to_list, msg.as_string())  
                s.close()  
                return True  
        except Exception, e:  
                print str(e)  
                return False  
  
def write_mail(sender, to_list, sub, content):  
        msg = MIMEText(content, _subtype = 'html', _charset='utf-8')  
        msg['Subject'] = sub  
        msg['From'] = sender  
        msg['To'] = ';'.join(to_list)  
        msg["Accept-Language"]="zh-CN"  
        msg["Accept-Charset"]="ISO-8859-1,utf-8"  
        return msg  
  
global svnlook_bin_path  
  
def write_mail_content(repo, rev):  
        """ 
        repo: repository 
        rev: revision 
        """  
        repo_name = get_repo_name(repo)  
        author = get_author(repo, rev)  
        date = get_date(repo, rev)  
        log = get_log(repo, rev)  
        file_list = get_file_list(repo, rev)  
        content = html_template % (repo, repo_name, rev, author, date, log.decode("GBK").encode('UTF-8'), file_list.decode("GBK").encode('UTF-8'))  
        return content

if __name__ == '__main__':  
        svnlook_bin_path = '"/usr/bin/svnlook"'  
  
        subject = 'SVN Commit Notification'  
        content = write_mail_content(sys.argv[1], sys.argv[2])  
        msg = write_mail(me, to_list, subject, content)  
        send_mail(msg, me, to_list)  
复制代码

post-commit      需要将脚本中HOOK_DIR改成你的svn仓库地址

#!/bin/sh

REPOS="$1"
REV="$2"
export LANG=zh_CN.UTF-8
HOOK_DIR="/home/svn/repo/hooks"
PYTHON_BIN=/usr/bin/python
$PYTHON_BIN $HOOK_DIR/sendemail.py $REPOS $REV

 

posted @   谭普利特  阅读(335)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示