標籤:
我們最終的目的是:當本地提交後,SVN伺服器自動更新伺服器端指定WEB目錄內的檔案
實現方法:
找到伺服器端 SVN版本庫所在的目錄(目錄名稱是Repositories),這個目錄是在安裝VisualSVN Server設定的,根據你安裝時的設定找到Repositories這個目錄,在這個目錄下面找到你建立的項目目錄,在項目目錄下面找到hooks目 錄,在此目錄中建立一個名為post-commit.bat的批次檔,內容如下:
@echo off
"D:\VisualSVN Server\bin\svn.exe" update "D:\你的網站目錄" --username XXXXX --password XXXXX
//將svn.exe的目錄設定為你的VisualSVN Server安裝目錄,設定好你的使用者名稱和密碼
同步程式思路:使用者提交程式到SVN,SVN觸發hooks,按不同的hooks進行處理,這裡用到的是post-commit,利用post- commit到代碼檢出到SVN伺服器的本地硬碟目錄,再通過rsync同步到遠端WEB伺服器上。
hooks檔案詳解
# start-commit 提交前觸發事務
# pre-commit 提交完成前觸發事務
# post-commit 提交完成時觸發事務
# pre-revprop-change 版本屬性修改前觸發事務
# post-revprop-change 版本屬性修改後觸發事務
通過上面這些名稱編寫的指令碼就就可以實現多種功能了,相當強大。
2、同步命令rsync的具體參數使用
3、具有基個語言的編程能力bash python perl都可以實現
post-commit具體實現細節
post-commit指令碼
#!/bin/sh
# -------------------------------------------------------------------------------
# Filename: post-commit
# Description: WEB server with synchronization code by SVN
# -------------------------------------------------------------------------------
#Version 1.0
#當用戶把代碼提交完成時,把代碼中的最新更改同步到 WEB服務器,同時注意不包括刪除操作。
#Set variable
SVN=/usr/bin/svn
WEB=/home/test_nokia/
RSYNC=/usr/bin/rsync
LOG=/tmp/rsync_test_nokia.log
WEBIP="192.168.0.23"
export LANG=en_US.UTF-8
#update the code from the SVN
$SVN update $WEB --username user --password password
#如果前面的代碼成功完成,會繼續執行下面的代碼
if [ $? == 0 ]
then
echo "" >> $LOG
echo `date` >> $LOG
echo "##############################" >> $LOG
chown -R nobody:nobody /home/test_nokia/
#同步代碼從SVN伺服器到WEB伺服器 notes:by the key
$RSYNC -vaztpH --timeout=90 --exclude-from=/home/svn/exclude.list $WEB [email protected]$WEBIP:/www/ >> $LOG
fi
以上是具體的post-commit程式
注意事項:
1、一定要定義變數,主要是用過的命令的路徑。因為SVN的考慮的安全問題,沒有調用系統變數,如果手動執行是沒有問題,但SVN自動執行就會無法執行了。
2、SVN update 之前一定要先手動checkout一份出來,還有這裡一定要添加使用者和密碼 如果只是手動一樣會更新,但自動一樣的不行。
3、加上了對前一個命令的判斷,如果update的時候出了問題,程式沒有退出的話還會繼續同步代碼到WEB伺服器上,這樣會造成代碼有問題
4、記得要設定所屬使用者,因為rsync可以同步檔案屬性,而且我們的WEB伺服器一般都不是root使用者,使用者不正確會造成WEB程式無法正常工作。
5、建議最好記錄日誌,出錯的時候可以很快的排錯
6、最後最關鍵的資料同步,rsync的相關參數一定要清楚,這個就不說了。注意幾個情境:
這裡的環境是SVN伺服器與WEB伺服器是開的
把SVN伺服器定義為原始伺服器 WEB伺服器為目的伺服器
情境一、如果目的WEB伺服器為綜合的混雜的,像只有一個WEB靜態資源,使用者提交的,自動產生的都在WEB的一個目錄下,建議不要用–delete這個參數
上面這個程式就是這樣,實現的是原始伺服器到目的伺服器的更新和添加,而沒有刪除操作,WEB伺服器的內容會多於源SVN的伺服器的
情境二、實現鏡像,即目的WEB伺服器與源SVN伺服器一樣的資料,SVN上任何變化WEB上一樣的變化,就需要–delete參數
情境三、不需要同步某些子目錄,可能有些目錄是緩衝的臨時垃圾目錄,或者是專用的圖片目錄(而不是樣式或者排版的)要用exclude這個參數
注意:這個參數的使用不用寫絕對路徑,只要目錄名稱就行 aa代表檔案 aa/ 代表目錄 ,缺點就是如果有多個子目錄都是一樣的名稱 那麼這些名稱就都不會被同步
建議用–exclude-from=/home/svn/exclude.list 用檔案的形式可以方便的添加和刪除
exclude.list
.svn/
.DS_Store
images/
利用SVN的鉤子還可以寫出很多的程式來控制SVN 如代碼提交前查看是否有寫日誌,是否有tab,有將換成空格,是否有不允許上傳的檔案,是否有超過限制大小的檔案等等。
如何利用svn自動同步更新到網站伺服器