我们有一个网站,我们的部署过程大致如下(排除了许多不相关的步骤)
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
或通过使用 PHPrealpath()
来确定/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
如果解释得不够清楚,我很抱歉。如果有人能提供一些关于如何解决这个问题的建议,我将不胜感激。谢谢。
答案1
current
不应该是包含文件的实际目录,而应该是一个符号链接。这是 capistrano 的做法:
- 创建一个以当前日期命名的目录。
- 将新文件部署到该目录。
- 更改
current
符号链接以指向新目录。 - 删除所有旧的不需要的目录。