-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaction.yml
329 lines (289 loc) · 11.9 KB
/
action.yml
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
name: Sitemap Creator Stable
description: GitHub Action 🚀 for creating and updating sitemaps in your repository.
author: 鸭鸭「カモ」(@DuckDuckStudio)
branding:
color: yellow
icon: book
keywords:
[
'sitemap',
'website',
'seo',
'creator',
'updater',
'generator',
'urls'
]
inputs:
location:
required: false
description: 网站地图的存放位置 (例如 docs/sitemap.xml)
default: "./sitemap.xml"
token:
required: false
description: 用于创建更新网站地图的拉取请求的 Token (不指定则使用 github.token)
default: ${{ github.token }}
timezone:
required: false
description: 设置生成时使用的时区 (不指定则使用 Asia/Shanghai (UTF+8))
default: "Asia/Shanghai"
basic_link:
required: false
description: 指向你网站的基础链接 (不指定则使用 GitHub Page 链接, 结尾不要带 / )
default: https://${{ github.event.repository.owner.login }}.github.io/${{ github.event.repository.name }}
file_type:
required: false
description: 网页文件的类型 (例如使用 docsify 部署的就是 md,可指定多个类型)
default: "html,md"
ignore_file:
required: false
description: 指定哪些文件不包含在网站地图中
default: "啥都没有" # 应该不会有人要这个,留空会忽略所有文件
website_path:
required: true
description: 你的网站内容的位置 (例如 . (根目录) 或 docs)
default: "./"
base_branch:
required: false
description: 仓库主分支 (main,master 等)
default: main
debug:
required: false
description: 控制调试输出的开关
default: false
label:
required: false
description: 创建拉取请求时添加的标签
auto_merge:
required: false
description: 设置启用自动合并的类型 (不指定则不启用自动合并,可以使用 merge、rebase、squash)
update:
required: false
description: 指定更新网站地图的方式 (直接提交或拉取请求)
default: 拉取请求
reviewer:
required: false
description: 创建拉取请求时指定的审查者
runs:
using: composite
steps:
- name: 检出仓库
uses: actions/checkout@v4
with:
fetch-depth: 0 # 检出完整记录
- name: 设置 Node.js 环境
uses: actions/setup-node@v4
with:
node-version: "latest"
- name: 设置时区
shell: bash
run: sudo timedatectl set-timezone ${{ inputs.timezone }}
- name: 创建 Sitemap
shell: bash
env:
LOCATION: ${{ inputs.location }}
BASIC_LINK: ${{ inputs.basic_link }}
FILE_TYPE: ${{ inputs.file_type }}
IGNORE_FILE: ${{ inputs.ignore_file }}
WEBSITE_PATH: ${{ inputs.website_path }}
DEBUG: ${{ inputs.debug }}
run: |
# 获取生成脚本
git clone https://github.com/DuckDuckStudio/Sitemap_Creator -b main # 稳定版
cp Sitemap_Creator/generate-sitemap.mjs Sitemap_Creator.mjs
rm -r Sitemap_Creator
# 生成网站地图
node Sitemap_Creator.mjs
rm Sitemap_Creator.mjs
- name: 提交并推送 sitemap.xml
shell: bash
env:
GH_TOKEN: ${{ inputs.token }}
LABELS: ${{ inputs.label }}
DEBUG: ${{ inputs.debug }}
AUTO_MERGE: ${{ inputs.auto_merge }}
LOCATION: ${{ inputs.location }}
UPDATE: ${{ inputs.update }}
REVIEWER: ${{ inputs.reviewer }}
TOKEN: ${{ github.token }}
run: |
# 后面都要用的
# 获取当前日期和时间
DATE_TIME=$(date '+%Y/%m/%d %H:%M')
# 参数处理
# 格式化更新方式 - 默认 PR
UPDATE_WAY=$(echo "$UPDATE" | tr '[:upper:]' '[:lower:]' | sed "s/[\"\'\`-]//g; s/[[:space:]]//g")
# 根据输入值设置对应的更新方式
case "$UPDATE_WAY" in
"pr"|"pullrequest"|"pullrequests"|"prs"|"拉取请求")
UPDATE_WAY="PR"
if [[ "$DEBUG" ]]; then
echo "[DEBUG] 更新方式: 创建拉取请求"
fi
# 如果 AUTO_MERGE 为空字符串,则不做任何操作
if [[ -z "$AUTO_MERGE" ]]; then
if [[ "$DEBUG" ]]; then
echo "[DEBUG] 不启用自动合并,因为自动合并方式为空"
fi
CLEAN_AUTO_MERGE=""
else
# 格式化自动合并方式
CLEAN_AUTO_MERGE=$(echo "$AUTO_MERGE" | tr '[:upper:]' '[:lower:]' | sed "s/[\"\'\`-]//g")
case "$CLEAN_AUTO_MERGE" in
"s"|"squash"|"压缩"|"压缩合并"|"压缩自动合并")
CLEAN_AUTO_MERGE="squash"
;;
"m"|"merge"|"合并"|"合并提交"|"提交")
CLEAN_AUTO_MERGE="merge"
;;
"r"|"rebase"|"变基"|"变基合并"|"变基自动合并")
CLEAN_AUTO_MERGE="rebase"
;;
*)
echo "[ERROR] 未知的自动合并方式: $AUTO_MERGE"
echo "[TIP] 可用的自动合并方式: 压缩、合并、变基"
exit 1
;;
esac
fi
if [[ ("$AUTO_MERGE" != "$CLEAN_AUTO_MERGE") && ("$DEBUG") ]]; then
echo "[DEBUG] 已格式化自动合并方式: $AUTO_MERGE -> $CLEAN_AUTO_MERGE"
fi
# 格式化标签
CLEAN_LABELS=$(echo "$LABELS" | sed "s/[\"\'\`]*//g")
if [[ ("$LABELS" != "$CLEAN_LABELS") && ("$DEBUG") ]]; then
echo "[DEBUG] 标签包含特殊字符,已移除: $LABELS -> $CLEAN_LABELS"
fi
# 校验审查者
CLEAN_REVIEWER=$(echo "$REVIEWER" | sed "s/[\"\'\`]*//g")
if [[ ("$REVIEWER" != "$CLEAN_REVIEWER") && ("$DEBUG") ]]; then
echo "[DEBUG] 审查者信息包含特殊字符,已移除: $REVIEWER -> $CLEAN_REVIEWER"
fi
if [[ -n $CLEAN_REVIEWER ]]; then
IFS=',' read -r -a reviewers <<< "$CLEAN_REVIEWER"
# 遍历每个用户名并检查是否是协作者
for reviewer in "${reviewers[@]}"; do
# 使用 curl 发送请求,获取协作者信息
response=$(curl -s -w "%{http_code}" -o response.json \
-H "Authorization: token $TOKEN" \
"https://api.github.com/repos/${{ github.repository }}/collaborators")
# 获取响应的状态码
status_code=$(tail -n1 <<< "$response")
# 处理不同的 HTTP 状态码
case $status_code in
200|201)
# 请求成功,检查是否有该审查者
if ! jq -e ".[] | select(.login == \"$reviewer\")" response.json > /dev/null; then
echo "[ERROR] $reviewer 不是仓库的协作者"
if [[ "$DEBUG" ]]; then
echo "[DEBUG] GitHub API 请求返回:"
while IFS= read -r line; do
echo "[DEBUG] $line"
done < response.json
exit 1
fi
elif [[ "$DEBUG" ]]; then
echo "[DEBUG] 审查者 $reviewer 鉴权成功"
fi
;;
401)
echo "[ERROR] 验证审查者时出错: 鉴权失败 (401):"
while IFS= read -r line; do
echo "[DEBUG] $line"
done < response.json
exit 1
;;
403)
echo "[ERROR] 验证审查者时出错: 没有权限或达到速率限制 (403)"
while IFS= read -r line; do
echo "[DEBUG] $line"
done < response.json
exit 1
;;
404)
echo "[ERROR] 验证审查者时出错: 没有权限或仓库不存在 (404)"
while IFS= read -r line; do
echo "[DEBUG] $line"
done < response.json
exit 1
;;
*)
echo "[ERROR] 验证审查者时出错: 未命中的非成功状态码 ($status_code)"
while IFS= read -r line; do
echo "[DEBUG] $line"
done < response.json
exit 1
;;
esac
done
fi
# 签出分支
BRANCH_NAME="sitemap-update-$(date +%Y%m%d%H%M%S)"
git checkout -b $BRANCH_NAME
echo "[INFO] 已创建新分支: $BRANCH_NAME"
# 生成工作流 URL
WORKFLOW_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
;;
"commit"|"提交"|"直接提交"|"directcommit"|"commitdirectly")
UPDATE_WAY="Commit"
if [[ "$DEBUG" ]]; then
echo "[DEBUG] 更新方式: 直接提交到主分支"
fi
# 不得同时使用的参数
params=("LABELS" "AUTO_MERGE")
# 遍历参数名称数组,检查冲突
for param_name in "${params[@]}"; do
param_value="${!param_name}"
if [[ -n "$param_value" ]]; then
echo "[ERROR] 错误的参数传递"
echo "[TIP] $param_name 参数不得与更新方式“提交”共存"
exit 1
fi
done
;;
*)
echo "[ERROR] 未知的更新方式: $AUTO_MERGE"
echo "[TIP] 可用的更新方式: 提交、拉取请求"
exit 1
;;
esac
# 前面做完都要做的
# 配置 Git 用户
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
# 提交并推送 sitemap.xml
git add "$LOCATION"
git commit -m "[${DATE_TIME}] 自动更新网站地图"
git config --global push.autoSetupRemote true
git push
# 拉取请求更新后续还要做的
if [[ "$UPDATE_WAY" == "PR" ]]; then
# 创建拉取请求
PR_URL=$(gh pr create --title "[${DATE_TIME}] 自动更新网站地图" \
--body "此拉取请求通过 [工作流](${WORKFLOW_URL}) 使用 [Sitemap Creator](https://github.com/DuckDuckStudio/Sitemap_Creator) 创建。" \
--base ${{ inputs.base_branch }} \
--head $BRANCH_NAME)
echo "[INFO] 已创建拉取请求: $PR_URL"
# 判断是否有清理后的标签并添加到 PR
if [[ -n "$CLEAN_LABELS" ]]; then
gh pr edit "$PR_URL" --add-label "$CLEAN_LABELS"
echo "[INFO] 已为创建的拉取请求添加标签: $CLEAN_LABELS"
elif [[ "$DEBUG" ]]; then
echo "[DEBUG] 没有有效标签,跳过添加标签"
fi
# 判断是否有清理后的审查者并添加到 PR
if [[ -n "$CLEAN_REVIEWER" ]]; then
gh pr edit "$PR_URL" --add-reviewer "$CLEAN_REVIEWER"
echo "[INFO] 已为创建的拉取请求添加审查者: $CLEAN_REVIEWER"
elif [[ "$DEBUG" ]]; then
echo "[DEBUG] 没有有效审查者,跳过添加审查者"
fi
# 判断是否启用自动合并
# 如果 CLEAN_AUTO_MERGE 有值(即设置了自动合并方式),进行后续处理
if [[ -n "$CLEAN_AUTO_MERGE" ]]; then
gh pr merge "$PR_URL" --$CLEAN_AUTO_MERGE --auto
echo "[INFO] 已为拉取请求启用 $CLEAN_AUTO_MERGE 合并"
elif [[ "$DEBUG" ]]; then
echo "[DEBUG] 没有有效自动合并方式,跳过启用自动合并"
fi
fi