Как безопасно делать git pull на продакшене сайта?
Друзья, доброго времени суток!
Небольшое введение.
До недавнего времени все сайты я заливал на хостинг ручками, через FTP. Но в связи с появлением более крупных проектов, чем просто сайт-визитка, появилось огромное желание автоматизировать сей процесс. Все проекты хранятся в Git'е. И понятное дело, для автоматизации процесса, самый простой способ сделать доставку с помощью git pull.
Но мне не ясен принцип работы Git'а "под капотом". К сожалению, я подобной информации не нашел в интернете. Поэтому задаю этот вопрос.
Перейдем к вопросу.
Предположим, что у нас есть высоконагруженный сайт, на который каждый момент заходит какой-либо пользователь.
Если на сервере данного сайта произвести обычный git pull, то будет ли это безопасно? Не упадет ли в какой-то момент сайт для какого-то не очень удачливого пользователя?
Немного объясню что я имею ввиду.
Предположим, что у нас есть файл funcs.php и index.php. Допустим в новом коммите в funcs.php мы добавили новую функцию, а в index.php использовали эту новую функцию. Если мы будем грузить обновление по FTP и при этом загрузим index.php перед funcs.php, то гипотетически, в момент когда index.php уже загружен, а funcs.php еще нет, пользователь может зайти на сайт обратившись к index.php. Но в том момент, при попытке обратится к новой функции из funcs.php, произойдет ошибка, так как мы еще не успели загрузить обновленный funcs.php с добавленной новой функцией, но при этом пытаемся обратиться к этой самой функции из index.php. Получается, что либо надо контролировать последовательность загрузки файлов, либо закрывать сайт от пользователей на технические работы.
Как работает Git?
Есть ли в нем какие-то механизмы защиты от таких ситуаций? Или разработчик, как и в случае с FTP, сам должен позаботиться о безопасной загрузке? Если Git не предусматривает таких механизмов, то какие есть способы безопасно деплоить сайт используются в современной веб-разработке?
есть билд-сервер, который по комиту запускает тесты. если тесты прошли успешно, запускаются команды сборки ассетов. если и этот этап удался, запускается деплой, который уже зальёт собранные ассеты на удалённую машину, скажет ей получить код из VCS в отдельную диру, запустит миграции, и, если все прошло успешно, переключит корень веб-сервера на эту новую диру.
это один из самых примитивных сценариев. но его вполне хватит, чтоб дать вам представление и посылок для гуглежа на, минимум, ближайшую неделю.
На сервере две папки X и Z с исходниками, они дублируют друг друга. Веб-сервер, например nginx, настраиваем на работу c папкой X, в Z делаем git pull, гоним тесты и всё такое. Если всё ок, меняем конфиг nginx на папку Z и делаем nginx -s reload
Спасибо за ответ! Так и думал.
Единственное, в этом способе не совсем понимаю, можно ли безопасно сделать миграцию для БД? Например если в качестве БД используется стандартный для веба MySQL.
Или все же, перед миграцией следует закрыть сайт, провести миграцию, а затем открыть сайт?
Как вариант можно линковать папки.
Делаем две папки А, В, и ссылку на A назовем ее Current, позже когда нам нужно обновить проект делаем pull в папке B, и когда все прошло успешно, изменяем линк current на папку B. Соответственно веб сервер настраиваем на эту ссылку current. В будущем это можно автоматизировать с помощью какого-то CI, к примеру гитлаба
Как уже сказали выше, Git к этому отношения не имеет.
Нужно сочинить процедуру для deploy, которая будет минимизировать downtime.
Варианты таких процедур:
- несколько серверов с лоадбалансером. Деплой по очереди, сервер убирает себя из лоадбалансера перед деплой
- симлинки