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版本库project1svnadmin create /home/svn/project2 #创建svn版本库project2svnadmin 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 = sallyssecretosyunwei=123456osyunwei1=123456osyunwei2=123456osyunwei3=123456
vi /home/svn/conf/authz #编辑,添加以下代码
[groups]admin = osyunweiproject1 = osyunwei1project2 = osyunwei2project3 = 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,noneauth-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: svnsvn_bin=/usr/binsvn_port=3690svn_home=/home/svnsvn_config=/home/svn/conf/svnserve.confif [ ! -f "$svn_bin/svnserve" ]thenecho "svnserver startup: cannot start"exitficase "$1" instart)echo "Starting svnserve..."$svn_bin/svnserve -d -r $svn_home --config-file $svn_config --listen-port $svn_portecho "Successfully!";;stop)echo "Stoping svnserve..."killall svnserveecho "Successfully!";;restart)$0 stop$0 start;;*)echo "Usage: svn { start | stop | restart } "exit 1esac
chmod +x /etc/init.d/svn #添加执行权限chkconfig svn on #开机自启动service svn start #启动
六、配置svn支持http访问
1、创建账号密码认证文件
htpasswd -cm /home/svn/conf/http_passwd osyunweihtpasswd -m /home/svn/conf/http_passwd osyunwei1htpasswd -m /home/svn/conf/http_passwd osyunwei2htpasswd -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 #编辑,在最后添加以下代码
DAV svn#SVNPath /home/svnSVNParentPath /home/svn# # Limit write permission to list of valid users.# # # Require SSL connection for password protection.# # SSLRequireSSL#AuthType BasicAuthName "Authorization SVN"AuthzSVNAccessFile /home/svn/conf/authzAuthUserFile /home/svn/conf/http_passwdRequire valid-user#
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-8import sysimport osimport smtplibfrom email.mime.text import MIMETextfrom email.header import Headermail_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= """基本信息
版本库: %s版本号:%s提交者:%s提交时间:%s提交说明
%s 文件清单
%s
Powered by "xx科技" SCM """ 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 contentif __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/shREPOS="$1"REV="$2"export LANG=zh_CN.UTF-8HOOK_DIR="/home/svn/repo/hooks"PYTHON_BIN=/usr/bin/python$PYTHON_BIN $HOOK_DIR/sendemail.py $REPOS $REV