Pour pouvoir réorganiser un grand Discourse en collaboration avec la direction de mon site, j’ai écrit un framework simple pour regrouper un tas de petits scripts Ruby qui seront pilotés par un fichier de configuration YAML. De cette façon, je peux restaurer une sauvegarde sur un site de staging, exécuter mon script, obtenir des retours, modifier quelques lignes de YAML, restaurer la sauvegarde, exécuter le script avec la nouvelle configuration, et répéter jusqu’à satisfaction.
J’ai près de 600 lignes de configuration pour mon site, et le faire manuellement via l’interface utilisateur n’aurait tout simplement pas été possible. Pas une seule fois, et encore moins plusieurs fois pour bien faire les choses. Je le sais car la dernière fois que j’ai proposé d’apporter des changements majeurs, j’ai littéralement abandonné en essayant. En revanche, avec ce script, je peux maintenant réaliser le cycle complet en quelques minutes par itération, même si le site compte environ un demi-million de messages et plus de 100 catégories. Cela me permet d’obtenir des retours rapides de la part de la direction de mon site, et je serai prêt à migrer mon site rapidement.
Une documentation plus détaillée se trouve dans le fichier README du dépôt contenant le code :
Ce script ne fait aucune vérification d’erreurs. Il est tout à fait déraisonnable de l’exécuter sur votre site en production. Il est conçu pour être exécuté sur un site de staging, valider le résultat, puis être déployé en production. En tant qu’auteur, j’ai toujours l’intention de l’exécuter de cette manière. Si vous l’exécutez directement sur un site en production, vous devrez en assumer toutes les conséquences en cas de problème. ![]()
D’après la documentation, un fichier de configuration pourrait ressembler à ceci :
---
- describe:
context: Ancien Nom
category: 7
name: Nouveau Nom
description: Nouvelle description de la catégorie
slug: nouveau-slug
- movePosts:
context: déplacer uniquement les messages faq de la catégorie Support vers la catégorie Documentation
source: 3 # ID de la catégorie Support
target: 6 # ID de la catégorie Documentation
withTag: faq
hide: false # ne pas masquer la catégorie Support une fois terminé
- movePosts:
context: consolider la catégorie Tutoriels dans la documentation avec le tag tutoriel
source: 8 # ID de la catégorie Tutoriels
target: 6 # ID de la catégorie Documentation
addTag: how-to
hide: true # masquer l'ancienne catégorie Tutoriels, visible uniquement par l'administrateur
La sortie de progression pendant son exécution pourrait alors ressembler à ceci.
==========
Déplacer les catégories masquées pour qu'elles n'encombrent pas la vue admin
setHiddenCategory: {:category=>11}
==========
Renommer Ancien Nom en Nouveau Nom
describe: {:category=>7, :name=>"Nouveau Nom", :description=>"Nouvelle description de la catégorie", :slug=>"nouveau-slug"}
==========
déplacer uniquement les messages faq de la catégorie Support vers la catégorie Documentation
movePosts: {:source=>3, :withTag=>"faq", :target=>6}
==========
Pour l’utiliser, placez votre fichier YAML dans /var/discourse/shared/app/tmp/rearrange.yaml puis :
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
Cependant, il est fort probable que ce script ne fasse pas exactement tout ce dont vous avez besoin. C’est vraiment un framework qui rend très facile l’ajout de nouvelles actions automatisant davantage d’aspects d’une modification de site scriptée avec seulement quelques lignes de code. Il vous suffit de définir une méthode avec quelques lignes de code, et vous pourrez l’appeler correctement depuis le fichier YAML.
Avez-vous pensé à améliorer l’organisation de votre site, mais vous reculez devant l’utilisation de l’interface utilisateur, ou vous demandez-vous comment vous assurer que vous pourrez reproduire vos tests sur un site de staging pour déployer les changements en production ? Jetez-y un œil et dites-moi ce que vous en pensez !