Discourse GitHub

:discourse2: 概要 Discourse GitHub スタッフがGitHubの貢献に基づいてユーザーにバッジを付与できます。また、ユーザーがGithubのリンクバック、パーマリンクを作成し、1ボックス(Onebox)にPRのライブステータスを表示することも可能です。
:open_book: インストールガイド このプラグインはDiscourseコアにバンドルされています。プラグインを別途インストールする必要はありません。

機能

GitHubバッジ

GitHubの貢献に基づいてユーザーにバッジを付与します。

使用方法:
  1. 設定 → プラグインで github badges enabled を有効にします。
  2. GitHubアクセストークンを生成し、github linkback access token 設定に貼り付けます。手順は以下をご覧ください。
  3. github badges repos サイト設定に、貢献をスキャンするGitHubリポジトリのURLを1つ以上追加します。
バッジのカウント方法:

バッジはすべてのリポジトリにわたってコミット数をカウントします。ユーザーが複数のリポジトリに貢献した場合、それらのすべてのコミットが合計数として加算されます。

コミッターバッジ:

バッジ 必要なコミット数
ブロンズ 1コミット
シルバー 25コミット
ゴールド 1000コミット

バッジの進行: ユーザーが追跡対象のリポジトリのいずれかで貢献を累積すると、バッジの階層を自動的に進みます。例えば、ユーザーがリポジトリAにコミットし、その後リポジトリBにコミットした場合、両方の貢献が合計にカウントされ、ブロンズからシルバー、ゴールドへと進みます。


GitHubリンクバック

GitHubのプルリクエストまたはコミットから、それが言及されているDiscourseの投稿へのリンクを作成します。

