mirror of
https://github.com/Jerryplusy/rc-plugin.git
synced 2025-10-14 08:09:19 +00:00
150 lines
6.1 KiB
YAML
150 lines
6.1 KiB
YAML
name: Weekly Status Update
|
||
|
||
on:
|
||
schedule:
|
||
- cron: '0 10 * * 1' # 每周一上午10点(UTC时间)
|
||
workflow_dispatch: # 允许手动触发
|
||
|
||
jobs:
|
||
status-update:
|
||
runs-on: ubuntu-latest
|
||
permissions:
|
||
issues: write
|
||
contents: read
|
||
steps:
|
||
- name: Update Stale Issues
|
||
uses: actions/github-script@v7
|
||
with:
|
||
script: |
|
||
const { data: issues } = await github.rest.issues.listForRepo({
|
||
owner: context.repo.owner,
|
||
repo: context.repo.repo,
|
||
state: 'open',
|
||
sort: 'updated',
|
||
direction: 'asc',
|
||
per_page: 50
|
||
});
|
||
|
||
const now = new Date();
|
||
let updatedCount = 0;
|
||
|
||
for (const issue of issues) {
|
||
// 跳过PR
|
||
if (issue.pull_request) continue;
|
||
|
||
const lastUpdated = new Date(issue.updated_at);
|
||
const daysSinceUpdate = Math.floor((now - lastUpdated) / (1000 * 60 * 60 * 24));
|
||
const daysSinceCreated = Math.floor((now - new Date(issue.created_at)) / (1000 * 60 * 60 * 24));
|
||
|
||
const hasStaleLabel = issue.labels.some(label => label.name === 'stale');
|
||
const hasNeedsResponseLabel = issue.labels.some(label => label.name === 'needs-response');
|
||
const isPriorityHigh = issue.labels.some(label => label.name === 'priority/high');
|
||
|
||
// 7天无更新且不是高优先级的issue
|
||
if (daysSinceUpdate >= 7 && !hasStaleLabel && !isPriorityHigh) {
|
||
await github.rest.issues.createComment({
|
||
owner: context.repo.owner,
|
||
repo: context.repo.repo,
|
||
issue_number: issue.number,
|
||
body: `👋 这个issue已经一周没有更新了。
|
||
|
||
如果问题仍然存在,请提供更多信息:
|
||
- 是否还能复现?
|
||
- 有没有新的错误信息?
|
||
- 是否尝试了其他解决方案?
|
||
|
||
如果问题已解决,欢迎关闭此issue。如果30天内没有响应,此issue将被自动关闭。`
|
||
});
|
||
|
||
await github.rest.issues.addLabels({
|
||
owner: context.repo.owner,
|
||
repo: context.repo.repo,
|
||
issue_number: issue.number,
|
||
labels: ['stale']
|
||
});
|
||
|
||
updatedCount++;
|
||
}
|
||
|
||
// 30天无更新的stale issue自动关闭
|
||
else if (daysSinceUpdate >= 30 && hasStaleLabel) {
|
||
await github.rest.issues.createComment({
|
||
owner: context.repo.owner,
|
||
repo: context.repo.repo,
|
||
issue_number: issue.number,
|
||
body: `🤖 此issue因长期无响应被自动关闭。
|
||
|
||
如果问题仍然存在,请创建新的issue并提供详细信息。感谢您的理解!`
|
||
});
|
||
|
||
await github.rest.issues.update({
|
||
owner: context.repo.owner,
|
||
repo: context.repo.repo,
|
||
issue_number: issue.number,
|
||
state: 'closed',
|
||
state_reason: 'not_planned'
|
||
});
|
||
|
||
updatedCount++;
|
||
}
|
||
|
||
// 需要回复的issue提醒
|
||
else if (daysSinceUpdate >= 3 && hasNeedsResponseLabel) {
|
||
await github.rest.issues.createComment({
|
||
owner: context.repo.owner,
|
||
repo: context.repo.repo,
|
||
issue_number: issue.number,
|
||
body: `⏰ 提醒:此issue等待回复已超过3天。
|
||
|
||
我们会尽快处理,感谢您的耐心等待!`
|
||
});
|
||
|
||
updatedCount++;
|
||
}
|
||
}
|
||
|
||
console.log(`Updated ${updatedCount} issues`);
|
||
|
||
- name: Generate Weekly Report
|
||
uses: actions/github-script@v7
|
||
with:
|
||
script: |
|
||
const oneWeekAgo = new Date();
|
||
oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);
|
||
|
||
// 获取本周的issues
|
||
const { data: newIssues } = await github.rest.search.issuesAndPullRequests({
|
||
q: `repo:${context.repo.owner}/${context.repo.repo} is:issue created:>=${oneWeekAgo.toISOString().split('T')[0]}`,
|
||
sort: 'created',
|
||
order: 'desc'
|
||
});
|
||
|
||
// 获取本周的PRs
|
||
const { data: newPRs } = await github.rest.search.issuesAndPullRequests({
|
||
q: `repo:${context.repo.owner}/${context.repo.repo} is:pr created:>=${oneWeekAgo.toISOString().split('T')[0]}`,
|
||
sort: 'created',
|
||
order: 'desc'
|
||
});
|
||
|
||
// 获取本周关闭的issues
|
||
const { data: closedIssues } = await github.rest.search.issuesAndPullRequests({
|
||
q: `repo:${context.repo.owner}/${context.repo.repo} is:issue closed:>=${oneWeekAgo.toISOString().split('T')[0]}`,
|
||
sort: 'updated',
|
||
order: 'desc'
|
||
});
|
||
|
||
const report = `📊 **本周活动报告** (${oneWeekAgo.toISOString().split('T')[0]} ~ ${new Date().toISOString().split('T')[0]})
|
||
|
||
## 📈 统计数据
|
||
- 🎯 新增 Issues: ${newIssues.total_count}
|
||
- 🔀 新增 PRs: ${newPRs.total_count}
|
||
- ✅ 关闭 Issues: ${closedIssues.total_count}
|
||
|
||
## 🏷️ Issue 分类
|
||
${newIssues.items.length > 0 ? newIssues.items.slice(0, 5).map(issue =>
|
||
\`- [\${issue.title}](\${issue.html_url}) - \${issue.labels.map(l => l.name).join(', ') || '未分类'}\`
|
||
).join('\\n') : '本周暂无新issue'}
|
||
|
||
感谢所有贡献者的参与! 🙏`;
|
||
|
||
console.log(report); |