lightalex
@lightalex

Как безопасно делать 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 не предусматривает таких механизмов, то какие есть способы безопасно деплоить сайт используются в современной веб-разработке?

P.S. Заранее благодарю всех за участие в вопросе!
  • Вопрос задан
  • 277 просмотров
Решения вопроса 4
DevMan
@DevMan
элементарно: его не делают.
современный деплой гораздо сложнее банального git pull. особенно если хочется миграций, сборки ассетов и т.п.
Ответ написан
На сервере две папки X и Z с исходниками, они дублируют друг друга. Веб-сервер, например nginx, настраиваем на работу c папкой X, в Z делаем git pull, гоним тесты и всё такое. Если всё ок, меняем конфиг nginx на папку Z и делаем nginx -s reload
Ответ написан
Antonchik
@Antonchik
Программирую на HTML
Как вариант можно линковать папки.
Делаем две папки А, В, и ссылку на A назовем ее Current, позже когда нам нужно обновить проект делаем pull в папке B, и когда все прошло успешно, изменяем линк current на папку B. Соответственно веб сервер настраиваем на эту ссылку current. В будущем это можно автоматизировать с помощью какого-то CI, к примеру гитлаба
Ответ написан
Комментировать
@vitaly_il1
DevOps Consulting
Как уже сказали выше, Git  к этому отношения не имеет.
Нужно сочинить  процедуру для deploy, которая будет минимизировать downtime.
Варианты таких процедур:
- несколько серверов с лоадбалансером. Деплой по очереди, сервер убирает себя из лоадбалансера перед деплой
- симлинки
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы