⚙️ 配置 GitHub Actions 每周自动更新
中级 · 15 分钟 · 2026-08-16
1. 创建 workflow 文件
仓库根目录已经有 .github/workflows/update-data.yml。如果你 fork 了一份,先看下:
.github/workflows/update-data.yml 2. 完整 workflow 代码
name: Update DSH Radar data
on:
# 每周一 UTC 02:00(北京时间 10:00)自动跑
schedule:
- cron: '0 2 * * 1'
# 允许手动触发(Actions → Run workflow)
workflow_dispatch:
# 脚本改动时也触发(方便调试)
push:
paths:
- 'scripts/**'
jobs:
build-data:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Cache npm + GitHub data
uses: actions/cache@v4
with:
path: |
~/.npm
data/.cache
key: cache-${{ runner.os }}-${{ hashFiles('scripts/**') }}
restore-keys: |
cache-${{ runner.os }}-
- name: Fetch + score plugins
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
LIMIT: '0' # 0 = 全量 711;初次试跑可设 100
run: node scripts/build-data.mjs
- name: Build search index
run: node scripts/build-search-index.mjs
- name: Build changelog
run: node scripts/build-changelog.mjs
- name: Build authors index
run: node scripts/build-authors.mjs
- name: Commit updated data
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: 'data: refresh plugin scores [skip ci]'
file_pattern: 'data/**'
build-web:
needs: build-data
runs-on: ubuntu-latest
# deploy-pages@v4 必须要这三个权限,少一个就是 Permission denied
permissions:
contents: read
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
# 注意:要拉上一个 job 刚提交的最新数据
- uses: actions/checkout@v4
with:
ref: main
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
cache-dependency-path: web/pnpm-lock.yaml
- name: Install + build web
working-directory: web
run: |
pnpm install --frozen-lockfile
pnpm build
- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v3
with:
path: web/dist
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4 3. 步骤拆解
这套 workflow 分成两个 job,六个关键步骤,各自负责一件事:
| 步骤 | 干什么 | 耗时 |
|---|---|---|
| ① checkout | 把仓库拉到 runner。build-web 里要指定 ref: main,否则拿不到上一个 job 刚提交的新数据 | ~5s |
| ② setup-node | 装 Node 22。抓数据脚本零依赖,只需要内置 fetch(Node ≥ 18) | ~10s |
| ③ cache | 缓存 data/.cache(npm metadata + GitHub 响应),二次跑省掉绝大部分网络请求 | ~5s |
| ④ build-data | build-data.mjs 抓包 + 算 5 维分 + 写 data/,再跑 search-index / changelog / authors 三个衍生脚本,最后自动 commit | 2-25min |
| ⑤ build-web | pnpm build 把 data/*.json 编译进 Astro 静态站,产物在 web/dist/ | ~60s |
| ⑥ deploy | upload-pages-artifact 打包 web/dist,deploy-pages 发布到 Pages 环境 | ~30s |
两个 job 用 needs: build-data 串起来:数据没抓完就不会 build 站点,
避免把半截数据推上线。commit message 里的 [skip ci] 则防止自动提交再次触发 workflow 造成死循环。
4. 配置 secrets
GitHub Actions 里需要这些 secrets。仓库 → Settings → Secrets and variables → Actions → New repository secret:
| Secret 名 | 值 | 必需? |
|---|---|---|
| GITHUB_TOKEN | 自动提供 | ✅ 必需 |
| PUBLIC_WEB3FORMS_KEY | 你的 web3forms access_key | ⚪ 可选(不填则表单回退 mailto) |
GITHUB_TOKEN 是 GitHub Actions 自动提供的,不用手动设。
它让你的 build 能调 5000 次/小时 GitHub API(vs 60 次/小时未认证)。
5. cron 语法速查
GitHub Actions 的 cron 是 UTC 时区:
┌──────── 分钟 (0 - 59)
│ ┌───── 小时 (0 - 23, UTC)
│ │ ┌── 日 (1 - 31)
│ │ │ ┌─ 月 (1 - 12)
│ │ │ │ ┌ 周 (0 - 7, 0 和 7 都是周日)
│ │ │ │ │
* * * * *
# 常见例子:
'0 2 * * 1' # 每周一 02:00 UTC = 北京周一 10:00(本项目默认)
'0 0 * * 0' # 每周日 00:00 UTC
'0 14 * * *' # 每天 14:00 UTC
'0 */6 * * *' # 每 6 小时一次 ⚠️ GitHub Actions 的定时 schedule 有时延迟(10-30 分钟),不要用来做精确任务。
6. 启用 GitHub Pages
- 仓库 → Settings → Pages
- Source: GitHub Actions(不是 "Deploy from a branch")
- 保存
- 第一次跑 workflow 后会自动创建 Pages 环境
7. 手动触发测试(workflow_dispatch)
- 仓库 → Actions 标签
- 左侧选 "Update DSH Radar data"
- 右侧 "Run workflow" → 选 main 分支 → Run
- 等 5-30 分钟,看日志
8. 常见故障排查
❌ Rate limit exceeded
GitHub API 限速。解法:确保 workflow 用了 secrets.GITHUB_TOKEN(提供 5000/h 而非 60/h)。
也可以分批跑(设 LIMIT=100 跑几次)。
❌ Build timeout
全量跑 711 个插件 + GitHub 要 ~25 分钟。解法:workflow 里加 timeout-minutes: 30(已加)。
或者用 LIMIT=200 先跑头部。
❌ npm install 失败
多半是 lockfile 与 package.json 不同步,--frozen-lockfile 直接失败。解法:本地跑一次 pnpm install 把 web/pnpm-lock.yaml 提交上去;临时绕过可以去掉 --frozen-lockfile。
❌ Pages 部署失败:Permission denied
两处都要检查。解法 A:Settings → Actions → General → Workflow permissions 设为 "Read and write permissions"。
解法 B:build-web job 里必须带 permissions: pages: write 和 id-token: write,
deploy-pages@v4 靠 OIDC 换取部署凭据,少了 id-token 一定失败。
⚠️ 数据没更新 / 缓存太旧
actions/cache 的 key 是 hashFiles('scripts/**')——只要脚本没改,
就会一直命中同一份 data/.cache,npm metadata 可能是一周前的。
- 想让缓存按周失效:key 里加上周数,例如
cache-${{ runner.os }}-week${{ github.run_number / 7 }} - 想立刻清空:仓库 → Actions → Caches → 手动删除条目,再手动触发一次
- 只是想验证一次全新抓取:改 key 前缀(
cache-v2-...)比删缓存更快
另一个常见误判:数据其实更新了,但 build-web 的 checkout 拿的是旧 commit。
确认它带了 ref: main,否则你会永远部署上一周的 data/。
⚠️ schedule 到点没跑
两个已知行为:一是 GitHub 高峰期排队,延迟 10-30 分钟属正常; 二是仓库连续 60 天没有任何 push,schedule 会被自动停用, 邮件提醒里点一下 re-enable 即可。fork 出来的仓库默认关闭 Actions,也要先手动 Enable。
🎯 优化建议
每周跑一次够用。如果想更频繁,加多个 cron(每小时跑一次头部 100 个插件,weekly 跑全量)。
或者接 GitHub Actions cache 缓存 npm metadata(已配),二次跑只 5-30 秒。