-
Notifications
You must be signed in to change notification settings - Fork 0
146 lines (121 loc) · 4.4 KB
/
check-links.yml
File metadata and controls
146 lines (121 loc) · 4.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
name: 插件链接定时巡检
on:
schedule:
# 每天 UTC 04:00(北京时间 12:00)执行
- cron: '0 4 * * *'
workflow_dispatch:
permissions:
contents: read
issues: write
jobs:
check-links:
name: 检查所有插件下载链接
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Check all plugin links
id: check
run: |
node scripts/validate-plugin.mjs --check-links 2>&1 | tee check-output.txt
echo "exit_code=${PIPESTATUS[0]}" >> $GITHUB_OUTPUT
- name: Report broken links via Issue
if: steps.check.outputs.exit_code != '0'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const output = fs.readFileSync('check-output.txt', 'utf-8');
const clean = output.replace(/\x1b\[[0-9;]*m/g, '');
// 提取失败的链接
const errorLines = clean.split('\n').filter(l => l.includes('✗') || l.includes('不可达'));
const today = new Date().toISOString().split('T')[0];
const title = `🔗 插件链接巡检报告 - ${today}`;
const body = `## 🔗 插件链接巡检报告
**检查时间**: ${new Date().toISOString()}
### ❌ 发现问题的链接
\`\`\`
${errorLines.join('\n') || '无'}
\`\`\`
### 📋 完整日志
<details>
<summary>点击展开</summary>
\`\`\`
${clean}
\`\`\`
</details>
---
> 此 Issue 由 CI 自动创建。请相关插件作者检查下载链接是否有效。
`;
// 查找是否已有今天的巡检 issue
const { data: issues } = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
labels: '链接巡检',
per_page: 5,
});
const existingIssue = issues.find(i => i.title.includes(today));
const cleanBody = body.split('\n').map(l => l.trim()).join('\n');
if (existingIssue) {
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: existingIssue.number,
body: cleanBody,
});
} else {
// 确保标签存在
try {
await github.rest.issues.getLabel({
owner: context.repo.owner,
repo: context.repo.repo,
name: '链接巡检',
});
} catch {
await github.rest.issues.createLabel({
owner: context.repo.owner,
repo: context.repo.repo,
name: '链接巡检',
color: 'f9a825',
});
}
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: title,
body: cleanBody,
labels: ['链接巡检'],
});
}
- name: Close old check issues if all links OK
if: steps.check.outputs.exit_code == '0'
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',
labels: '链接巡检',
per_page: 10,
});
for (const issue of issues) {
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
state: 'closed',
state_reason: 'completed',
});
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: '✅ 所有插件链接已恢复正常,自动关闭此 Issue。',
});
}