ci(repo-stats): chart container pulls from ghcr.io alongside clones/stars

GHCR exposes total + 30-day daily-pull counts only in the package page
HTML (no REST or GraphQL endpoint). jgehrcke/github-repo-stats has no
notion of container metrics, so post-process the report after it runs.

New: .github/scripts/ghcr_inject.py
- Scrapes Total downloads (exact integer from title="N", not the K-rounded
  display) and the 30-day sparkline (rect data-merge-count, data-date).
- Merges per-day rows into maziggy/bambuddy/ghcr-pulls.csv on gh-pages.
  Fresh window overwrites overlapping dates, so GitHub's late revisions
  to the last 30 days self-correct; days older than 30 stay frozen at
  whatever was captured while still in-window.
- Patches latest-report/report.html: adds a TOC entry, a Container
  pulls (ghcr.io) section at the top, and a Vega-Lite line+point chart
  whose theme/config is cloned from the existing Total clones chart so
  it inherits the report's look-and-feel.
- Bracketed by HTML-comment markers so re-runs replace rather than
  stack (jgehrcke regenerates report.html every tick; we re-inject).
- Hard-fails if either scrape pattern stops matching — silent fallbacks
  would let the chart freeze without notice.

Workflow: after run-ghrs, checkout source + gh-pages, run the injector,
commit only if the diff is non-empty. Uses the existing contents: write
permission; no new secrets.
This commit is contained in:
maziggy
2026-06-29 13:15:41 +02:00
parent 85ee0ef0c8
commit 00534679ae
2 changed files with 363 additions and 0 deletions
+37
View File
@@ -19,3 +19,40 @@ jobs:
repository: maziggy/bambuddy
ghtoken: ${{ secrets.GHRS_GITHUB_API_TOKEN }}
ghpagesprefix: https://maziggy.github.io/bambuddy
# Inject ghcr.io container-download stats (cumulative + 30-day
# sparkline merged into a sidecar CSV so the chart grows beyond
# the 30-day window GHCR exposes). Runs after jgehrcke regenerates
# report.html on gh-pages.
- name: checkout-source
uses: actions/checkout@v4
with:
path: source
- name: checkout-gh-pages
uses: actions/checkout@v4
with:
ref: gh-pages
path: gh-pages
- name: inject-ghcr-pulls
run: |
python3 source/.github/scripts/ghcr_inject.py \
--report gh-pages/maziggy/bambuddy/latest-report/report.html \
--csv gh-pages/maziggy/bambuddy/ghcr-pulls.csv \
--owner maziggy \
--pkg bambuddy
- name: commit-and-push
working-directory: gh-pages
run: |
if [ -z "$(git status --porcelain)" ]; then
echo "no changes — skipping commit"
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add maziggy/bambuddy/latest-report/report.html \
maziggy/bambuddy/ghcr-pulls.csv
git commit -m "ghcr-pulls: refresh container downloads chart"
git push