トピックとカテゴリを再整理するためのスクリプトフレームワーク

サイトを大規模に再編成するためのスクリプトを作成するために、サイトのリーダーシップと協力して、YAML設定ファイルから駆動される多数のRubyスクリプトレットをパッケージ化するためのシンプルなフレームワークを作成しました。これにより、ステージングサイトにバックアップを復元し、スクリプトを実行し、フィードバックを得て、YAMLの数行を変更し、バックアップを復元し、新しい設定でスクリプトを実行し、満足するまで繰り返すことができます。

私のサイトには600行近くの設定があり、UIを介した手動操作では到底できません。一度も、ましてや正しく行うために何度も繰り返すことはできません。前回、大規模な変更を提案したときに、試すのを文字通り断念したからです。対照的に、このスクリプトを使用すると、サイトには約50万件の投稿と100以上のカテゴリがあるにもかかわらず、イテレーションごとに数分で全体のサイクルを完了できます。これにより、サイトのリーダーシップから迅速なフィードバックを得ることができ、サイトを迅速に移行する準備が整います。

より詳細なドキュメントは、リポジトリのREADMEファイルにあります。

:warning: このスクリプトにはエラーチェック機能はありません。ライブサイトで実行するのは非常に危険です。ステージングサイトで実行し、結果を確認してから本番環境に適用することを目的としています。作成者である私もそのように実行するつもりです。ライブサイトで直接実行すると、破損した場合、すべての破片を自分で保持することになります。 :warning:

ドキュメントによると、設定ファイルは次のようになります。

---
- describe:
    context: Old Name
    category: 7
    name: New Name
    description: New description of category
    slug: new-slug
- movePosts:
    context: move only faq posts from the Support category to the Documentation category
    source: 3 # Support category ID
    target: 6 # Documentation category ID
    withTag: faq
    hide: false # do not hide the Support category when done
- movePosts:
    context: consolidate How-To category into documentation with how-to tag
    source: 8 # How-To category ID
    target: 6 # Documentation category ID
    addTag: how-to
    hide: true # hide the old How-To category, visible only to Admin

実行中の進捗出力は次のようになります。

==========
Move hidden categories out of the way so they don't clutter admin view
setHiddenCategory: {:category=>11}
==========
Rename Old Name to New Name
describe: {:category=>7, :name=>"New Name", :description=>"New description of category", :slug=>"new-slug"}
==========
move only faq posts from the Support category to the Documentation category
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

ただし、このスクリプトが完全に必要すべてを満たす可能性はかなり低いです。これは本当にフレームワークであり、数行のコードでスクリプト化されたサイト変更の自動化をさらに容易にする新しいアクションを簡単にドロップできます。数行のコードで1つのメソッドを定義するだけで、YAMLファイルから適切に呼び出すことができます。

サイトの整理を改善することを考えていましたが、UIを使用することに躊躇したり、ステージングサイトでテストを複製して変更を本番環境に適用できるかどうかをどのように信頼できるか疑問に思ったりしていませんか?ぜひ見て、ご意見をお聞かせください!

「いいね!」 5

メインサイトのクローンとしてテストサイトを作成するためにこのスクリプトを使用しています。高い視覚的忠実度はポイントの一部ですが、変更を確認中に誤って間違ったサイトに投稿してしまい、次回テストサイトをリフレッシュしたときにその誤った投稿が吹き飛ばされる可能性があります。

最初に、公開フィードバックを求めたときにテストサイトを読み取り専用にしました。しかし、サイトが読み取り専用モードの間はログインが無効になるため、ログインして操作するように求めたときにログインできませんでした。

新しいpublicCategoriesReadonlyアクションを追加しました。これにより、匿名で表示可能なカテゴリは:adminsのみが書き込み可能になり、:everyone:readonlyになるため、人々がログインして操作できるようになりますが、誤って間違ったサイトに投稿することを避けるのに役立ちます。これで、サイト全体が読み取り専用モードではなくなりましたが、公開カテゴリは読み取り専用になりました。

スラッグでカテゴリをハッシュタグとして参照できます。このスクリプトは、カテゴリのコンテンツを一緒に移動し、スラッグを変更することを可能にします。これにより、リベイク後に以前の投稿へのリンクが無効になります。(リベイク前は、パーマリンクのリダイレクトによりリンクは機能します。)

現在、スクリプトを更新し、移行前後のタグを追跡し、投稿内の変更されたカテゴリへの参照を再マッピングするようにしました。

migrateRetortToReactions アクションをフレームワークに追加しました。これは、Retort をインストールしていて、サポートされているプラグインに移行したいユーザー向けです。

「いいね!」 2

素晴らしいニュースですね。誰かがそれをrakeタスクにして、reactionsプラグインに提出できたら素晴らしいでしょう。

すぐに確認します。

「いいね!」 1

プラグイン内にrakeタスクとして実装するのは良いアイデアだと思います。

CDCK CLAに署名したので、私の著作権上の利益が今後の作業の妨げになることはなく、プラグイン自体と同じライセンスの下で公開できます。

また、何か間違っている点があるかもしれません。もし何か問題点を見つけたら、今後数週間以内に自分のサイトでそのスクリプトを実行する予定なので、ぜひ教えてください。:smiley:

より大きな視点で見ると、Discourseのインストールをサポートする作業でこのフレームワークが役立つと感じ、さらにエラー処理を強化したい場合は、PR(プルリクエスト)を受け付けます。PRを送信する人がCLAに署名しており、その有用な部分が公式のDiscourseに組み込まれることに同意していることを確認したいだけです。これはあなたに関しては当てはまることだとわかっています…

「いいね!」 2

Retort トピックで、@angus が UI 主導の変換を行うブランチを持っていることを発見しましたが、これは完全に気づいていませんでした。

私のスクリプトは内部に深く入り込むため、いつか変更される可能性のある内部に依存しています。このスクリプトで変換を完了すると、それらの内部が変更されても気づけなくなります。 最初は「正しい方法」でやろうとしましたが、Reactions プラグインがこれを可能にするインターフェースを公開していないことがわかりました。@angus はより長期的な視点を持っています。

@pfaffman さん、rake タスクを作成する場合、インターフェースの変更も行う PR に含めることを検討してください。たとえば、私が使用した「裏口」を使用するのではなく、created_by を渡せるように、またサイレントにできるようにします。その時点で、rake タスクはコマンドライン移行のために存在し、同時に @angus が UI 主導の移行を実行できるようにします。