同步程序思路:用戶提交程序到SVN,SVN觸發(fā)hooks,按不同的hooks進行處理,這里用到的是post-commit,利用post-commit到代碼檢出到SVN服務器的本地硬盤目錄,再通過rsync同步到遠程的WEB服務器上。
知識點:1、SVN的hooks# start-commit 提交前觸發(fā)事務# pre-commit 提交完成前觸發(fā)事務# post-commit 提交完成時觸發(fā)事務# pre-revprop-change 版本屬性修改前觸發(fā)事務# post-revprop-change 版本屬性修改后觸發(fā)事務通過上面這些名稱編寫的腳本就就可以實現(xiàn)多種功能了,相當強大。2、同步命令rsync的具體參數(shù)使用3、具有基個語言的編程能力bash python perl都可以實現(xiàn)
post-commit具體實現(xiàn)細節(jié)post-commit腳本
編輯文件:sudo vim /home/svn/fitness/hooks/post-commit
注意:編輯完成post-commit后,執(zhí)行:sudo chmod 755 post-commit
內容:
#!/bin/shexport LANG=zh_CN.UTF-8sudo /usr/bin/svn update /var/www/www --username mirze --password 123456
或
#Set variableSVN=/usr/bin/svnWEB=/home/test_nokia/RSYNC=/usr/bin/rsyncLOG=/tmp/rsync_test_nokia.logWEBip="192.168.0.23"export LANG=en_US.UTF-8#update the code from the SVN$SVN update $WEB --username user --passwordpassword#If the previous command completed successfully, to continue the followingif [ $? == 0 ]thenecho "">> $LOGecho `date` >> $LOGecho "##############################" >> $LOGchown -R nobody:nobody /home/test_nokia/#Synchronization code from the SVN server to the WEB server, notes:by the key$RSYNC -vaztpH--timeout=90--exclude-from=/home/svn/exclude.list $WEB root@$WEBIP:/www/ >> $LOGfi以上是具體的post-commit程序注意事項:1、一定要定義變量,主要是用過的命令的路徑。因為SVN的考慮的安全問題,沒有調用系統(tǒng)變量,如果手動執(zhí)行是沒有問題,但SVN自動執(zhí)行就會無法執(zhí)行了。2、SVN update 之前一定要先手動checkout一份出來,還有這里一定要添加用戶和密碼如果只是手動一樣會更新,但自動一樣的不行。3、加上了對前一個命令的判斷,如果update的時候出了問題,程序沒有退出的話還會繼續(xù)同步代碼到WEB服務器上,這樣會造成代碼有問題4、記得要設置所屬用戶,因為rsync可以同步文件屬性,而且我們的WEB服務器一般都不是root用戶,用戶不正確會造成WEB程序無法正常工作。5、建議最好記錄日志,出錯的時候可以很快的排錯6、最后最關鍵的數(shù)據(jù)同步,rsync的相關參數(shù)一定要清楚,這個就不說了。注意幾個場景:這里的環(huán)境是SVN服務器與WEB服務器是開的把SVN服務器定義為源服務器 WEB服務器為目的服務器場景一、如果目的WEB服務器為綜合的混雜的,像只有一個WEB靜態(tài)資源,用戶提交的,自動生成的都在WEB的一個目錄下,建議不要用–delete這個參數(shù)上面這個程序就是這樣,實現(xiàn)的是源服務器到目的服務器的更新和添加,而沒有刪除操作,WEB服務器的內容會多于源SVN的服務器的場景二、實現(xiàn)鏡像,即目的WEB服務器與源SVN服務器一樣的數(shù)據(jù),SVN上任何變化WEB上一樣的變化,就需要–delete參數(shù)場景三、不需要同步某些子目錄,可能有些目錄是緩存的臨時垃圾目錄,或者是專用的圖片目錄(而不是樣式或者排版的)要用exclude這個參數(shù)注意:這個參數(shù)的使用不用寫絕對路徑,只要目錄名稱就行 aa代表文件 aa/ 代表目錄 ,缺點就是如果有多個子目錄都是一樣的名稱那么這些名稱就都不會被同步建議用–exclude-from=/home/svn/exclude.list 用文件的形式可以方便的添加和刪除exclude.list.svn/.DS_Storeimages/利用SVN的鉤子還可以寫出很多的程序來控制SVN 如代碼提交前查看是否有寫日志,是否有tab,有將換成空格,是否有不允許上傳的文件,是否有超過限制大小的文件等等。新聞熱點
疑難解答
圖片精選