使用方法:
  1. 設定 → プラグインで github linkback enabled を有効にします。
  2. GitHubアクセストークンを生成し、github linkback access token 設定に貼り付けます。手順は以下をご覧ください。
  3. 最後に、github linkback projects サイト設定に、投稿したいプロジェクトを以下の形式で追加します:
    • 特定のリポジトリの場合: username/repository
    • 特定のユーザーのすべてのリポジトリの場合: username/*

GitHubパーマリンク

GitHubの非パーマリンクをパーマリンクに置き換えます。

使用方法:
  1. 設定 → プラグインで github permalinks enabled を有効にします。

PRライブステータス

投稿やチャットメッセージ内のGitHubプルリクエスト1ボックスに、ライブステータスインジケーターを表示します。PRがGitHubで変更されると、Webhooksを介してステータスが自動的に更新されます。

ステータスタイプ
ステータス 説明
下書き グレー PRが下書きとしてマークされています
開放中 グレー PRは開放されており、レビュー待ちです
承認済み レビュアーによって承認されています
変更要求 オレンジ レビュアーによって変更が要求されています
マージ済み PRがマージされています
閉鎖済み マージなしで閉鎖されました
使用方法:
ステップ1: 機能を有効にする

管理 > 設定 > プラグイン に移動し、github pr status enabledtrue に設定します。

ステップ2: GitHubアクセストークンの構成

PRステータス(特にプライベートリポジトリの場合)を取得するには、GitHubアクセストークンを構成します。

設定: github onebox access tokens

形式:

organization_name|ghp_your_token_here
default|ghp_fallback_token_here

組織ごとにトークンを指定でき、フォールバックとして使用される default トークンも指定できます。各行には org_name|token を含め、トークンは repo スコープを持つGitHubパーソナルアクセストークン(クラシック)である必要があります。

例:

discourse|ghp_xxxxxxxxxxxxxxxxxxxx
my-company|ghp_yyyyyyyyyyyyyyyyyyyy
default|ghp_zzzzzzzzzzzzzzzzzzzzzz
ステップ3: GitHub Webhooksの設定(リアルタイム更新用)

PRが変更されたときに自動的なステータス更新を取得するには、GitHubでWebhookを構成します。

Webhookシークレットの生成:

openssl rand -hex 32

生成したシークレットを github webhook secret サイト設定に設定します。

GitHubでのWebhook作成:

Webhookは組織レベル(すべてのリポジトリをカバー)またはリポジトリごとに作成できます。

組織の場合:

  1. 組織の設定に移動します
  2. Webhooks(コード、計画、自動化の下)に移動します
  3. Webhookの追加 をクリックします

リポジトリの場合:

  1. リポジトリの設定に移動します
  2. Webhooks に移動します
  3. Webhookの追加 をクリックします

Webhook設定:

フィールド
ペイロードURL https://your-discourse-site.com/discourse-github/webhooks/github
コンテンツタイプ application/json
シークレット 生成したWebhookシークレット
SSL検証 有効(推奨)
イベント 「個別のイベントを選択」を選択

次のイベントを選択します:

  • プルリクエスト
  • プルリクエストレビュー

Webhookの追加 をクリックして保存します。

ステップ4: 設定の確認
  1. GitHubのPR URLを含むテスト投稿を作成します
  2. 1ボックスにステータスアイコンが表示されていることを確認します
  3. GitHubでPRステータスを変更します(例: 承認する、または閉じる)
  4. 数秒以内にDiscourseページを更新すると、ステータスが更新されているはずです

GitHubのWebhook設定でWebhookの配信ステータスを確認し、イベントが正常に送信および受信されていることを確認できます。

ステータスの優先度

PRに複数の状態がある場合(例: 承認済みだが、変更要求もある場合)、ステータスは以下の優先度によって決定されます:

  1. マージ済み(最高優先度)
  2. 閉鎖済み
  3. 下書き
  4. 変更要求
  5. 承認済み
  6. 開放中(デフォルト)
レビューステータスのロジック

この機能は、承認ステータスを決定するためにGitHub APIからレビュー情報を取得します:

  • 各レビュアーの最新のレビューを取得する
  • 「コメント済み」と「保留中」のレビュー状態は無視する
  • いずれかのレビュアーが変更を要求している場合、「変更要求」を表示する
  • レビューが存在し、変更要求がない場合のみ「承認済み」を表示する
適用場所
  • フォーラム投稿 — GitHubのPR 1ボックスを含む任意の投稿
  • チャットメッセージ — チャットのPR 1ボックスにもライブステータスが表示されます

注意: インライン1ボックス(リンクが完全なプレビューではなくテキスト内に表示される場合)にはステータスアイコンは表示されません。

GitHubステータステーマコンポーネントからの移行

この機能はGitHub Status Indicatorsテーマコンポーネントに取って代わるものです。両者は互換性がなく、同時に使用しないでください。

現在テーマコンポーネントを使用している場合:

  1. github-status-theme テーマコンポーネントを無効化して削除します
  2. github pr status enabled 設定を介してこの組み込み機能を有効にします

構成

GitHubアクセストークン

リンクバック機能を動作させ、ユーザーにバッジを付与するには、GitHubアクセストークンを提供する必要があります。ここでトークンを生成できます: Sign in to GitHub · GitHub

リンクバック機能には public_repo スコープが必要であり、バッジの付与にはスコープは不要です(バッジのみが必要な場合はすべてチェックを外したままにしてください)。 public_repo スコープはリポジトリへの書き込みアクセスを付与するため、リポジトリにアクセスできない使い捨てのGitHubアカウントを作成し、トークンを生成するためだけに使用することをお勧めします。

機能別のトークンスコープ

機能 必要なスコープ
バッジ スコープ不要
リンクバック public_repo
PRステータス(公開リポジトリ) スコープ不要
PRステータス(プライベートリポジトリ) repo

サイト設定リファレンス

設定 デフォルト 説明
enable discourse github plugin false プラグインのマスタースイッチ
github badges enabled false GitHub貢献バッジを有効にする
github badges repos (空) バッジ用に追跡するリポジトリURL
github linkback enabled false GitHubからDiscourseへのリンクバックを有効にする
github linkback access token (空) リンクバック機能のアクセストークン
github linkback projects (空) リンクバックを作成するプロジェクト
github permalinks enabled false GitHubリンクをパーマリンクに置き換える
github pr status enabled false 1ボックスにPRステータスアイコンを有効にする
github webhook secret (空) Webhook署名検証用のシークレット
github onebox access tokens (空) GitHub API用のアクセストークン(形式: org|token

技術詳細

PRステータスAPIの使用

GitHubのPR 1ボックスが生成されると、Discourseは最大2つのAPI呼び出しを行います:

  1. PRデータ: GET /repos/{owner}/{repo}/pulls/{number} — 状態、マージステータス、下書きステータスを含む基本的なPR情報を取得します
  2. レビュー: GET /repos/{owner}/{repo}/pulls/{number}/reviews — 承認ステータスを決定するためにレビューデータを取得します

これらの呼び出しは、利用可能な場合は構成済みのアクセストークンを使用し、プライベートリポジトリへのアクセスを可能にします。

Webhookセキュリティ

WebhookリクエストはHMAC-SHA256署名検証を使用して検証されます。GitHubはシークレットでWebhookペイロードに署名し、Discourseは処理前にこの署名を検証します。無効な署名は403レスポンスで拒否されます。

更新をトリガーするWebhookイベント

  • PR状態の変更(オープン、クローズ、 reopen)
  • PRマージ
  • 下書き状態の変更(下書きに変換、レビュー準備完了)
  • プルリクエストレビューの送信
  • レビューの編集または却下

パフォーマンスに関する考慮事項

  • リベークはサイトのパフォーマンスに影響を与えないよう、低優先度のバックグラウンドジョブとしてキューに入れられます
  • 完全なGitHub PR 1ボックスを持つ投稿/メッセージのみがリベークされます(インライン1ボックスはスキップされます)
  • チャットメッセージのリベークは重複アラートを防ぐため通知をスキップします

変更履歴

2025-12-10

  • 修正: GitHub Webhooksからのチャットメッセージのリベーク時に通知をスキップ

2025-12-09

  • 修正: インラインGitHub PR 1ボックスを持つ投稿のリベークをスキップ
  • 修正: 1ボックスを持つ投稿のリベーク時の中間状態を回避
  • 修正: GitHub PRステータスの変更時にチャットメッセージをリベーク
  • UX: ステータスアイコンが変更されたときのレイアウトシフトを防ぐため、最小高さを適用
  • UX: モバイルでのGitHub PRステータスアイコンのサイズを縮小

2025-12-08

  • 機能: GitHub PR 1ボックスに「変更要求」ステータスを追加

2025-12-04

  • 機能: GitHub PRライブステータスアイコン

2025-11-10

  • 機能: リンクバックの許可リストと拒否リスト

2025-11-08

  • 機能: GitHubリンクバック用のカテゴリ無視リストを追加

2024-12-20

  • 開発: discourse-githubをコアに移動(個別のインストールが不要になった)
「いいね!」 33

複数のリンクのプロセスはどうなっていますか?同じコミットコメントに追加されるだけですか?それとも毎回新しいコメントが作成されますか?

「いいね!」 1

コミットとPRのバッジを簡略化できるか疑問に思っています。なぜなら、私たちは選択のパラドックスを避けようとしているからです。:slight_smile:

現在、コミットバッジを削除しましたが、もちろん、コミットバッジ(直接コミットしているため)とフォークはコアを常に維持することとは異なります。

ワイルドカードの * は GitHub の組織では機能しませんでした。結局、すべてのリポジトリを個別に指定しました。組織の場合とユーザーの場合で、これに関して問題が発生した人は他にいますか?

リンクバックコメントの言語を設定する方法

ありがとうございます。このプラグインは本当に気に入っています!バッジシステムについて混乱していましたが、別のトピックで説明を見つけることができてよかったです: Github Badges are not working. Its hard to see if I do something wrong or if the plugin is not working - #4 by simon

しかし、その返信には次のように書かれています。

プラグインは6つのバッジを作成します:

これらのバッジはどれも見当たりません。何が起こったのかわかりません。これらのバッジの作成を(再)トリガーする方法はありますか?

「いいね!」 1

自分で質問に答えますが、数時間後にスケジュールされたタスクが実行され、その時にバッジが作成されました。

これを手動で行う方法は、サイドキックジョブをトリガーすることのようです。

「いいね!」 1

Feature Request: リンクバックからカテゴリやタグを除外する

RSS プラグインが GitHub の新しいリリースを自動的に取り込む Announcements カテゴリがあります。リリースノートが issue をリンクする場合、そのリンクも Discourse に表示され、リンクバックが作成されますが、それは誰にも役立たず、GitHub 上でノイズが発生します。

特定の投稿、つまりカテゴリやタグ、あるいは RSS プラグインで設定されているユーザーからの投稿をリンクバックの作成から除外できるようにしたいと考えています。

:partying_face: このプラグインは、Bundling more popular plugins with Discourse core の一環として、Discourse コアにバンドルされるようになりました。セルフホストでこのプラグインを使用している場合は、次回のアップグレード前に app.yml から削除する必要があります。

「いいね!」 1