Deployment

如何在符號連結更新之前訪問原始文件,這些文件已被移動到另一個目錄

  • June 4, 2014

我們有一個網站,我們的部署過程大致如下(排除了許多不相關的步驟)

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()使用原始完整路徑訪問文件,並將獲取該文件的新版本。我們需要它從舊目錄中獲取舊目錄,該目錄現在已移動,如下所示:

  1. 系統開始頁面載入並確定SYSTEM_ROOT_PATH常量是/home/[XXX]/var_www/live或使用 PHP 的realpath()它可能是/home/[XXX]/php_code/current.
  2. 用於/home/[XXX]/var_www/live獲取更新的符號連結指向/home/[XXX]/php_code/previous而不是/home/[XXX]/php_code/current它最初的位置。
  3. 系統嘗試載入/home/[XXX]/var_www/live/something.php並獲取/home/[XXX]/php_code/current/something.php而不是/home/[XXX]/php_code/previous/something.php

如果沒有很好地解釋,我很抱歉。如果有人可以的話,我真的很感激一些關於如何解決這個問題的想法。謝謝你。

current不應該是包含文件的實際目錄,而是符號連結。這是 capistrano 的做法:

  1. 創建一個以目前日期命名的目錄。
  2. 將新文件部署到該目錄。
  3. 更改current符號連結以指向新目錄。
  4. 刪除任何舊的不需要的目錄。

引用自:https://serverfault.com/questions/601778