From 7c41200028701d4e1169e90fe3270c55fd293561 Mon Sep 17 00:00:00 2001 From: kl Date: Tue, 3 Mar 2026 18:57:59 +0800 Subject: [PATCH] chore(actions): auto-close >1y issues and trigger copilot triage comments --- .github/workflows/auto-close-old-issues.yml | 78 +++++++++++++++++++ .../workflows/copilot-issue-auto-comment.yml | 34 ++++++++ 2 files changed, 112 insertions(+) create mode 100644 .github/workflows/auto-close-old-issues.yml create mode 100644 .github/workflows/copilot-issue-auto-comment.yml diff --git a/.github/workflows/auto-close-old-issues.yml b/.github/workflows/auto-close-old-issues.yml new file mode 100644 index 00000000..8291b33a --- /dev/null +++ b/.github/workflows/auto-close-old-issues.yml @@ -0,0 +1,78 @@ +name: Auto Close Old Issues (1y) + +on: + schedule: + # Daily at 02:20 UTC + - cron: '20 2 * * *' + workflow_dispatch: + +permissions: + issues: write + +jobs: + close_old_issues: + runs-on: ubuntu-latest + steps: + - name: Close issues older than 1 year + uses: actions/github-script@v7 + with: + script: | + const owner = context.repo.owner; + const repo = context.repo.repo; + const now = new Date(); + const cutoff = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000); + + const closeComment = `该 Issue 已超过 1 年未活跃,为便于维护当前问题队列,先做关闭处理。\n\n如该问题在最新版本仍存在,欢迎直接 **Reopen** 本 Issue(或新建 Issue 并关联本单),并补充:\n1. 版本与部署方式\n2. 最小复现步骤\n3. 关键日志/截图(请脱敏)\n\n我们会优先跟进。`; + + let page = 1; + let processed = 0; + while (true) { + const { data: issues } = await github.rest.issues.listForRepo({ + owner, + repo, + state: 'open', + per_page: 100, + page, + sort: 'created', + direction: 'asc' + }); + + if (!issues.length) break; + + for (const issue of issues) { + // skip pull requests + if (issue.pull_request) continue; + + const createdAt = new Date(issue.created_at); + if (createdAt > cutoff) { + // list is sorted asc by created time; remaining items are newer + core.info('Reached issues newer than cutoff, stop scanning.'); + return; + } + + try { + await github.rest.issues.createComment({ + owner, + repo, + issue_number: issue.number, + body: closeComment, + }); + + await github.rest.issues.update({ + owner, + repo, + issue_number: issue.number, + state: 'closed', + }); + + processed += 1; + core.info(`Closed #${issue.number}`); + } catch (e) { + core.warning(`Failed to close #${issue.number}: ${e.message}`); + } + } + + page += 1; + } + + core.info(`Done. Closed ${processed} old issues.`); diff --git a/.github/workflows/copilot-issue-auto-comment.yml b/.github/workflows/copilot-issue-auto-comment.yml new file mode 100644 index 00000000..60fdb33b --- /dev/null +++ b/.github/workflows/copilot-issue-auto-comment.yml @@ -0,0 +1,34 @@ +name: Copilot Issue Auto Comment + +on: + issues: + types: [opened] + workflow_dispatch: + +permissions: + issues: write + +jobs: + copilot_auto_comment: + runs-on: ubuntu-latest + steps: + - name: Ask Copilot to triage issue automatically + uses: actions/github-script@v7 + with: + script: | + const issue = context.payload.issue; + if (!issue) return; + + const owner = context.repo.owner; + const repo = context.repo.repo; + + const body = `@copilot 请自动分诊并直接给出可执行建议(无需人工先介入):\n\n- 先判断类型:Bug / Performance / Security / Question / Feature\n- 检查 Issue 信息是否完整(版本、部署方式、复现步骤、日志)\n- 若信息不完整:请直接按模板列出缺失项并引导补充\n- 若信息较完整:请给出下一步排查建议与最小复现建议\n- 若判断为已知问题或已修复:请给出对应版本/修复方向\n\nIssue #${issue.number}\n标题:${issue.title}\n链接:${issue.html_url}`; + + await github.rest.issues.createComment({ + owner, + repo, + issue_number: issue.number, + body, + }); + + core.info(`Copilot prompt comment posted to #${issue.number}`);