一.環境準備web
1.linux版本爲centos6.4 X64apache
2.軟件安裝centos
yum install subversion httpd mod_dav_svn mod_perl sendmail mailx wget gcc-c++ make unzip perl*bash
3.如下全部操做均在root用戶下完成服務器
二.SVN服務器配置tcp
1.新建一個目錄用於存儲SVN全部文件
mkdir /home/svnsvn
2.新建一個版本倉庫
svnadmin create /home/svn/project工具
3.配置用戶
vi /home/svn/project/conf/passwd
[users]
admin = netqin #用戶名 = 密碼
user = 123456
4.配置用戶訪問策略
vi /home/svn/project/conf/authz
[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
project_a = admin #組名 = 用戶名,多個用戶使用逗號分隔
project_u = user
[project:/]
@project_a = rw #組名 = 讀寫權限r,w,rw;這裏配置admin有根路徑的讀寫權限
* = #其它組沒有訪問權限
[project:/server]
@project_a = rw
@project_u = rw
* =
5.用戶和策略配置升效
vi /home/svn/project/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = /home/svn/project/conf/passwd
authz-db = /home/svn/project/conf/authz
6.啓動服務器
svnserve -d -r /home/svn
7.開啓防火牆
vi /etc/sysconfig/iptables
#svnserver
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3690 -j ACCEPT
service iptables restart
8.測試服務器
使用svn客戶端工具,或者找一臺安裝了subversion的linux服務器進行測試
svn co svn://192.168.xx.xx/project
若是可以正常checkout,則說明svn的配置是正確的。
三.配置郵件提醒支持
1,安裝Perl模塊Module::Build
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
2,安裝Perl模塊Authen::SASL
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
3,安裝Perl模塊Net::SMTP_auth
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
4,安裝Perl模塊SVN::Notify
wget http://search.cpan.org/CPAN/authors/id/D/DW/DWHEELER/SVN-Notify-2.80.tar.gz
ar xvf SVN-Notify-2.80.tar.gz
cd SVN-Notify-2.80
perl Build.PL
./Build
./Build test
./Build install
5,啓動郵件服務器
service sendmail restart
6,配置自動發郵件腳本
cd /home/svn/project/hooks/
mv post-commit.tmpl post-commit
vi post-commit
#!/bin/sh
REPOS="$1"
REV="$2"
/usr/local/bin/svnnotify --repos-path "$1" --revision "$2" --to hanqunfeng@nq.com,sunchengqi@nq.com,gaowenming@nq.com --from channelSVN@nq.com --handler "HTML::ColorDiff" --with-diff --smtp localhost --smtp-user root --smtp-pass password -c "UTF-8" -g zh_CN -o raw --svnlook /usr/bin/svnlook --subject-prefix '[SVN Update]'
說明:--to:接收人列表,多個以逗號分隔;--from:發件人,隨便起個名字;--smtp-user root --smtp-pass password 服務器的用戶和密碼;
chmod +x post-commit
ok,此時提交svn時就會收到郵件了。
四.提交svn時要求填寫註釋
cd /home/svn/project/hooks/
mv pre-commit.tmpl pre-commit
vi pre-commit
#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ "$LOGMSG" -lt 5 ]; #要求註釋長度大於5
then
echo -e "\nEmpty log message not allowed. Commit aborted!" 1>&2
exit 1
fi
chmod +x pre-commit
mv pre-revprop-change.tmpl pre-revprop-change
vi pre-revprop-change
REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
if ["$PROPNAME" = "svn:log"];then exit 0;fi
exit 1
chmod +x pre-revprop-change
ok,測試提交svn時就會要求輸入註釋了。
五.支持http訪問
通過以上配置,svn服務基本上就算配置完成了,不過此時只能經過svn://192.168.xx.xx/project的方式訪問,若是但願經過http的方式訪問,則還需進行以下配置。
上面安裝工具時已經安裝了Apache和Perl。
1,轉換SVN服務器的密碼
因爲SVN服務器的密碼是明文的,HTTP服務器不與支持,因此須要轉換成HTTP支持的格式。能夠寫了一個Perl腳本完成這個工做.
cd /home/svn/project/conf/
vi PtoWP.pl
use warnings;
use strict;
#open the svn passwd file
open (FILE, "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 $_`; #核心語句就這個,若是之後添加或者修改用戶密碼,可使用 htpasswd -nb username password ,加密後的信息會被顯示在屏幕上,複製內容到webpasswd文件便可。
}
}
perl PtoWP.pl #執行腳步後會在當前路徑下生成webpasswd文件,裏面就是已經加過密的密碼信息。
2,修改httpd.conf,添加關於SVN服務器的內容
編輯/etc/httpd/conf/httpd.conf,在最後添加以下信息:
<Location /project>
DAV svn
SVNPath /home/svn/project/
AuthType Basic
AuthName "svn for project"
AuthUserFile /home/svn/project/conf/webpasswd #這裏必定要使用webpasswd
AuthzSVNAccessFile /home/svn/project/conf/authz
Satisfy all
Require valid-user
</Location>
須要加載三個模塊,若是是手工編譯Apache時應該加上--enable-dav
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
3,啓動HTTPD服務器
service httpd restart
4,授予txn-current-lock文件777權限
緣由是svn目錄是使用root用戶建立,而Apache可能不是root用戶啓動的,因此在提交svn時Apache用戶沒有/home/svn/project/db/txn-current-lock文件的訪問權限
chmod 777 /home/svn/project/db/txn-current-lock
5,測試
使用svn客戶端工具,或者找一臺安裝了subversion的linux服務器進行測試
svn co http://192.168.xx.xx/project
六.備份svn
寫個腳步,按期備份/home/svn下的內容便可。
舉例:
mkdir -p /opt/project_backup #備份保存路徑
vi /home/svn/project_backup.sh #備份腳步
#!/bin/bash
cd /home/svn
now=`/bin/date +%Y%m%d`
/bin/tar czvf "project_backup_$now.tar.gz" project/ && rm -rf /opt/project_backup/* && /bin/mv project_backup_*.tar.gz /opt/project_backup/
if [ $? == 0 ]
then
result="OK!!"
else
result="False!!"
fi
#send mail to administrator
/bin/mail -s "project_backup_$now" hanqunfeng@nq.com<<MESSAGE
Result: `/bin/echo $result`
MESSAGE
chmod +x project_backup.sh
將腳步加入定時任務
crontab -e
0 23 * * * /home/svn/project_backup.sh #天天晚上11點備份
七.將svn啓動腳步加入service
vi /home/svn/svnserver
# vi svnserver
# chmod +x svnserver
#!/bin/bash
case "$1" in
start)
svnserve -d -r /home/svn
svnport=`netstat -natp | grep svnserve | awk -F: '{print $2}' | awk '{print $1}'`
if [ -n $svnport ] && [ $svnport -eq 3690 ]; then
echo "SVN Server Already Runnning. Port:3690"
else
echo "SVN Server Does Not Start"
fi
;;
reload)
svnport=`netstat -natp | grep svnserve | awk -F: '{print $2}' | awk '{print $1}'`
if [ -n $svnport ] && [ $svnport -eq 3690 ]; then
killall svnserve && svnserve -d -r /home/svn
echo "Reload OK"
else
echo "SVN Server Is Not Running"
fi
;;
stop)
killall svnserve
echo "SVN Server Has Been Stopped"
;;
status)
svnport=`netstat -natp | grep svnserve | awk -F: '{print $2}' | awk '{print $1}'`
pid=`ps aux | grep svnserve | grep -v "grep" | awk '{print $2}'`
if [ -n $svnport ] && [ $svnport -eq 3690 ]; then
echo "SVN Server (pid:$pid) 正在運行..."
else
echo "SVN Server 中止運行..."
fi
;;
*)
echo "$0: Usage: $0 {start|status|stop|reload}"
exit 1
;;
esac
mv /home/svn/svnserver /etc/init.d
chmod +x svnserver
啓動svn:service svnserver start
關閉svn:service svnserver stop
重啓svn:service svnserver reload