Обновление Atomic веб-сайта с помощью Git
Я хочу обновить веб-сайт в атомном режиме. Если мы внесли несколько изменений на страницы, изображения и javascript, все изменения должны появляться одновременно без простоя, несогласованности или 404.
Если я просто скопирую измененные файлы в каталог веб-сайта, то по крайней мере несколько запросов будут видеть несогласованный сайт. Если я скопирую новый сайт в отдельный каталог, переименуйте старый каталог, чтобы он его не выпускал, и переименуйте новый каталог, чтобы он стал живым, а на один короткий момент мы получим 404s.
У меня действительно есть два вопроса:
Как я могу обновить каталог файлов по-атомному?
Как я могу координировать это с помощью Git? Мы хотели бы развернуть с помощью git pull (или, возможно, push). Путь сайта в репозитории git отличается от пути на сервере, поэтому необходимо немного перемещать/переименовывать, используя команды git или команды OS.
Ответы
Ответ 1
Вы можете делать то, что вы представляете, используя символические ссылки. Перемещение одной символической ссылки над другой - это атомная операция, поэтому вы можете избежать любых ошибок 404.
Ваш крючок будет развернуть свой сайт в каталог, возможно, названный в честь хеширования. Тогда это сделает символическую ссылку на это, возможно, называется стадией. Затем он перемещает эту символическую ссылку над производственной символической ссылкой.
hash=`git rev-parse HEAD`
git checkout-index -a -f --prefix=/srv/www/$hash/
ln -s /srv/www/$hash /srv/www/staging
mv -T /srv/www/staging /srv/www/production
Ответ 2
Как сказал Оуэн, вы можете использовать символическую ссылку на последнюю версию, которую вы развернули. Я недавно написал сообщение в блоге: http://bugfixer.endel.me/2013/08/04/simple-atomic-deployment-with-git
Вы можете настроить крюк post-receive на удаленном сервере git, который создает символическую ссылку, когда новая версия готова.
Ответ 3
Я не совсем уверен в этом, но вы можете создать post push hook для git, который создает новый каталог или копирует существующий, вытягивает или клонирует ваш проект и меняет ссылку из вашего проекта на новый каталог. Ваш проект dir - это просто ссылка на один из развернутых серверов.
Но мой метод звучит как обходной путь.