-
Notifications
You must be signed in to change notification settings - Fork 30
145 lines (130 loc) · 6.85 KB
/
sync.yml
File metadata and controls
145 lines (130 loc) · 6.85 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
name: 🌟 GitHub Stars Index同步
on:
# ── 定时触发 ──────────────────────────────────────────────
# 修改下方 cron 表达式以自定义执行频率(UTC 时间)
# 示例:
# "0 2 * * 1" → 每周一 UTC 02:00(北京时间 10:00)
# "0 18 * * *" → 每天 UTC 18:00(北京时间次日 02:00)
# "0 2 1 * *" → 每月 1 日 UTC 02:00
# cron 在线生成器: https://crontab.guru
schedule:
- cron: '18 18 * * *' # ← 在此修改你的定时频率
# ── 手动触发 ──────────────────────────────────────────────
workflow_dispatch:
inputs:
force_rebuild:
description: '强制重新生成所有摘要(重建 JSON 数据集)'
required: false
default: 'false'
type: choice
options:
- 'false'
- 'true'
test_limit:
description: '测试模式:限制处理的项目数量(如填 5 则只处理 5 个新项目,留空不限制)'
required: false
default: ''
type: string
permissions:
contents: write # 允许 Action 提交文件到本仓库
jobs:
sync:
name: 抓取 Stars 并生成摘要
runs-on: ubuntu-latest
timeout-minutes: 120 # 超时保护(Stars 较多时可能耗时长)
steps:
# ── 1. 检出代码 ───────────────────────────────────────
- name: Checkout 仓库
uses: actions/checkout@v4
# ── 2. 设置 Python 环境 ───────────────────────────────
- name: 设置 Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
# ── 3. 安装依赖 ───────────────────────────────────────
- name: 安装依赖
run: pip install -r requirements.txt
# ── 4.1 准备 stars.json(优先 gh-pages,回退 main) ───────────
- name: 准备 stars.json(gh-pages -> main fallback)
id: seed_stars
run: |
set -e
mkdir -p data
tmp_file="$(mktemp)"
git fetch origin gh-pages --depth=1 || true
if git show origin/gh-pages:data/stars.json > "$tmp_file" 2>/dev/null && [ -s "$tmp_file" ]; then
mv "$tmp_file" data/stars.json
echo "✅ 已从 gh-pages 恢复 data/stars.json"
echo "source=gh-pages" >> "$GITHUB_OUTPUT"
elif [ -s data/stars.json ]; then
rm -f "$tmp_file"
echo "✅ 使用 main 分支现有 data/stars.json(首次迁移)"
echo "source=main" >> "$GITHUB_OUTPUT"
else
rm -f "$tmp_file"
echo "ℹ️ 未找到可复用 stars.json,将从空数据开始"
rm -f data/stars.json
echo "source=none" >> "$GITHUB_OUTPUT"
fi
# ── 4. 可选:强制重置数据集 ──────────────────────
- name: 重置数据集(仅在 force_rebuild=true 时执行)
if: github.event.inputs.force_rebuild == 'true'
run: |
echo "⚠️ 强制重建模式:删除现有数据"
rm -rf data/stars.json
# # ── 5a. 首次迁移(main -> gh-pages):仅渲染,避免重新抓取 ───
# - name: 首次迁移仅渲染(不抓取)
# if: steps.seed_stars.outputs.source == 'main'
# env:
# # ── Secrets(机密,加密保存)──
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Actions 自动注入,无需手动添加
# AI_API_KEY: ${{ secrets.AI_API_KEY }} # AI API Key
# VAULT_PAT: ${{ secrets.VAULT_PAT }} # Vault 仓库写权限 PAT(Vault 同步时必填)
# # ── Variables(非机密,明文,在 Settings → Variables 中配置)──
# GH_USERNAME: ${{ vars.GH_USERNAME }} # 要抓取 Stars 的 GitHub 用户名
# AI_BASE_URL: ${{ vars.AI_BASE_URL }} # AI 接口地址
# AI_MODEL: ${{ vars.AI_MODEL }}
# MAX_CONCURRENCY: ${{ vars.MAX_CONCURRENCY }}
# OUTPUT_FILENAME: ${{ vars.OUTPUT_FILENAME }}
# VAULT_SYNC_ENABLED: ${{ vars.VAULT_SYNC_ENABLED }}
# VAULT_REPO: ${{ vars.VAULT_REPO }}
# VAULT_SYNC_PATH: ${{ vars.VAULT_SYNC_PATH }}
# TEST_LIMIT: ${{ github.event.inputs.test_limit }}
# PAGES_SYNC_ENABLED: ${{ vars.PAGES_SYNC_ENABLED }}
# run: python scripts/sync_stars.py --render-only
# ── 5b. 常规模式:正常同步(增量抓取) ─────────────────────
- name: 同步 GitHub Stars
env:
# ── Secrets(机密,加密保存)──
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Actions 自动注入,无需手动添加
AI_API_KEY: ${{ secrets.AI_API_KEY }} # AI API Key
VAULT_PAT: ${{ secrets.VAULT_PAT }} # Vault 仓库写权限 PAT(Vault 同步时必填)
# ── Variables(非机密,明文,在 Settings → Variables 中配置)──
GH_USERNAME: ${{ vars.GH_USERNAME }} # 要抓取 Stars 的 GitHub 用户名
AI_BASE_URL: ${{ vars.AI_BASE_URL }} # AI 接口地址
AI_MODEL: ${{ vars.AI_MODEL }}
MAX_CONCURRENCY: ${{ vars.MAX_CONCURRENCY }}
OUTPUT_FILENAME: ${{ vars.OUTPUT_FILENAME }}
VAULT_SYNC_ENABLED: ${{ vars.VAULT_SYNC_ENABLED }}
VAULT_REPO: ${{ vars.VAULT_REPO }}
VAULT_SYNC_PATH: ${{ vars.VAULT_SYNC_PATH }}
TEST_LIMIT: ${{ github.event.inputs.test_limit }}
PAGES_SYNC_ENABLED: ${{ vars.PAGES_SYNC_ENABLED }}
run: python scripts/sync_stars.py
# ── 6. 准备 Pages 发布内容(包含 stars.json) ─────────────
- name: 准备 gh-pages 发布目录
run: |
set -e
test -s data/stars.json || { echo "❌ 未找到有效 data/stars.json"; exit 1; }
mkdir -p dist/data
cp data/stars.json dist/data/stars.json
echo "✅ 已写入 dist/data/stars.json(仅发布到 gh-pages,不提交 main)"
# ── 7. 部署到 GitHub Pages ─────────────────────────────
- name: 部署到 GitHub Pages
if: vars.PAGES_SYNC_ENABLED == 'true'
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: dist # 同步 dist 文件夹的内容
branch: gh-pages # 目标分支
clean: true # 保持分支整洁