如何用GitHub Actions自动关闭未关联Issue的PR?
用GitHub Actions管控PR关联Issue并清理无关联提交
一、阻止新的无关联PR提交
先通过工作流强制所有新PR必须关联Issue,从源头杜绝问题:
- 在仓库的
.github/workflows目录下创建require-issue-link.yml文件,内容如下:
name: 强制关联Issue on: pull_request: types: [opened, synchronize, reopened] jobs: 检查Issue关联: runs-on: ubuntu-latest steps: - name: 验证PR是否关联Issue env: PR内容: ${{ github.event.pull_request.body }} PR标题: ${{ github.event.pull_request.title }} run: | # 检查标题或描述里是否包含 #数字 格式的Issue编号 if [[ ! "$PR标题" =~ #[0-9]+ && ! "$PR内容" =~ #[0-9]+ ]]; then echo "❌ 此PR未关联任何Issue,请在标题或描述中添加Issue编号(例如 #123)" exit 1 fi # (可选)验证关联的Issue确实存在,需要开启Workflow读写权限 # ISSUE编号=$(echo "$PR标题 $PR内容" | grep -o "#[0-9]\+" | head -n1 | tr -d '#') # curl -s -f "https://api.github.com/repos/${{ github.repository }}/issues/$ISSUE编号" || exit 1
- 配置工作流权限:
进入仓库Settings > Actions > General,将Workflow permissions设为Read and write permissions,确保工作流能正常执行检查操作。
这样,所有新提交的PR如果没在标题或描述里写Issue编号,就会被标记为失败,无法合并。
二、批量清理已有的无关联PR
对于已存在的无关联PR,可以用手动触发的工作流批量处理:
- 创建
.github/workflows/clean-unlinked-prs.yml文件:
name: 清理无关联PR on: workflow_dispatch: # 手动触发,需要在Actions页面点击运行 jobs: 批量处理PR: runs-on: ubuntu-latest steps: - name: 安装GitHub CLI run: sudo apt-get install -y gh - name: 验证身份 run: echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token - name: 处理无关联PR run: | # 获取所有未关联Issue的开放PR编号 PR列表=$(gh pr list --state open --search "no:issue" --json number --jq '.[].number') if [ -z "$PR列表" ]; then echo "✅ 没有未关联Issue的PR" exit 0 fi echo "找到未关联Issue的PR:$PR列表" # 步骤1:先给PR加标签(建议先做这步,人工确认后再关闭) # for 编号 in $PR列表; do # gh pr edit $编号 --add-label "未关联Issue" # done # 步骤2:确认后批量关闭PR并添加注释 for 编号 in $PR列表; do gh pr close $编号 --comment "此PR未关联任何Issue,已自动关闭。请关联对应Issue后重新提交。" done
- 运行工作流:
进入仓库的Actions页面,找到清理无关联PR工作流,点击Run workflow即可执行。建议先注释掉关闭PR的代码,只执行加标签的操作,人工确认这些PR确实是无效提交后,再取消注释执行关闭。
注意事项
- 若需要更严格的检查(比如要求PR通过GitHub官方的「Fixes #123」这种关键词真正关联Issue,而不只是写编号),可以调用GitHub API的
/repos/{owner}/{repo}/pulls/{number}/linked_issues端点,检查返回结果是否非空。 - 批量操作前一定要人工核对,避免误关有效PR。
内容的提问来源于stack exchange,提问作者UjjawaL Tyagi
相关产品推荐
相关产品推荐

