Скрипт-фреймворк для перестановки тем и категорий

Чтобы автоматизировать перестройку большого сайта Discourse в сотрудничестве с руководством, я написал простой фреймворк для упаковки множества небольших Ruby-скриптов, управляемых через YAML-файл конфигурации. Это позволяет мне восстанавливать резервную копию на тестовом сайте, запускать скрипт, получать обратную связь, вносить изменения в несколько строк YAML, снова восстанавливать резервную копию, запускать скрипт с новой конфигурацией и повторять процесс до достижения желаемого результата.

У меня почти 600 строк конфигурации для моего сайта, и ручное изменение всего этого через интерфейс просто невозможно. Даже один раз, не говоря уже о многократных попытках сделать всё правильно. Я знаю это, потому что в прошлый раз, когда я предложил внести масштабные изменения, я буквально сдался. Напротив, с помощью этого скрипта я теперь могу завершить весь цикл всего за несколько минут на каждой итерации, даже если на сайте около полумиллиона сообщений и более 100 категорий. Это позволяет мне быстро получать обратную связь от руководства и быть готовым к быстрому переносу моего сайта.

Более подробная документация находится в файле README в репозитории с кодом:

:warning: Этот скрипт не выполняет проверку ошибок. Запускать его на рабочем сайте крайне опасно. Он предназначен для использования на тестовом сайте, проверки результата, и только после этого переноса на рабочий. Как автор, я всё ещё планирую использовать его именно так. Если вы запустите его напрямую на рабочем сайте и что-то пойдёт не так, вы останетесь со всеми последствиями. :warning:

Согласно документации, файл конфигурации может выглядеть так:

---
- describe:
    context: Старое имя
    category: 7
    name: Новое имя
    description: Новое описание категории
    slug: new-slug
- movePosts:
    context: переместить только FAQ-посты из категории Поддержка в категорию Документация
    source: 3 # ID категории Поддержка
    target: 6 # ID категории Документация
    withTag: faq
    hide: false # не скрывать категорию Поддержка после завершения
- movePosts:
    context: объединить категорию Как сделать в Документацию с тегом how-to
    source: 8 # ID категории Как сделать
    target: 6 # ID категории Документация
    addTag: how-to
    hide: true # скрыть старую категорию Как сделать, видна только администраторам

Вывод прогресса во время выполнения может выглядеть так:

==========
Скрыть категории, чтобы они не загромождали вид администратора
setHiddenCategory: {:category=>11}
==========
Переименовать Старое имя в Новое имя
describe: {:category=>7, :name=>"Новое имя", :description=>"Новое описание категории", :slug=>"new-slug"}
==========
переместить только FAQ-посты из категории Поддержка в категорию Документация
movePosts: {:source=>3, :withTag=>"faq", :target=>6}
==========

Чтобы использовать это, поместите ваш YAML-файл в /var/discourse/shared/app/tmp/rearrange.yaml, затем выполните:

cd /var/discourse
./launcher enter app
git clone https://github.com/johnsonm/discourse-site-rearranger.git script/discourse-site-rearranger
ruby script/discourse-site-rearranger/rearrange.rb /shared/tmp/rearrange.yaml

Однако, вполне вероятно, что этот скрипт не сделает всё именно так, как вам нужно. Это действительно фреймворк, который позволяет очень легко добавлять новые действия, автоматизирующие дополнительные аспекты изменения сайта, всего несколькими строками кода. Всё, что вам нужно сделать, — определить один метод с несколькими строками кода, и вы сможете вызывать его из YAML-файла.

Думали ли вы об улучшении организации вашего сайта, но боялись использовать интерфейс, или задавались вопросом, как убедиться, что вы сможете воспроизвести свои тесты на тестовом сайте перед внесением изменений на рабочий? Посмотрите и расскажите, что вы думаете!

5 лайков

Я использую этот скрипт для создания тестового сайта, являющегося клоном моего основного сайта. Высокая визуальная точность — это одна из целей, но она может привести к случайной публикации на неправильном сайте при просмотре изменений, и такие случайные публикации будут удалены при следующем обновлении тестового сайта.

Сначала я сделал свой тестовый сайт доступным только для чтения, когда запросил публичную обратную связь. Однако вход в систему отключён, когда сайт находится в режиме только для чтения, поэтому пользователи не могли войти, когда я просил их об этом.

Я добавил новое действие publicCategoriesReadonly, которое делает категории, видимые анонимно, доступными для записи только для :admins, а для :everyone устанавливает режим :readonly, чтобы позволить пользователям войти в систему и исследовать сайт, но при этом избежать случайной публикации на неправильном сайте. Теперь весь сайт не находится в режиме только для чтения, но публичные категории — да.

Возможно ссылаться на категории как на хэштеги по их слагам. Этот скрипт позволяет перемещать содержимое категорий вместе и изменять слагги, из-за чего предыдущие публикации перестанут ссылаться после пересборки (до пересборки перенаправления постоянных ссылок обеспечивали работоспособность ссылок).

Теперь я обновил скрипт, чтобы он отслеживал теги до и после миграции и перенастраивал ссылки на изменённые категории в публикациях.

Я добавил в фреймворк действие migrateRetortToReactions для тех, у кого установлен Retort и кто хочет перейти на поддерживаемый плагин.

2 лайка

Вау! Это отличная новость. Было бы здорово, если бы кто-нибудь сделал это задачей rake и отправил в плагин reactions.

Я скоро займусь этим.

1 лайк

Кажется, разумно реализовать это как задачу Rake в плагине.

Я подписал CDCK CLA, поэтому мои авторские права на полученный результат не будут препятствовать его использованию, и его можно распространять под той же лицензией, что и сам плагин.

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

В более широком масштабе: если вам покажется, что этот фреймворк полезен для поддержки установок Discourse, но вы хотели бы добавить больше обработки ошибок, я готов принимать PR. Я лишь хочу убедиться, что любой PR в этот проект поступает от человека, подписавшего CLA и согласного с тем, что любые полезные его части могут быть включены в официальный Discourse. Я знаю, что это относится и к вам…

2 лайка

Я обнаружил в теме Retort, что у @angus есть ветка с конвертацией, управляемой через интерфейс, которую я совершенно упустил.

Мой скрипт обращается к внутренним механизмам, которые теоретически могут измениться в будущем, и после того, как я выполню конвертацию этим скриптом, я не замечу, если эти внутренние механизмы изменятся. Сначала я попытался сделать это «правильным способом», но выяснил, что плагин Reactions не предоставляет интерфейса, позволяющего это сделать. @angus придерживается более долгосрочного подхода:

@pfaffman, если вы создадите задачу rake, возможно, стоит включить её в PR, который также вносит изменения в интерфейсы, чтобы, например, можно было передавать параметр created_by, а также silent, вместо использования «заднего входа», к которому прибег я. В этом случае задача rake будет предназначена для миграций через командную строку и одновременно откроет возможности для @angus выполнить миграцию через интерфейс.