Выборочный деплой контента с Drupal 8 на Drupal 8

Вступление

В последнее время эта тема довольно популярна, но особо нигде нет достаточно информации. Поделюсь своим опытом.

Напомню, что является контентом. Это созданные ноды, пункты меню, кастомные блоки, термины таксономии, файловые сущности.

Для чего вообще может понадобиться деплой контента? Ситуации бывают разные. Например, вам нужно сделать страницу, блок, пункт меню на деве, а потом сделать так, чтобы оно появилось на проде. А доступа к проду у вас нет, потому что клиент - банк, со всеми вытекающими. Или когда над сайтом одновременно работают много человек и таскать с дев сервера базу на локалку надоедает. Ну или вы, хитрец, взяли БД с прода, чтобы внести необходимые правки (добавить термины таксономии, изменить пункты меню), а пока вы делали, клиент добавил 100 товаров на сайт и вы не можете теперь вашу БД загрузить обратно на прод (да и это не самая хорошая идея, в принципе).

На этом вступительная часть окончена.

Экспорт контента

Итак, для деплоя контента я перепробовал разные способы. И миграции, и VDE, и feeds'ы всякие. Наиболее удобной оказалась связка модулей default_content + default_content_deploy. default_content умеет экспортировать контент в виде JSON файлов, а так же импортировать. Проблема в том, что нет никакого интерфейса для этого. Ни в админке, ни drush команд. Только программно через код. Так и появился default_content_deploy, в который добавили возможность экспорта/импорта контента используя drush. А в dev-ветке уже есть возможность импорта через админку и скоро будет готов экспорт. Как это работает?

drush dcde node
Экспортировать все ноды.

drush dcde node --folder='../content'
Экспортировать все ноды в указанный каталог (а не в каталог, указанный в конфигурации модуля)

drush dcde node --bundle=page
Экспортировать все ноды определенного типа.

drush dcde node --bundle=page,article --entity_id=2,3,4
Экспортировать все ноды определенного типа плюс ноды с ID 2,3 и 4

drush dcde node --bundle=page,article --skip_entities=5,7
Экспортировать все ноды определенного типа и пропустить экспорт нод с ID 5 и 7

drush dcde node --skip_entities=5,7
Экспортировать все ноды и пропустить экспорт нод с ID 5 и 7

Вместо node вы можете использовать наименования других сущностей.

Есть еще другие команды для экспорта, но вероятно, они будут заменены на ключи к команде dcde, поэтому приводить я их не буду, но вы всегда можете прочитать о них в README

Окей, мы выгрузили нужный нам контент, добавили его в гит и теперь он лежит на продакшене в виде JSON файлов.

Импорт контента

Для импорта существует команда

drush dcdi
Она отобразит найденные сущности в виде файлов и предложит их импортировать. Если UUID сущности уже будет найден в системе, то эта сущность будет пропущена.

drush dcdi --force-override
Ключ force-override скажет программе импорта перезаписать содержимое контента из файлов в БД. Нужно использовать его с осторожностью.

Вот собственно и всё. Добавив нужные команды в Gitlab CI (или в любой другой CI) вы сможете автоматизировать доставку контента с дева на прод.

Послесловие

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

Автор

ivnish Drupal backend developer в компании Abventor

Комментарии

Аватар пользователя zvse zvse 25 февраля в 11:22

Наверное, всё же только мои заморочки
мне вообще не нравится хранить контент в гите. мне кажется, это предпоследнее что должно быть у друпал сайта
Как "дефолт контент" - я ещё более и менее принимаю, но если решение для постоянного использования - мне кажется, что-то тут не так

Аватар пользователя adubovskoy adubovskoy 25 февраля в 14:08

да, есть такое. можно натравливать какого-либо воркера чтобы делать rsync папки и удаленно запускать drush, т.е. не гонять через git.

но если речь идет, например, о промо-сайтах или о модификациях главной страницы и у вас есть тесты фронтенда про diff'ы изменений рендера, например, то в такой картине мира git - вполне

Аватар пользователя VasyOK VasyOK 25 февраля в 16:45

А есть какие-то модули, чтобы контент переносить также как и конфигурации? Ну и выбирать какой именно контент переносить при выборе "всей" конфигурации?

Аватар пользователя ivnish ivnish 25 февраля в 16:54

Ну дак я и описал в статье как переносить контент "как конфигурации". Ты читал вообще статью? Smile

Аватар пользователя VasyOK VasyOK 25 февраля в 19:19

Да, но тут же именно через Гит. А без Гита? Чтобы оно в админке конфигураций было.