Как деплоить правки?

Как выгружать на сервер правки которые затрагивают код и базу данных?
Например вы изменили на странице какой-то блок, поправили код, в админке изменили контент.
Теперь это все нужно выгрузить на сервер. Код без базы работать не будет, блок который вы правили будет коряво отображаться. И наоборот новая версия базы не будет нормально работать со старым кодом. Да и полностью базу нельзя обновлять, так как с момента создания дампа, в продакшен базу внесли изменения (добавили новые статьи, новые комментарии). В ручную повторно вносить изменения в базу на продакшене не очень хочется.
Получается нужно практически одновременно (с минимальным интервалом) выгрузить новый код и базу (только то что изменилось).
Как вы решаете данный вопрос? Как автоматизируется deploy новых фич проекта?
  • Вопрос задан
  • 507 просмотров
Решения вопроса 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Во-первых, запомнить раз и навсегда 2 простые истины:

1. Продакшн база данных должна быть только на продакшне и больше нигде. Эти данные нельзя as-is использовать локально - в том числе по причинам юридическим и privacy (привет логины-пароли клиентов, их персональные данные и тд). Грубо говоря, за это можно и пострадать.
2. Локальная / development база данных работает только с тестовыми / посевными данными.

Между ними никакой синхронизации не должно быть, никогда. От слова совсем. И WordPress тут вообще ни при чем - эта проблема существует и в Laravel, Symfony, Ruby on Rails и тд. Просто там с нуля сразу учат решать ее правильно. Впрочем, продакшн-данные можно (и даже нужно) использовать как пример для генерации локальных данных. Например, в production БД можно посмотреть какие реальные first name и last name используются юзерами, чтобы улучшить валидацию и/или отображение.

Как с этим жить?

1. Для переноса изменений структуры базы данных используются миграции. В WordPress для этого есть dbDelta().
2. Для переноса посевных данных используются посевы (seeds). Например, если нужно залить список терминов в глоссарий (custom taxonomy), заполнить список отделов компании и тд - все это сеется.
3. Все остальное (настройки мышкой в админке, добавление контента и тд) делается руками. Локально вы вообще не должны даже думать о том, чтобы создавать какие-то страницы 1 в 1 с рассчетом на то, что потом будете их как-то "синхронизировать" на боевой сервер. Это в корне неправильный mindset, который и привел вас к этой проблеме. На локальной версии вы все тестируете с тестовыми данными. Даже если вы не используете lorem ipsum, а вставляете реальный текст предоставленный клиентом - это все равно тестовые данные.
4. Чтобы сайт не ломался в процессе выкатывания изменений (когда код залили, а контент еще делается) код нужно писать с учетом этой логики (опять же - дело в mindset). Например, есть такое понятие как feature flags, есть function_exists(), есть isset(). Ваш код должен работать корректно всегда - например, если данные для какого-то блока не заполнены, то блок не выводится вообще.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
sayber
@sayber
Да, я программирую на PHP и еще асинхронно!
Envoy, deployer etc...
Автоматически из репы создается новая версия и обновляется ссылка.
В БД лезть вообще не надо руками
Если добавили поле/таблицу и т.п., это делается через миграции

Можно конечно настроить какие то реплики данных.

Естественно все должно быть протестировано компетентными людьми на дев сервере.
Ответ написан
Обновление базы накатывается и откатываться миграциями. Механизмов и инструментов миграций предостаточно, можно выбрать подходящий.
Миграции можно катить как с кодом, так и отдельно.
Существует одно полезное правило, которым любят пренебрегать - код должен поддерживать базу версий v и v-1. Миграция так же не должна ломать совместимость кода v-1 при накатаке. В таком случае можно говорить о безопасной выкатке новой версии, и безопасном способе откатываться.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы