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
參數明確地指定文件系統類型,可選的值包括fsfs
和bdb
。
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