Skip to content

[Proposal] 强制非维护者使用 Issue Form,阻止空白 Issue / API 绕过模板 #990

Description

@xiaoyumuxi

背景

当前仓库已经在 .github/ISSUE_TEMPLATE/config.yml 中配置:

blank_issues_enabled: false

这能隐藏普通用户在 GitHub Issue 模板选择页中的 Blank issue 入口,但它不是后端权限限制。普通用户仍可能通过 GitHub API、gh issue create、第三方客户端或部分旁路入口创建不经过 Issue Form 的 Issue。

近期 #988 就出现了正文为空的 Issue,说明仅依赖 blank_issues_enabled: false 无法保证所有非维护者都必须走仓库定义的 Issue Form。

目标

对非维护者增加服务端校验:

  • Write / Maintain / Admin 权限用户可以正常创建任意 Issue。
  • 普通用户必须通过仓库提供的 Bug / Feature Issue Form 创建。
  • 通过 API、CLI、第三方客户端或空白入口绕过模板的 Issue 自动提示并关闭。

建议方案

1. 给 Issue Form 添加可识别的专用 label

例如:

# bug_report.yml
labels:
  - "issue-form:bug"
# feature_request.yml
labels:
  - "issue-form:feature"

这比只判断 Issue body 是否为空更可靠,因为用户即使通过 API 随便填写一段正文,也仍然没有经过仓库定义的 Issue Form。

2. 新增 GitHub Actions 校验

监听:

on:
  issues:
    types: [opened]

工作流逻辑:

  1. 获取 Issue 作者对仓库的权限。
  2. 如果权限为 write / maintain / admin,直接放行。
  3. 如果是普通用户,检查 Issue 是否带有允许的 Issue Form label。
  4. 未通过校验时:
    • 自动回复,说明普通用户必须使用 Bug / Feature Issue Form;
    • 附上正确的 Issue 创建入口;
    • 自动关闭该 Issue。

逻辑示意:

维护者
  └─ 放行

普通用户
  ├─ issue-form:bug      -> 放行
  ├─ issue-form:feature  -> 放行
  └─ 其他创建方式        -> 评论 + 自动关闭

为什么不只判断空正文

仅检查:

issue.body == null || issue.body == ""

只能拦截真正的空白 Issue。

如果用户通过 API / CLI 创建:

title: 希望增加某某功能
body: 希望支持一下

依然可以绕过模板。

因此建议校验“是否来自受支持的 Issue Form”,而不是仅校验 body 是否为空。

兼容性与注意事项

  • 不建议直接启用“仅 collaborators 可创建 Issue”之类的仓库级限制,否则普通用户将完全无法反馈 Bug / Feature。
  • Action 应只针对非维护者执行,避免影响项目维护者快速创建内部 Issue。
  • 自动关闭前应保留一条清晰提示,避免让贡献者不知道如何重新提交。
  • 如果后续新增新的 Issue Form,只需将对应 label 加入允许列表。

验收标准

  • 普通用户通过 Bug Issue Form 创建 Issue,可正常保留。
  • 普通用户通过 Feature Issue Form 创建 Issue,可正常保留。
  • 普通用户创建空白 Issue,会自动收到说明并关闭。
  • 普通用户通过 API / CLI 创建非模板 Issue,即使正文非空,也会自动收到说明并关闭。
  • Write / Maintain / Admin 用户创建空白 Issue不会被自动关闭。
  • 工作流使用最小必要权限,例如 issues: write、contents: read。

关联

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    review: highghfind author score; see https://ghfind.com

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions