svn服務器搭建與遷移


2016-11-21更新:

  今天被svn的鈎子搞了半天,網上找解決方法都無效,下午被我試出來了,特此記錄。

  在svn的鈎子中可以使用update來更新配置文件,比如ansible的,puppet的,具體過程是先co到本地,本地修改完更新到svn服務器,觸發鈎子,更新ansible等服務器。

  遇到的問題是:

    

  本地修改完提交到服務器顯示工作副本被lock,網上的解決方法是去工作副本clean up,但是根本沒用,因為問題根本不出在這。

  問題來源:

  我的svn是用root運行的,apache是daemon用戶運行的,鈎子是

    svn update /etc/ansible --username wj --password ' '

   在運行update的時候其實是daemon用戶進行的,而daemon用戶顯然運行不了svn命令,所以我認為是權限不夠導致的。

  解決方法:

     因此,在/etc/sudoers文件中添加運行apache用戶的sudo權限,並在鈎子前面加sudo,再次測試,完美解決,修改co到本地的ansible中的hosts文件,commit之后,在服務器的/etc/ansible中的hosts也更新了

   具體操作:

    echo "daemon ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers

      修改post-commit:sudo svn update /etc/ansible --username wj --password ' '

 

  最近公司各個部門陸陸續續搬遷到上地,機房也搬過去,老大叫我把我們部門的svn庫都遷移到備份機上防止原svn服務器搬遷過程損壞造成無法使用的情況。我表示svn以前都沒碰過,git倒是學過一段時間,后來網上找了找文檔發現使用方法和思想都差不多。我發現這種類似於lnmp之流或是常用的源碼編譯我已經越來越懶得過多去講述了,因為configure -h你想知道的都有了,可能會碰到些許坑,不過都是一些路徑或是缺少庫導致的,仔細排查就能知道。奉上svn安裝的官方文檔http://svn.apache.org/repos/asf/subversion/trunk/INSTALL。講的很詳細,至少比起mysql之流要好太多了。

  安裝我就講兩點

  1、依賴

  編譯需要gcc和make,還有幾個第三方依賴庫,apr、apr-util、SQLite,apr和apr-util包很好找,SQLite沒有的話會直接提示你並給出鏈接,下載解壓后將里面的3個文件全部拷貝至svn源碼目錄的sqlite-amalgamation(沒有就自己創建)中,重新執行3部曲即可。

  2、正確的安裝順序

  yum install expat-devel(serf需要)

  serf下載地址wget http://archive.apache.org/dist/serf/serf-1.2.1.tar.bz2

  先安裝apr、apr-util和serf、serf的編譯參數:./configure --prefix=/usr/local/serf --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

在安裝apache,apache的編譯參數是./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-dav --enable-so --enable-maintainer-mode --enable-ssl,最后安裝subversion,編譯參數是 ./configure --prefix=/usr/local/subversion --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr-util/bin/apu-1-config --with-apxs=/usr/local/apache2/bin/apxs --with-serf=/usr/local/serf --with-sqlite=$PWD/sqlite-amalgamation/sqlite3.c --with-openssl --with-zlib --enable-shared --enable-maintainer-mode --enable-mod-activation,個人建議apache用2.4.20版本,svn用1.8.16,親測可用

  安裝完畢后在http的配置文件下有dav_svn_module和authz_svn_module這兩個模塊說明支持apache的svn安裝成功。

 

  搭建

  1、創建倉庫

  創建repos目錄作為倉庫,然后創建svntest項目,在這里,所有的操作都是對svntest做的,

  mkdir /path/to/repos/svntest

  svnadmin create /path/to/repos/

  在目錄/path/to/repos使用默認數據存儲方式創建了一個新的版本庫。在Subversion 1.2之前,缺省值是Berkeley DB;而現在是FSFS。你可以通過--fs-type參數明確地指定文件系統類型,可選的值包括fsfsbdb

  svnadmin create --fs-type fsfs(bdb) /path/to/repos

  2、配置/path/to/repos/svntest/conf/下的authz、passwd、serve.conf

     在server.conf中將anon-access、auth-access、password-db和authz-db前面的注釋符號去掉並頂格。

     在passwd文件中添加用戶=密碼

     在authz文件中添加組和權限

    3、開啟服務

  svnserve -d -r /path/to/repos

  4、導入項目至版本庫

  svnadmin import svntest svn://localhost/svntest -m "Init commit"

  第一個svntest是本地的項目

  此時可以在客戶端使用svn co將svntest同步為你的工作副本了。

    svn checkout svn://ip/svntest

 

 遷移

   有很多種方法,dump是官方推薦的備份方法,不過我做了一次感覺導出的dump文件太大,過於占用磁盤空間,svnsync是不錯的選擇。

   源目錄:svn://192.168.1.10/mu

  目標目錄:svn://192.168.1.20/mu

   1、創建備份版本庫

   svnadmin create mu

  此時mu下就有hooks目錄,拷貝mu/hooks/pre_revprop-change.tmpl至mu/hooks/pre_revprop-change,修改pre_revprop-change,替換為exit 0

  2、初始化版本庫

  svnsync init mu svn://192.168.1.10/mu

   即svnsync init 目標庫 源庫

  會向你詢問源庫的用戶名和密碼,輸入完畢顯示Copied properties for revision 0.

  3、同步

   svnsync sync file:///localhost/mu

  

  sync初次同步是全量備份,可能耗時較長,第一次備份過后,sync后續的備份就是增量備份了  

  

  附上我的備份腳本

#!/bin/bash
init_repo() {
    cp $backupdir/$line/hooks/pre-revprop-change.tmpl $backupdir/$line/hooks/pre-revprop-change
    sed -i '3,65d;s/exit 1/exit 0/g' $backupdir/$line/hooks/pre-revprop-change
    chmod a+x $backupdir/$line/hooks/pre-revprop-change
    svnsync init file://$backupdir/$line/ http://ip/svn/$line  --username apache --password DslhDBk #--allow-non-empty
    if [ $? -eq 0 ];then
        echo " init $backupdir/$line success "
    else
        echo " init $backupdir/$line faild "
        exit 1
    fi
}

create_repo() {
    svnadmin create $backupdir/$line
    if [ $? -eq 0 ];then
        echo " create $backupdir/$line success "
    else
        echo " create $backupdir/$line faild "
        exit 1
    fi
}

sync_repo() {
    cat repofile |while read line
    do
        echo "start $backupdir/$line "
        svnsync sync file://$backupdir/$line  --username apache --password DslhDBk
        if [ $? -eq 0 ];then
                echo " sync $backupdir/$line success "
        else
                echo " sync $backupdir/$line faild "
                exit 1
        fi
    done
}

backupdir=/data0/www/svnroot
if test -e $backupdir;then
    echo "backup dir exists"
else
    mkdir -p $backupdir
fi
cat repofile |while read line
do
    if test -e $backupdir/$line;then
        echo "repo $backupdir/$line exists"
                if test -e $backupdir/$line/hooks/pre-revprop-change;then
            echo "repo $backupdir/$line has been init"
                else
            init_repo
        fi
    else
        create_repo
        init_repo
    fi
done
echo "start svn sync "
sync_repo

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM