feat: smart commit for stats - only commit when data actually changes
- Keep detailed stats tables in README - Compare downloads/posts/upvotes before committing - Skip commit if no actual data change (only time updated)
This commit is contained in:
84
.github/workflows/community-stats.yml
vendored
84
.github/workflows/community-stats.yml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# OpenWebUI 社区统计报告自动生成
|
# OpenWebUI 社区统计报告自动生成
|
||||||
# 使用 GitHub Gist 存储动态徽章数据,完全不 commit 到主仓库
|
# 只在统计数据变化时 commit,避免频繁提交
|
||||||
|
|
||||||
name: Community Stats
|
name: Community Stats
|
||||||
|
|
||||||
@@ -10,6 +10,9 @@ on:
|
|||||||
# 手动触发
|
# 手动触发
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update-stats:
|
update-stats:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -17,6 +20,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
@@ -27,6 +32,23 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
pip install requests python-dotenv
|
pip install requests python-dotenv
|
||||||
|
|
||||||
|
- name: Get previous stats
|
||||||
|
id: prev_stats
|
||||||
|
run: |
|
||||||
|
# 获取当前的统计数据用于比较
|
||||||
|
if [ -f docs/community-stats.json ]; then
|
||||||
|
OLD_DOWNLOADS=$(jq -r '.total_downloads' docs/community-stats.json 2>/dev/null || echo "0")
|
||||||
|
OLD_POSTS=$(jq -r '.total_posts' docs/community-stats.json 2>/dev/null || echo "0")
|
||||||
|
OLD_UPVOTES=$(jq -r '.total_upvotes' docs/community-stats.json 2>/dev/null || echo "0")
|
||||||
|
echo "old_downloads=$OLD_DOWNLOADS" >> $GITHUB_OUTPUT
|
||||||
|
echo "old_posts=$OLD_POSTS" >> $GITHUB_OUTPUT
|
||||||
|
echo "old_upvotes=$OLD_UPVOTES" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "old_downloads=0" >> $GITHUB_OUTPUT
|
||||||
|
echo "old_posts=0" >> $GITHUB_OUTPUT
|
||||||
|
echo "old_upvotes=0" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Generate stats report
|
- name: Generate stats report
|
||||||
env:
|
env:
|
||||||
OPENWEBUI_API_KEY: ${{ secrets.OPENWEBUI_API_KEY }}
|
OPENWEBUI_API_KEY: ${{ secrets.OPENWEBUI_API_KEY }}
|
||||||
@@ -34,45 +56,33 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
python scripts/openwebui_stats.py
|
python scripts/openwebui_stats.py
|
||||||
|
|
||||||
- name: Upload badges to Gist
|
- name: Check for significant changes
|
||||||
env:
|
id: check_changes
|
||||||
GIST_TOKEN: ${{ secrets.GIST_TOKEN }}
|
|
||||||
GIST_ID: ${{ secrets.GIST_ID }}
|
|
||||||
run: |
|
run: |
|
||||||
if [ -z "$GIST_TOKEN" ] || [ -z "$GIST_ID" ]; then
|
# 获取新的统计数据
|
||||||
echo "⚠️ GIST_TOKEN or GIST_ID not set, skipping Gist upload"
|
NEW_DOWNLOADS=$(jq -r '.total_downloads' docs/community-stats.json 2>/dev/null || echo "0")
|
||||||
exit 0
|
NEW_POSTS=$(jq -r '.total_posts' docs/community-stats.json 2>/dev/null || echo "0")
|
||||||
fi
|
NEW_UPVOTES=$(jq -r '.total_upvotes' docs/community-stats.json 2>/dev/null || echo "0")
|
||||||
|
|
||||||
echo "📤 Uploading badges to Gist..."
|
echo "📊 Previous: ${{ steps.prev_stats.outputs.old_downloads }} downloads, ${{ steps.prev_stats.outputs.old_posts }} posts, ${{ steps.prev_stats.outputs.old_upvotes }} upvotes"
|
||||||
|
echo "📊 Current: $NEW_DOWNLOADS downloads, $NEW_POSTS posts, $NEW_UPVOTES upvotes"
|
||||||
|
|
||||||
# Build JSON payload with all badge files
|
# 比较是否有变化
|
||||||
files_json="{"
|
if [ "$NEW_DOWNLOADS" != "${{ steps.prev_stats.outputs.old_downloads }}" ] || \
|
||||||
first=true
|
[ "$NEW_POSTS" != "${{ steps.prev_stats.outputs.old_posts }}" ] || \
|
||||||
for badge in docs/badges/*.json; do
|
[ "$NEW_UPVOTES" != "${{ steps.prev_stats.outputs.old_upvotes }}" ]; then
|
||||||
filename=$(basename "$badge")
|
echo "changed=true" >> $GITHUB_OUTPUT
|
||||||
content=$(cat "$badge" | sed 's/"/\\"/g' | tr -d '\n')
|
echo "✅ Stats changed, will commit"
|
||||||
|
|
||||||
if [ "$first" = true ]; then
|
|
||||||
first=false
|
|
||||||
else
|
else
|
||||||
files_json+=","
|
echo "changed=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "⏭️ No changes, skipping commit"
|
||||||
fi
|
fi
|
||||||
files_json+="\"$filename\":{\"content\":\"$content\"}"
|
|
||||||
done
|
|
||||||
files_json+="}"
|
|
||||||
|
|
||||||
# Update Gist with all files at once
|
- name: Commit and push changes
|
||||||
response=$(curl -s -X PATCH \
|
if: steps.check_changes.outputs.changed == 'true'
|
||||||
-H "Authorization: token $GIST_TOKEN" \
|
run: |
|
||||||
-H "Accept: application/vnd.github+json" \
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
"https://api.github.com/gists/$GIST_ID" \
|
git config --local user.name "github-actions[bot]"
|
||||||
-d "{\"files\":$files_json}")
|
git add docs/community-stats.zh.md docs/community-stats.md docs/community-stats.json README.md README_CN.md
|
||||||
|
git diff --staged --quiet || git commit -m "chore: update community stats $(date +'%Y-%m-%d')"
|
||||||
if echo "$response" | grep -q '"id"'; then
|
git push
|
||||||
echo "✅ Successfully updated Gist: https://gist.github.com/$GIST_ID"
|
|
||||||
else
|
|
||||||
echo "❌ Failed to update Gist"
|
|
||||||
echo "$response"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|||||||
Reference in New Issue
Block a user