У нас есть веб-сайт, и наш процесс развертывания выглядит примерно так (за исключением множества нерелевантных шагов)
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
должен быть не реальный каталог, содержащий ваши файлы, а символическая ссылка. Вот как это делает капистрано:
current
символическая ссылка, указывающая на новый каталог.