feat: switch to dynamic badges - no more stats commits

- Replace README stats tables with Shields.io dynamic badges
- Badges data stored in GitHub Gist (ID: 7beb87fdc36bf10408282b1db495fe55)
- Workflow only uploads to Gist, never commits to main branch
- Stats refresh hourly via GitHub Actions
This commit is contained in:
fujie
2026-01-08 22:33:46 +08:00
parent 96638d8092
commit 80cf2b5a52
3 changed files with 40 additions and 90 deletions

View File

@@ -1,5 +1,5 @@
# OpenWebUI 社区统计报告自动生成
# 使用 GitHub Gist 存储动态徽章数据,避免频繁 commit
# 使用 GitHub Gist 存储动态徽章数据,完全不 commit 到主仓库
name: Community Stats
@@ -10,9 +10,6 @@ on:
# 手动触发
workflow_dispatch:
permissions:
contents: write
jobs:
update-stats:
runs-on: ubuntu-latest
@@ -20,8 +17,6 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Python
uses: actions/setup-python@v5
@@ -40,57 +35,44 @@ jobs:
python scripts/openwebui_stats.py
- name: Upload badges to Gist
if: ${{ secrets.GIST_TOKEN != '' && secrets.GIST_ID != '' }}
env:
GIST_TOKEN: ${{ secrets.GIST_TOKEN }}
GIST_ID: ${{ secrets.GIST_ID }}
run: |
# Upload each badge JSON to Gist
if [ -z "$GIST_TOKEN" ] || [ -z "$GIST_ID" ]; then
echo "⚠️ GIST_TOKEN or GIST_ID not set, skipping Gist upload"
exit 0
fi
echo "📤 Uploading badges to Gist..."
# Build JSON payload with all badge files
files_json="{"
first=true
for badge in docs/badges/*.json; do
filename=$(basename "$badge")
content=$(cat "$badge" | jq -c '.')
content=$(cat "$badge" | sed 's/"/\\"/g' | tr -d '\n')
# Update Gist file
curl -s -X PATCH \
-H "Authorization: token $GIST_TOKEN" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/gists/$GIST_ID" \
-d "{\"files\":{\"$filename\":{\"content\":$content}}}"
echo "✅ Uploaded $filename to Gist"
if [ "$first" = true ]; then
first=false
else
files_json+=","
fi
files_json+="\"$filename\":{\"content\":\"$content\"}"
done
- name: Check for significant changes
id: check_changes
run: |
# Only commit if there are changes to markdown files (not just time updates)
# This reduces commit frequency by only committing when actual data changes
files_json+="}"
# Get current stats
NEW_DOWNLOADS=$(jq -r '.total_downloads' docs/community-stats.json 2>/dev/null || echo "0")
NEW_POSTS=$(jq -r '.total_posts' docs/community-stats.json 2>/dev/null || echo "0")
# Update Gist with all files at once
response=$(curl -s -X PATCH \
-H "Authorization: token $GIST_TOKEN" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/gists/$GIST_ID" \
-d "{\"files\":$files_json}")
# Get previous stats from git
OLD_DOWNLOADS=$(git show HEAD:docs/community-stats.json 2>/dev/null | jq -r '.total_downloads' 2>/dev/null || echo "0")
OLD_POSTS=$(git show HEAD:docs/community-stats.json 2>/dev/null | jq -r '.total_posts' 2>/dev/null || echo "0")
echo "Previous: $OLD_DOWNLOADS downloads, $OLD_POSTS posts"
echo "Current: $NEW_DOWNLOADS downloads, $NEW_POSTS posts"
# Only mark as changed if downloads or posts count changed
if [ "$NEW_DOWNLOADS" != "$OLD_DOWNLOADS" ] || [ "$NEW_POSTS" != "$OLD_POSTS" ]; then
echo "changed=true" >> $GITHUB_OUTPUT
echo "📊 Stats changed, will commit"
if echo "$response" | grep -q '"id"'; then
echo "✅ Successfully updated Gist: https://gist.github.com/$GIST_ID"
else
echo "changed=false" >> $GITHUB_OUTPUT
echo "⏭️ No significant changes, skipping commit"
echo "❌ Failed to update Gist"
echo "$response"
exit 1
fi
- name: Commit and push changes
if: steps.check_changes.outputs.changed == 'true'
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git add docs/community-stats.zh.md docs/community-stats.md docs/community-stats.json README.md README_CN.md
git commit -m "chore: update community stats $(date +'%Y-%m-%d')"
git push