Deployment
如何在符號連結更新之前訪問原始文件,這些文件已被移動到另一個目錄
我們有一個網站,我們的部署過程大致如下(排除了許多不相關的步驟)
echo "Remove previous, if it exists, we don't need that anymore" rm -rf /home/[XXX]/php_code/previous echo "Create the current dir if it doesn't exist (just in case this is the first deploy to this server)" mkdir -p /home/[XXX]/php_code/current echo "Create the var_www dir if it doesn't exist (just in case this is the first deploy to this server)" mkdir -p /home/[XXX]/var_www echo "Copy current to previous so we can use temporarily" cp -R /home/[XXX]/php_code/current/* /home/[XXX]/php_code/previous/ echo "Atomically swap the symbolic link to use previous instead of current" ln -s /home/[XXX]/php_code/previous /home/[XXX]/var_www/live_tmp && mv -Tf /home/[XXX]/var_www/live_tmp /home/[XXX]/var_www/live # Rsync latest code into the current dir, code not shown here echo "Atomically swap the symbolic link to use current instead of previous" ln -s /home/[XXX]/php_code/current /home/[XXX]/var_www/live_tmp && mv -Tf /home/[XXX]/var_www/live_tmp /home/[XXX]/var_www/live
我們遇到並希望得到幫助的問題是,任何網站頁面載入所做的第一件事就是計算出應用程序的基本目錄並將其定義為常量(我們使用 PHP)。如果在該頁面載入期間發生部署,系統會嘗試
include()
使用原始完整路徑訪問文件,並將獲取該文件的新版本。我們需要它從舊目錄中獲取舊目錄,該目錄現在已移動,如下所示:
- 系統開始頁面載入並確定
SYSTEM_ROOT_PATH
常量是/home/[XXX]/var_www/live
或使用 PHP 的realpath()
它可能是/home/[XXX]/php_code/current
.- 用於
/home/[XXX]/var_www/live
獲取更新的符號連結指向/home/[XXX]/php_code/previous
而不是/home/[XXX]/php_code/current
它最初的位置。- 系統嘗試載入
/home/[XXX]/var_www/live/something.php
並獲取/home/[XXX]/php_code/current/something.php
而不是/home/[XXX]/php_code/previous/something.php
如果沒有很好地解釋,我很抱歉。如果有人可以的話,我真的很感激一些關於如何解決這個問題的想法。謝謝你。
current
不應該是包含文件的實際目錄,而是符號連結。這是 capistrano 的做法:
- 創建一個以目前日期命名的目錄。
- 將新文件部署到該目錄。
- 更改
current
符號連結以指向新目錄。- 刪除任何舊的不需要的目錄。