rc-plugin/.github/workflows/status-update.yml
Workflow config file is invalid. Please check your config file: yaml: line 51: could not find expected ':'

150 lines
5.7 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);