2013-01-21 72 views
13

我想以原子方式更新現場網站。如果我們對頁面,圖像和JavaScript進行了一些更改,則所有更改都應同時出現,而不會出現停機,不一致或404錯誤。使用Git原子網站更新

如果我只是將更改後的文件複製到網站目錄中,那麼至少有幾個請求會看到不一致的網站。如果我將新網站複製到一個單獨的目錄中,那麼將舊目錄重命名爲不生產,並重新命名新目錄以使其生效,然後在短時間內我們將獲得404s。

我真的有兩個問題:

我怎樣才能在一個原子的方式更新文件的目錄?

我該如何與Git協調?我們希望使用git pull(或可能推送)進行部署。 git倉庫中的站點路徑與服務器上的路徑不同,因此需要使用git命令或OS命令進行一些移動/重命名。

回答

21

你可以使用符號鏈接來做你想象中的事情。將一個符號鏈接移到另一個符號鏈接上是一個原子操作,所以您應該能夠避免任何404錯誤。

您的掛鉤將deploy your site to a directory,或許以commit hash命名。然後它會創建一個符號鏈接,也許稱爲分段。然後它會將該符號鏈接移動到生產符號鏈接上。

hash=`git rev-parse HEAD` 
git checkout-index -a -f --prefix=/srv/www/$hash/ 
ln -s /srv/www/$hash /srv/www/staging 
mv -T /srv/www/staging /srv/www/production 
+0

Capistrano是一個使用符號鏈接自動部署代碼的工具。 – user1158559

+1

這是一個很好的答案。但是,由於瀏覽器可能會請求頁面,網站可能會發生更改,然後頁面可能會請求不再存在的圖像或css文件,但結果不一致的可能性很小。但是在服務器端你無能爲力。 – ccleve

+0

@ccleve如果你想變得很花哨,你可以嘗試將每個Keepalive會話鎖定到單個版本或者使用cookie來玩。 – Zenexer

0

我對此並不完全確定,但是您可以爲git創建post push hook,這會創建新的目錄,或者複製現有目錄,拖拽或複製項目並將鏈接從項目更改爲新目錄。您的項目目錄只是鏈接到一個已部署的目錄。

但我的方法聽起來像解決方法。