我们有一个网站,我们的部署过程大致如下(排除了许多不相关的步骤)
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
符号链接以指向新目录。