背景
当前仓库已经在 .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]
工作流逻辑:
- 获取 Issue 作者对仓库的权限。
- 如果权限为
write / maintain / admin,直接放行。
- 如果是普通用户,检查 Issue 是否带有允许的 Issue Form label。
- 未通过校验时:
- 自动回复,说明普通用户必须使用 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 加入允许列表。
验收标准
关联
背景
当前仓库已经在
.github/ISSUE_TEMPLATE/config.yml中配置:这能隐藏普通用户在 GitHub Issue 模板选择页中的 Blank issue 入口,但它不是后端权限限制。普通用户仍可能通过 GitHub API、
gh issue create、第三方客户端或部分旁路入口创建不经过 Issue Form 的 Issue。近期 #988 就出现了正文为空的 Issue,说明仅依赖
blank_issues_enabled: false无法保证所有非维护者都必须走仓库定义的 Issue Form。目标
对非维护者增加服务端校验:
建议方案
1. 给 Issue Form 添加可识别的专用 label
例如:
这比只判断 Issue body 是否为空更可靠,因为用户即使通过 API 随便填写一段正文,也仍然没有经过仓库定义的 Issue Form。
2. 新增 GitHub Actions 校验
监听:
工作流逻辑:
write/maintain/admin,直接放行。逻辑示意:
为什么不只判断空正文
仅检查:
只能拦截真正的空白 Issue。
如果用户通过 API / CLI 创建:
依然可以绕过模板。
因此建议校验“是否来自受支持的 Issue Form”,而不是仅校验 body 是否为空。
兼容性与注意事项
验收标准
issues: write、contents: read。关联