Discourse GitHub

:discourse2: 摘要 Discourse GitHub 允许工作人员根据 GitHub 贡献为用户分配徽章。此外,还允许用户创建 GitHub 链接回指(Linkbacks)、固定链接(Permalinks),并在单盒(oneboxes)中显示实时 PR 状态。
:open_book: 安装指南 此插件已捆绑在 Discourse 核心中。无需单独安装该插件。

功能

GitHub 徽章

根据 GitHub 贡献为用户分配徽章。

使用方法:
  1. 在 设置 → 插件 中启用 github badges enabled
  2. 生成 GitHub 访问令牌并将其粘贴到 github linkback access token 设置中。请参阅下方的说明。
  3. 将一个或多个要扫描贡献的 GitHub 仓库 URL 添加到 github badges repos 站点设置中。
徽章计数原理:

徽章会统计所有仓库的提交次数。当用户为多个仓库做出贡献时,其所有提交次数将合并为一个总数。

提交者徽章:

徽章 所需提交次数
青铜 1 次提交
白银 25 次提交
黄金 1000 次提交

徽章晋升: 随着用户在任意受跟踪的仓库中积累更多贡献,他们将自动晋升到更高的徽章等级。例如,如果用户先向仓库 A 提交,然后向仓库 B 提交,这两项贡献都将计入其总数,使其能够从青铜晋升到白银,再到黄金。


GitHub 链接回指 (Linkback)

从 GitHub 拉取请求 (PR) 或提交创建链接,回指到提及它的 Discourse 帖子。

