Centos6下SVN服務器(結合Apache)的搭建

1、什麼是 Subversion?html

(本文永久地址:http://woymk.blog.51cto.com/10000269/1951937python

Subversion 是一個免費/開源的版本控制系統(version control system, VCS), 也就是說, Subversion 能夠跨越時間地對文件和目錄, 以及它們的修改進行管理. 這就容許你恢復數據的舊版本, 或檢查數據的修改歷史. 因爲這個特色, 不少人把版本控制系統當作是一種「時間機器」。c++

 

Subversion 能夠跨越網絡進行操做, 這就容許多個用戶在不一樣的機器上工做. 從某種程度上講, 容許用戶在各自的空間裏修改和管理同一組數據能夠促進團隊協做, 由於修改再也不是單線進行, 開發速度會更快. 因爲全部的工做都被記錄在, 也就不用擔憂並行開發會下降軟件的質量—若是出現不正確的修改, 只要撤消那一次更改操做便可。web

 

某些版本控制系統同時也是軟件配置管理 (software configuration management, SCM) 系統. 這種系統通過精巧的設計, 專門用於管理源代碼樹, 具有許多與軟件開發有關的特性—理解編程語言, 提供了程序構建工具. Subversion 不是 SCM, 它是一個通用系統, 能夠管理任意類型的文件集合. 對你來講, 這些文件多是源代碼文件—對別人來講, 多是一個貨物清單或數字電影。sql

 

2、Subversion 的架構數據庫

wKioL1l8LDrhuW5tAAFZGxQmg-k305.png-wh_50

 

圖中的一端是存放全部版本數據的 Subversion 倉庫, 另外一端是 Subversion 客戶端程序, 客戶端程序管理着部分版本數據在本地的映射. 兩端之間是穿過倉庫訪問 (Repository Access) 層的多條訪問路徑, 其中一些路徑跨越計算機網絡, 經過網絡服務器對倉庫進行訪問, 其餘一些路徑則不通過網絡, 直接訪問倉庫.apache

 

3、Subversion 的組件編程

svnwindows

客戶端命令行工具後端

 

svnversion

用於報告工做副本狀態 (就項目的版本號而言) 的工具

 

svnlook

能夠直接檢查倉庫的工具

 

svnadmin

用於建立, 調整或修復 Subversion 倉庫的工具

 

mod_dav_svn

Apache HTTP 服務器插件, 該插件容許用戶經過網絡訪問倉庫

 

svnserve

一個定製的, 可獨立運行的服務器程序, 能夠以守護進程方式運行, 也能夠被 SSH 調用, 這是另外一種容許用戶經過網絡訪問倉庫的方法

 

svndumpfilter

過濾 Subversion 倉庫轉儲數據流的程序

 

svnsync

能夠跨越網絡對倉庫進行增量鏡像備份的程序

 

svnrdump

能夠跨越網絡對倉庫歷史進行轉儲和加載的程序

 

svnmucc

該工具支持在沒有工做副本的狀況下, 在一個單獨的提交中對多個倉庫執行基於 URL 的操做

 

4、安裝Subversion前的準備

 

安裝一些經常使用的依賴包

yum install -y make gcc gcc-c++ perl zlib-devel libaio libpng libpng-devel libjpeg-devel pcre-devel

yum install -y  libXpm-devel openssl openssl-devel libxml2-devel bzip2-devel.x86_64 libjpeg-turbo-devel

yum install -y  freetype freetype-devel libtool cmake ncurses-devel bison re2c curl-devel wget

rpm -ivh "http://mirrors.sohu.com/fedora-epel/epel-release-latest-6.noarch.rpm"

yum install -y libmcrypt-devel re2c unzip

 

安裝Subversion須要的依賴包

(詳情可參考官方文檔:http://svn.apache.org/repos/asf/subversion/trunk/INSTALL)

 

1. Apache Portable Runtime 1.3 or newer

cd /usr/localhost/src

wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.5.2.tar.gz

wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.5.4.tar.gz

tar zxvf apr-1.5.2.tar.gz

cd apr-1.5.2

./configure --prefix=/usr/local/apr

make && make install

cd ..

tar zxvf apr-util-1.5.4.tar.gz

cd apr-util-1.5.4

./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr

make && make install

 

2. Zlib

http://www.zlib.net/

下載的當前版本爲zlib-1.2.11.tar

解壓後執行 

./configure

make && make install

 

3. autoconf 2.59 or newer

yum install autoconf –y

 

4. libtool 1.4 or newer

yum install libtool -y

 

5. Apache Serf library 1.3.4 or newer

cd /usr/local/src

wget http://archive.apache.org/dist/serf/serf-1.2.1.tar.bz2

tar jxvf serf-1.2.1.tar.bz2

cd serf-1.2.1

yum install expat   expat-devel –y

./configure --prefix=/usr/local/serf --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr

make && make install

 

6. OpenSSL (OPTIONAL)

yum install openssl –y

 

7. Berkeley DB 4.X  (可選安裝)

 yuminstall db4 -y

 

8. Cyrus SASL library (OPTIONAL)

yum -y install cyrus-sasl*

 

9.  dbus

   yum install dbus

 

10.  Qt 4  (可選安裝)

   yum install qt  qt-devel

 

11. GLib 2  (Unix only, OPTIONAL)

   yum install  glib2  glib2-devel

 

12. KDELibs 4  (可選安裝)

   yum install kdelibs  kdelibs-devel

 

13. Python 2.7 or newer (https://www.python.org/)

  (可選擇安裝)

 

14. SQLite (REQUIRED)

https://www.sqlite.org/download.html

cd /usr/local/src

wget http://www.sqlite.org/2017/sqlite-amalgamation-3180000.zip

unzip sqlite-amalgamation-3180000.zip

先解壓好,後面安裝Subversion時要用到


5、安裝Apache Web Server(2.2.X or newer)

下載源碼包

cd /usr/local/src

wget http://mirrors.sohu.com/apache/httpd-2.2.34.tar.gz

tar zxvf httpd-2.2.34.tar.gz


編譯&&安裝

cd httpd-2.2.34

./configure --prefix=/webapp/apache2  --enable-dav --enable-dav-fs--enable-dav-lock  --enable-so --enable-rewrite  --enable-modules=all  --enable-mods-shared=all  --with-mpm=prefork  --enable-maintainer-mode  --enable-ssl --with-ssl  --with-pcre  --with-include-apr

make && make install

 

配置apache

cd /webapp/apache2/

vi conf/httpd.conf

 

找到

#ServerName www.example.com:80

改爲

ServerName localhost:80

 

檢查配置文件語法

bin/apachectl -t

 

配置啓動腳本

cp /usr/local/src/httpd-2.2.34/build/rpm/httpd.init/etc/init.d/httpd

 

注意文件中有三處主要的地方須要修改下的:

httpd=${HTTPD-/webapp/apache2/bin/httpd}

pidfile=${PIDFILE-/webapp/apache2/logs/${prog}.pid}

CONFFILE=/webapp/apache2/conf/httpd.conf

請根據本身的安裝目錄更改相應的路徑!

 

而後運行以下命令:

chmod +x /etc/init.d/httpd

chkconfig --add httpd

chkconfig httpd on

/etc/init.d/httpd start

netstat -lnp |grep httpd


6、安裝Subversion

官網下載地址:http://subversion.apache.org/download.cgi

這裏咱們下載1.8版

cd /usr/local/src

wget http://mirrors.tuna.tsinghua.edu.cn/apache/subversion/subversion-1.8.18.tar.gz

tar zxvf subversion-1.8.18.tar.gz

 

把解壓好的SQLite複製到subversion目錄下

mv sqlite-amalgamation-3180000subversion-1.8.18/sqlite-amalgamation

 

cd subversion-1.8.18

./configure --prefix=/webapp/subversion --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --enable-mod-activation --with-apache-libexecdir=/webapp/apache2/modules   --with-apxs=/webapp/apache2/bin/apxs --with-serf=/usr/local/serf  --with-zlib

make && make install

 

建立版本庫:

要建立一個版本庫,首先要肯定採用哪一種數據存儲方式。在 Subversion 中,版本庫的數據存儲有兩種方式,一種是在 Berkeley DB 數據庫中存放數據;另外一種是使用普通文件,採用自定義的格式來儲存,稱爲 FSFS

 

兩種版本庫數據存儲對照表

特性 Berkeley DB FSFS
對操做中斷的敏感 很敏感;系統崩潰或者權限問題會致使數據庫「塞住」,須要按期進行恢復。 不敏感。
可只讀加載 不能 能夠
存儲平臺無關 不能 能夠
可從網絡文件系統訪問 不能 能夠
版本庫大小 稍大 稍小
可擴展性:修訂版本樹的數量 數據庫,沒有限制 許多古老的本地文件系統在處理單一目錄包含上千個條目時出現問題。
可擴展性:文件較多的目錄 較慢 較快
速度:檢出最新的代碼 較快 較慢
速度: 大的提交 較慢,可是時間被分配在整個提交操做中 較快,可是最後較長的延時可能會致使客戶端操做超時
組訪問權處理 對於用戶的umask設置十分敏感,最好只由一個用戶訪問。 對umask設置不敏感
功能成熟時間 2001年開始使用 2004年開始使用


肯定了具體的數據存儲類型,只要在命令行當中執行 svnadmin 命令就能夠建立一個 Subversion 版本庫,命令以下:


建立文件夾

mkdir /webapp/svndata

PATH=$PATH:/webapp/subversion/bin


執行svnadmin命令建立版本庫,指定數據存儲爲FSFS

svnadmin create --fs-type fsfs /webapp/svndata/data


若是要指定爲Berkeley DB,則將fsfs替換爲bdb

對於Subversion 1.2之後版本,svnadmin缺省使用fsfs文件系統後端建立版本庫。 


ll /webapp/svndata/data/

總用量 24

drwxr-xr-x. 2 root root 4096 7月  28 07:29 conf

drwxr-sr-x. 6 root root 4096 7月  28 07:29 db

-r--r--r--. 1 root root    2 7月  28 07:29 format

drwxr-xr-x. 2 root root 4096 7月  28 07:29 hooks

drwxr-xr-x. 2 root root 4096 7月  28 07:29 locks

-rw-r--r--. 1 root root  246 7月  28 07:29 README.txt

 

conf 目錄下存放了版本庫的配置文件,包括用戶訪問控制和權限控制等內容;

db 目錄下存放着 Subversion 所要管理的全部受版本控制的數據;

hooks 目錄存放着鉤子腳本及其模版(一種版本庫事件觸發程序);

locks 目錄存放着 Subversion 版本庫鎖定數據;

format 文件記錄了版本庫的佈局版本號。

 

svn import 命令來進行項目的導入:

svn import /tmp/ file:///webapp/svndata/data/  --message "init"

 

確認導入的項目是否正確:

svn list --verbose file:///webapp/svndata/data/

 

查看最新修訂版本的信息:

svnlook info /webapp/svndata/data

 

"--revision 版本號",指定某一個修訂版的顯示:

svnlook info /webapp/svndata/data --revision1

 

顯示版本庫的具體樹形結構,後面的--show-ids選項指定顯示每個顯示元素的修改版本 ID

svnlook tree /webapp/svndata/data/ --show-ids


基本的服務器配置

svnserve 是一個輕量級的服務器, 使用自定義的協議經過TCP/IP與客戶端通信。客戶端經過由 svn:// 或者 svn+ssh:// 開始的URL訪問svnserve服務器。


啓動SVN服務器:

svnserve –d -r /webapp/svndata

 

-i做爲 inetd 啓動

-d作爲守護進程啓

-r用來指定版本庫的根路徑

 

在客戶端使用 TortoiseSVN 能夠經過以下形式訪問服務器:

svn://服務器IP/data

 

版本庫的 conf 子文件夾下的配置文件說明:

1svnserve.conf

[general]

# anon-access = read  #匿名用戶的權限

# auth-access = write  #認證用戶的權限

password-db = passwd  #指定密碼文件

# authz-db = authz  #權限控制文件

# realm = My First Repository

 

2passwd文件的配置及說明

 

[users]

# harry = harryssecret

# sally = sallyssecret

 

等號前面是用戶名,後面是密碼,密碼是明文的。更改svnserve.conf的時候,須要重啓SVN,更改authzpasswd文件,不需重啓。

 

3authz文件的配置及說明

 

[groups]

# harry_and_sally = harry,sally

 

groups定義的變量就是組名,1個用戶組能夠包含1個或者多個用戶,逗號分隔,上例中harry_and_sally就是一個組

 

版本庫目錄格式:

[<版本庫>:/項目/目錄]

@<用戶組名> = <權限>

<用戶名> = <權限>

 

其中,方框號內部能夠有多種寫法:

 

[/],表示根目錄及如下,根目錄是svnserve啓動時指定的,這裏配置的是/webapp/svndata/[/]就是表示對所有版本庫設置權限。

[data:/],表示對版本庫data設置權限

[date:/test],表示對版本庫data中的test項目設置權限

[data:/test/aaa],表示對版本庫datatest項目的aaa目錄設置權限

權限主體能夠是用戶組、用戶或*,用戶組在前面加@*表示所有用戶。

權限能夠是wrrw、和空,空表示沒有任何權限。

authz中每一個參數都要頂格寫,開頭不能有空格。

 

[/]

Kevin = rw

@harry_and_sally = r

 

注意:權限配置文件中出現的用戶名必須已在用戶配置文件中定義

 

設置passwd,authz文件權限

chmod 600 conf/{passwd,authz}      #非必須,最好改下

 

4. Checkout注意事項

windows上安裝客戶端TortoiseSVN以後,checkout版本的時候有個地方須要注意。

 

例如若是建立項目版本庫的命令爲 # svnadmin create /svn/testversion1/

啓動svn服務的命令 # svnserve -d -r /svn/

 

那麼在客戶端檢出該版本庫的URL爲:svn://xx.xx.xx.xx/testversion1/

 

若是啓動svn服務的命令爲 svnserve -d -r /svn/testversion1/,那麼檢出的URL則爲:svn://xx.xx.xx.xx/

 

7、與 Apache Http Server 的結合

經過 Http 協議訪問版本庫是 Subversion 的亮點之一。使用 Http 協議意味着只須要打開瀏覽器,輸入 URL 便可輕鬆的瀏覽整個版本庫。靈活一般帶來複雜性,Http 方式相對於 svnserve 方式來講須要更多的配置。

 

配置apache

爲了使 Subversion dav 模塊通訊,須要安裝 mod_dav_svn 插件,在Apache httpd.conf 文件中加入如下內容:

 

LoadModule dav_module modules/mod_dav.so

LoadModule dav_svn_module modules/mod_dav_svn.so

<Location /data>

    DAV svn

    SVNPath /webapp/svndata/data

</Location>

 

重啓apache

/etc/init.d/httpd restart

 

瀏覽器輸入「http://服務器IP/data」

顯示:

data- Revision 1: /

這表示mod_dav_svn模塊工做正常,若是沒法顯示,請檢查防火牆和SELinx的配置

能夠先臨時關閉防火牆和SELinx(生產環境請按實際狀況配置)

iptables –F

setenforce 0

 

可使用 SVNParentPath 代替SVNPath

SVNParentPath /webapp/svndate表示/webapp/svndata下的每一個子目錄都是一個版本庫,能夠經過:

 

http://服務器IP/svndata/data1

http://服務器IP/svndata/data2

|

|

|

http://服務器IP/svndata/data10

 

來訪問。

 

權限設置:

1.  Apache基本權限設置

最簡單的客戶端認證方式是經過HTTP基本認證機制,簡單的使用用戶名和密碼來驗證一個用戶所自稱的身份,Apache提供了一個htpasswd工具來管理可接受的用戶名和密碼 。


cd /webapp

apache2/bin/htpasswd -c svndata/passwd user1

-c 表示新建一個密碼文件

vi apache2/conf/httpd.conf

Location 標籤中加入如下內容:

AuthType Basic

AuthName "svn data"

AuthUserFile /webapp/svndata/passwd

Require valid-user

保存後,重啓apache後便可

/etc/init.d/httpd restart

 

能夠把"Require valid-user" 替換爲"Require user harry sally",表示只有harry和sally能夠訪問該版本庫。

 

2. mod_authz_svn 進行目錄訪問控制

使用mod_authz_svn模塊能夠更加細緻的設置訪問權限。


vi apache2/conf/httpd.conf

查看mod_auth_svn 模塊是否加載

LoadModule authz_svn_modulemodules/mod_authz_svn.so

 

增長如下內容

<Location /svndata>

    DAV svn

    SVNParentPath /webapp/svndata

    AuthType Basic

    AuthName "svn data"

    AuthUserFile /webapp/svndata/passwd

    AuthzSVNAccessFile /webapp/svndata/accesspolicy

    Satisfy Any

    Require valid-user

</Location>

 

AuthzSVNAccessFile 指向的是 authz 的策略文件,詳細的權限控制能夠在這個策略文件中指定,如:

#兩個分組:group1,group2

[groups]
group1 = user1, user2
group2 = user3, user4
 
#在根目錄下指定全部的用戶有讀權限
[/]
* = r

#追加group1組用戶有讀寫權限
 
@group1= rw
 
#在data下給予用戶user1讀寫權限
 
[data:/]
user1 = rw
 
#禁止全部用戶訪問 /private 目錄

[/private]
* =

#給group2組用戶讀權限

@group2= r


若是要對具體每一個版本庫配置,用以下的語法:

[groups]
project1 = user1, user2
project2 = user3 ,user4
 
[data1:/]
* = r
@ project1 = rw
[data2:/]
* = r
@ project2 = rw

這樣項目1project1組只能對 data1 版本庫下的文件具備寫權限而不能修改版本庫data2,一樣項目2project2組也不能修改data1 版本庫的文件。


修改完配置後記得保存重啓apache:

/etc/init.d/httpd restart


另外還要修改對應目錄的權限,讓它們支持apache運行賬號可寫

chown -R daemon:daemon /webapp/svndata/data


這個賬號可在apache配置文件httpd.conf中設置:

User daemon

Group daemon


8、測試

SVN服務器安裝配置完畢,在客戶端使用TortoiseSVN進行測試,結果以下:

wKiom1l8PVLTp4aYAAB60YPE16Q424.png-wh_50

根據提示輸入用戶名和密碼

wKiom1l8O9rTq8ndAABY2kOOUkg438.png-wh_50

相關文章
相關標籤/搜索