5eb6c8d99b
Applies the same fix as test/lint to every workflow that still used actions/setup-python, which the old act_runner engine mishandles: - update-badges: was broken identically to lint — setup-python + pip install hit the image's externally-managed system Python. Drop setup-python, install with --break-system-packages, and use `python3` (not bare `python`) for the coverage steps. - canaries, prd-number: no pip install, so not failing, but they carried the same fragile (and network-heavy) setup-python for stdlib-only work. Removed — the image's system Python 3.12 runs them directly. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UoEZHDjv84ChoZbozQERhJ
79 lines
3.1 KiB
YAML
79 lines
3.1 KiB
YAML
name: Update Quality Badges
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
paths:
|
|
- '**.py'
|
|
- '.coveragerc'
|
|
# The core-coverage badge reads this list; refresh when it changes.
|
|
- 'scripts/critical-modules.txt'
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
update-badges:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
with:
|
|
fetch-depth: 0
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
# No actions/setup-python: the runner image ships Python 3.12 and older
|
|
# act_runner engines mishandle setup-python's PATH. Install into the
|
|
# ephemeral job container's system Python (--break-system-packages is
|
|
# safe because the container is disposable).
|
|
- name: Install dev dependencies
|
|
run: python3 -m pip install --break-system-packages -r requirements-dev.txt
|
|
|
|
- name: Run coverage and extract percentage
|
|
id: coverage
|
|
run: |
|
|
python3 -m coverage run -m unittest discover -t . -s tests/unit > /dev/null 2>&1 || true
|
|
PERCENT=$(python3 -m coverage report 2>/dev/null | grep '^TOTAL' | grep -oP '\d+(?=%)' | tail -1)
|
|
echo "percent=$PERCENT" >> $GITHUB_OUTPUT
|
|
echo "Coverage: $PERCENT%"
|
|
|
|
- name: Extract core (critical-module) coverage percentage
|
|
id: core_coverage
|
|
run: |
|
|
# Reuses the .coverage data from the previous step. The core list is
|
|
# the single source of truth in scripts/critical-modules.txt; every
|
|
# core module is unit-tested, so the unit-only run is accurate for it.
|
|
INCLUDE=$(grep -vE '^[[:space:]]*(#|$)' scripts/critical-modules.txt | paste -sd, -)
|
|
PERCENT=$(python3 -m coverage report --include="$INCLUDE" 2>/dev/null | grep '^TOTAL' | grep -oP '\d+(?=%)' | tail -1)
|
|
echo "percent=$PERCENT" >> $GITHUB_OUTPUT
|
|
echo "Core coverage: $PERCENT%"
|
|
|
|
- name: Update badges in README
|
|
run: |
|
|
COVERAGE_PERCENT="${{ steps.coverage.outputs.percent }}"
|
|
CORE_COVERAGE_PERCENT="${{ steps.core_coverage.outputs.percent }}"
|
|
|
|
if [ -n "$COVERAGE_PERCENT" ]; then
|
|
sed -i "s|/badge/coverage-[^)]*|/badge/coverage-${COVERAGE_PERCENT}%25-brightgreen|" README.md
|
|
fi
|
|
if [ -n "$CORE_COVERAGE_PERCENT" ]; then
|
|
sed -i "s|/badge/core%20coverage-[^)]*|/badge/core%20coverage-${CORE_COVERAGE_PERCENT}%25-brightgreen|" README.md
|
|
fi
|
|
|
|
echo "Updated badges:"
|
|
grep -E "coverage" README.md | head -2
|
|
|
|
- name: Commit and push badge updates
|
|
run: |
|
|
git config --local user.email "action@gitea.local"
|
|
git config --local user.name "Quality Badge Bot"
|
|
|
|
# Check if there are changes
|
|
if git diff --quiet README.md; then
|
|
echo "No badge changes needed"
|
|
else
|
|
echo "Badge changes detected, committing..."
|
|
git add README.md
|
|
MSG="chore: update quality badges"$'\n\n'"- Coverage: ${{ steps.coverage.outputs.percent }}%"$'\n'"- Core coverage: ${{ steps.core_coverage.outputs.percent }}%"$'\n\n'"[skip ci]"
|
|
git commit -m "$MSG"
|
|
git push
|
|
fi
|