使用方法:
  1. 在 设置 → 插件 中启用 github linkback enabled
  2. 生成 GitHub 访问令牌并将其粘贴到 github linkback access token 设置中。请参阅下方的说明。
  3. 最后,在 github linkback projects 站点设置中以以下格式添加您希望发布的项目:
    • 用户名/仓库名 用于特定仓库
    • 用户名/* 用于特定用户的所有仓库

GitHub 固定链接 (Permalink)

将 GitHub 的非固定链接替换为 固定链接

使用方法:
  1. 在 设置 → 插件 中启用 github permalinks enabled

PR 实时状态

在帖子和聊天消息中的 GitHub 拉取请求 (PR) 单盒 (oneboxes) 上显示实时状态指示器。当 GitHub 上的 PR 发生变化时,状态会通过 Webhook 自动更新。

状态类型
状态 颜色 描述
草稿 (Draft) 灰色 PR 被标记为草稿
开放 (Open) 灰色 PR 已开放并等待审查
已批准 (Approved) 绿色 PR 已通过审查者批准
要求修改 (Changes Requested) 橙色 审查者要求修改
已合并 (Merged) 紫色 PR 已合并
已关闭 (Closed) 红色 PR 已关闭但未合并
使用方法:
步骤 1:启用功能

前往 管理 > 设置 > 插件,将 github pr status enabled 设置为 true

步骤 2:配置 GitHub 访问令牌

为了获取 PR 状态(特别是针对私有仓库),请配置 GitHub 访问令牌。

设置项: github onebox access tokens

格式:

组织名称|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 Webhook(用于实时更新)

为了在 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 配置:

字段
Payload URL https://your-discourse-site.com/discourse-github/webhooks/github
内容类型 application/json
密钥 您生成的 Webhook 密钥
SSL 验证 启用(推荐)
事件 选择“让我选择单独的事件”

选择以下事件:

  • Pull requests(拉取请求)
  • Pull request reviews(拉取请求审查)

点击 添加 Webhook 保存。

步骤 4:验证设置
  1. 创建一个包含 GitHub PR URL 的测试帖子
  2. 验证单盒是否显示状态图标
  3. 在 GitHub 上更改 PR 状态(例如,批准它或关闭它)
  4. 几秒钟后刷新 Discourse 页面——状态应已更新

您可以在 GitHub 的 Webhook 设置中检查 Webhook 交付状态,以确认事件是否成功发送和接收。

状态优先级

当 PR 具有多个状态(例如,已批准但同时也要求修改)时,状态由以下优先级决定:

  1. 已合并 (Merged)(最高优先级)
  2. 已关闭 (Closed)
  3. 草稿 (Draft)
  4. 要求修改 (Changes Requested)
  5. 已批准 (Approved)
  6. 开放 (Open)(默认)
审查状态逻辑

该功能从 GitHub API 获取审查信息以确定批准状态:

  • 获取每位审查者的最新审查
  • 忽略“评论”和“待定”的审查状态
  • 如果任何审查者要求修改,则显示“要求修改”
  • 仅当存在审查且无人要求修改时,才显示“已批准”
适用范围
  • 论坛帖子 — 任何包含 GitHub PR 单盒的帖子
  • 聊天消息 — 聊天中的 PR 单盒也会显示实时状态

注意:内联单盒(当链接作为文本的一部分出现而非完整预览时)不显示状态图标。

从 GitHub Status 主题组件迁移

此功能替代了 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 在单盒上启用 PR 状态图标
github webhook secret (空) 用于 Webhook 签名验证的密钥
github onebox access tokens (空) GitHub API 的访问令牌(格式:org|token

技术细节

PR 状态 API 使用

生成 GitHub PR 单盒时,Discourse 最多会进行两次 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 状态变更(打开、关闭、重新打开)
  • PR 已合并
  • 草稿状态变更(转换为草稿、准备审查)
  • 提交拉取请求审查
  • 审查被编辑或驳回

性能考虑

  • 重新烘焙(Rebaking)被排列为低优先级的后台作业,以避免影响网站性能
  • 仅对包含完整 GitHub PR 单盒的帖子/消息进行重新烘焙(跳过内联单盒)
  • 聊天消息的重新烘焙会跳过通知,以防止重复警报

更新日志

2025-12-10

  • 修复:在从 GitHub Webhook 重新烘焙聊天消息时跳过通知

2025-12-09

  • 修复:跳过重新烘焙包含内联 GitHub PR 单盒的帖子
  • 修复:避免在重新烘焙包含单盒的帖子时出现中间状态
  • 修复:当 GitHub PR 状态变更时重新烘焙聊天消息
  • 用户体验:使用最小高度以防止状态图标变更时的布局偏移
  • 用户体验:减小移动端 GitHub PR 状态图标的大小

2025-12-08

  • 功能:在 GitHub PR 单盒中添加“要求修改”状态

2025-12-04

  • 功能:GitHub PR 实时状态图标

2025-11-10

  • 功能:允许和拒绝链接回指的列表

2025-11-08

  • 功能:为 GitHub 链接回指添加类别忽略列表

2024-12-20

  • 开发:将 discourse-github 移至核心(不再需要单独安装)
33 个赞

多个链接的处理流程是什么?是仅仅将它们添加到同一个提交评论中?还是每次都创建一个全新的评论?

1 个赞

我想知道是否可以简化 commits 和 PRs 的徽章,因为我们正试图避免选择的悖论:)

目前我只是分叉并删除了 commit 徽章,但当然,我失去了 commit 徽章(因为我直接提交)并且分叉并不等于始终与核心保持一致。

通配符 * 对于 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 个赞

我来回答我自己的问题,几个小时后计划任务运行了,这时徽章被创建了。

手动执行此操作的方法似乎是触发 sidekiq 作业。

1 个赞

功能请求:从链接回退中排除类别和/或标签

我们有一个公告类别,RSS 插件会自动抓取 GitHub 的新版本。当版本说明链接到问题时,该链接也会显示在 Discourse 中,并生成一个链接回退,但这对任何人都没有帮助,反而造成了 Github 上的杂乱。

我希望能够排除某些帖子,例如由配置在 RSS 插件中的用户发布的类别、标签或甚至只是帖子本身,从而不创建链接回退。

:partying_face: 此插件现已作为 Bundling more popular plugins with Discourse core 的一部分,与 Discourse 核心捆绑在一起。如果您是自托管用户并使用了此插件,则需要在下次升级前将其从您的 app.yml 中移除。

1 个赞