2012-12-01 33 views
0

所以我在我們的web服務器上安裝了SVN。這個想法是,工作副本被加載到開發者機器上,當他們提交(衝突支持)時,服務器執行一個提交後的bash。SVN Apache post-commit更新網頁文件

存儲庫是基於每個項目的,想法是,在提交後,bash文件需要強制刪除整個項目文件夾和文件,並將更新的repo導出回項目文件夾,以保持網站更新SVN ...我知道這種方法一定會有一些分歧,但它對我們很有用...除了一件事...

雖然服務器正在重新導出項目,網站提出錯誤,因爲有大塊的文件丟失......有什麼辦法可以在SVN輸出時「排隊」apache/php,然後「恢復」請求嗎?

服務器很快導出文件,但它的那些少數的毫秒有人捕捉服務器,提高了PHP錯誤...

請讓我知道,如果有整理了這一點,一個典型的方法...

謝謝

回答

2

你可以最小化中斷通過在新的目錄樹中構建內容,然後重新命名的東西。也就是說,假設您的內容是/var/www/myproject下提供您的更新後腳本會:

  • 填充/var/www/myproject.new
  • 重命名/var/www/myproject/var/www/myproject.old
  • 重命名/var/www/myproject.new/var/www/myproject
  • 刪除/var/www/myproject.old

雖然不完全是原子更新,但需要p改變這兩個重命名將是最小的,應該大大改善這種情況。

+1

另請參閱,這是一個使用符號鏈接的類似想法。 – larsks

+0

這樣一個簡單的解決方法,奇怪的我從來沒有想到......一直處於壓力之下:S非常感謝 – Prof83

0

我不知道,如果是下面的是在你的情況下很有用,但你可以做一個兩步代碼升級腳本:

    在TEMPDIR
  1. SVN結賬替換所有的代碼在你的生產目錄包含在TEMPDIR
  2. 數據刪除TEMPDIR

你將永遠不會通過沖突去。

順便說一句我不認爲這是最佳做法。您應該解決客戶端開發者機器上的衝突。

+0

「衝突的支持」這不是解決衝突,SVN在提交之前幫助你......但是,謝謝無論如何,@larsks很有意義 – Prof83

1
  1. 可以導出不是整個樹,但只有文件,影響了本次修訂和替換文件,而不刪除網站
  2. 您仍然可以執行完全導出並完全取代,但不能刪除鉤現場,只覆蓋在舊文件的頂部(在版本文件中刪除,您在網站上完整保留,不會因爲它們不相關而中斷),並在夜晚執行完全同步(每日或每週)cron-job
0

我真的覺得@Larsks的回答足夠實際,足以提供一個幾乎原子和需要的解決方案,所以我保持他的答案爲「正確」,但認爲我會繼續ribute考慮This Post考慮還有:

假設MV完全原子時,post-commit鉤子慶典看起來是這樣的:

svn export file:///svn/repo /var/www/projectdir_NEW --force 
mv /var/www/projectdir /var/www/projectdir_OLD 
mv /var/www/projectdir_NEW /var/www/projectdir 
rm -rf mv /var/www/projectdir_OLD 

的唯一的事情就是2個MV命令之間的一些分裂秒,這是最接近原子和最乾淨的方式來做到這一點...但是,對於完全原子的影響,讓我們說我不介意使用一點PHP,因爲我的項目有一個全局init.php,提交後可以這樣做:

date > /var/www/projectdir.updating 
svn export file:///svn/repo /var/www/projectdir_NEW --force 
mv /var/www/projectdir /var/www/projectdir_OLD 
mv /var/www/projectdir_NEW /var/www/projectdir 
rm -rf mv /var/www/projectdir_OLD 
rm /var/www/projectdir.updating 

創建一個TEM所謂「projectdir.updating」在它的日期porary文件,執行更新,然後刪除臨時文件,現在我可以用我的init.php來「節流」的任何請求:

while (file_exists("/var/www/projectdir.updating")) usleep(200); 

而且我可以檢查保存在臨時文件中的日期詳細信息用於退出時出現錯誤...(如果導出失敗以刪除.updating文件)