Подтвердить что ты не робот

Обновление Atomic веб-сайта с помощью Git

Я хочу обновить веб-сайт в атомном режиме. Если мы внесли несколько изменений на страницы, изображения и javascript, все изменения должны появляться одновременно без простоя, несогласованности или 404.

Если я просто скопирую измененные файлы в каталог веб-сайта, то по крайней мере несколько запросов будут видеть несогласованный сайт. Если я скопирую новый сайт в отдельный каталог, переименуйте старый каталог, чтобы он его не выпускал, и переименуйте новый каталог, чтобы он стал живым, а на один короткий момент мы получим 404s.

У меня действительно есть два вопроса:

Как я могу обновить каталог файлов по-атомному?

Как я могу координировать это с помощью Git? Мы хотели бы развернуть с помощью git pull (или, возможно, push). Путь сайта в репозитории git отличается от пути на сервере, поэтому необходимо немного перемещать/переименовывать, используя команды git или команды OS.

4b9b3361

Ответ 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 - это просто ссылка на один из развернутых серверов.

Но мой метод звучит как обходной путь.