2014-05-07

使用Ubuntu架設SVN Server + WebSVN

一直都想架設版本控管系統,雖然現在已經有Git這種分散式控管的版本控制,網路上也有像githubbitbucket這種很大又免費的Git Server,但小研究了一下,他的控管方式跟SVN不太一樣,可能會顛覆原本的觀念。公司開發程式的工程師就兩位,所有的專案又不能對外公開,那就先研究一下比較好架設的SVN就好,Git就等之後學會了再來慢慢轉換過去。

目標:
  1. 能夠版本控制(廢話)
  2. 可以透過svn://或是http://連線
  3. 能有web介面看到現在所有的專案
  4. 有帳號密碼才能存取
綜合網路上各篇文章吸收研究後,底下是我採用的方法,步驟紀錄就筆記一下。


首先安裝好Ubuntu Server,接著分成三階段:

一、基本設定

  1. 先安裝相關套件
    sudo apt-get install apache2 subversion libapache2-svn php5 apache2-utils apache2-doc php-pear db5.1-util php5-json openssl-blacklist subversion-tools

  2. 準備相關資訊:
    1. Repository根目錄: /home/svn
    2. WebSvn根目錄: /var/www/websvn
    3. svn帳號: svn
    4. svn群組名稱: svngroup

  3. 增加帳號,並把相關帳號放入群組
    sudo mkdir /home/svn
    sudo addgroup svngroup
    sudo useradd -d /home/svn -G svngroup svn
    sudo usermod -G svngroup -a www-data
    sudo usermod -G svngroup -a 妳的帳號

  4. 先產生一個測試Repository(注意順序)
    sudo chown -R svn:svngroup /home/svn
    sudo mkdir /home/svn/demo
    sudo svnadmin create /home/svn/demo
    sudo chmod -R g+rwx /home/svn/demo

到此基本的設定就OK了,但還無法從client端取得資料,接著我們來設定相關協定。


二、設定http

  1. 編輯/etc/apache2/mods-available/dav_svn.conf,讓他變成如下:
    <Location /repos>
        DAV svn
        SVNParentPath /home/svn
        SVNListParentPath On
        AuthType Basic
        AuthName "Subversion Repository" #這個是跳出認證視窗提示文字
        AuthUserFile /etc/subversion/passwd
        Require valid-user
        #LimitXMLRequestBody 0 #如果上傳太多檔案可能SVN會報錯,打開這個選項
    </Location>

  2. 重新啟動apache讓他生效
    sudo /etc/init.d/apache2 restart

  3. 產生認證帳號密碼檔,這樣從http存取Repository的時候就會跳出輸入帳號密碼視窗,就不會任何人都可修改
    sudo htpasswd -c /etc/subversion/passwd 帳號名稱
    會要你輸入兩次密碼,輸入完成即可

    以上指令僅限第一次使用,之後要再產生新帳號的話,必須把-c參數拿掉,不然會重新產生passwd的檔案,如下
    sudo htpasswd /etc/subversion/passwd 帳號名稱
    

  4. 確認剛才的帳號有產生
    sudo cat /etc/subversion/passwd
    

  5. 這樣應該就可以利用 http://網站IP或Domain/repos/REPO_NAME 存取Repository了,也可以使用瀏覽器瀏覽。

三、設定svn

  1. 當利用svnadmin create指令產生新的Repository之後,該目錄底下有個conf目錄,編輯svnserve.conf檔案
    [general]
    anon-access = none #訪客不可存取
    auth-access = write #認證使用者可寫入
    password-db = passwd #帳號密碼表的檔案

  2. 存檔好之後,我們再來編輯conf目錄底下passwd檔案(就是上面指定的帳號密碼表),加入可存取該Repository的帳號與密碼
    [users]
    user = user-password

  3. 啟動SVN
    我們利用xinetd來委託啟動,如果server沒有安裝的話就先裝一下吧
    sudo apt-get install xinetd

  4. 新增個svn檔
    sudo vi /etc/xinetd.d/svn

  5. 加入底下
    service svn
    {
        disable = no
        port = 3690
        socket_type = stream
        protocol = tcp
        wait = no
        user = svn
        server = /usr/bin/svnserve
        server_args = -i -r /home/svn
    }
    注意紅框處的值是要隨實際情況來改變的

  6. 存檔好後執行
    sudo /etc/init.d/xinetd restart
    即可。

四、websvn

  1. 變身root
    sudo -i

  2. 下載websvn最新版(最新版只到2011/6就沒了)並解壓縮
    cd ~
    wget http://websvn.tigris.org/files/documents/1380/49056/websvn-2.3.3.tar.gz
    tar -zxvf websvn-2.3.3.tar.gz

  3. 將所有檔案搬到/var/www底下
    mkdir /var/www/websvn
    mv /root/websvn-2.3.3/* /var/www/websvn

  4. 重新編輯一次/etc/apache2/mods-available/dav_svn.conf,在最底下加上
    <Location /websvn>
        Options FollowSymLinks
        order allow,deny
        allow from all
        AuthType Basic
        AuthName "Subversion Repository"
    </Location>

  5. 增加程式碼高亮
    apt-get install enscript

  6. 修改設定檔
    cd /var/www/websvn/include
    cp distconfig.php config.php
    vi config.php

  7. 增加SVN Parent目錄與encscript
    $config->parentPath("/home/svn");
    $config->setEnscriptPath('/usr/bin');

  8. 重新啟動apache之後就可以在 http://網站IP或Domain/websvn 看到已經建立的Repository了

以後要新增Repository:
cd /home/svn
svnadmin create RepositoryName
sudo chown -R svn:svngroup RepositoryName
sudo chmod -R ug+rwx RepositoryName
然後編輯底下conf/svnserve.conf與passwd檔案即可


參考連結: