mirror of
https://github.com/kuhyx/wake-alarm.git
synced 2026-11-10 20:27:02 +01:00
- pre-commit: drop the 28 s requirements.txt install (only dependency-freshness among the system hooks needs third-party code: pyyaml, packaging), run pre-commit directly instead of pre-commit/action, and split mypy and pylint into their own matrix jobs with per-group hook-env caches. Same hook set, same SKIP=free-days-interop (the rest group). - Tests: uv with a cached wheel store for requirements.txt (pip took 22 s), -q and -p no:sugar. No -n auto: the suite runs in ~0.5 s and measured ~1.2 s under pytest-xdist. - free-days-interop (the critical path): build the freedays venv with uv instead of venv + pip (12 s). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0188kZdx3bb56QM8JFUnbHuM
72 lines
2.6 KiB
YAML
72 lines
2.6 KiB
YAML
name: pre-commit
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
branches: [main]
|
|
|
|
jobs:
|
|
# mypy and pylint check the whole repo and are the two slowest hooks, so
|
|
# each gets its own runner and the other hooks share a third; the workflow
|
|
# takes as long as the slowest group rather than the sum.
|
|
pre-commit:
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- group: mypy
|
|
hooks: mypy
|
|
skip: ""
|
|
- group: pylint
|
|
hooks: pylint
|
|
skip: ""
|
|
# free-days-interop needs Flutter and the freedays venv; it runs as
|
|
# its own job in python-tests.yml, so skipping it here is not
|
|
# fail-open.
|
|
- group: rest
|
|
hooks: ""
|
|
skip: mypy,pylint,free-days-interop
|
|
name: pre-commit (${{ matrix.group }})
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
# Two hooks here delegate to the shared gates in kuhyx/utils. Without
|
|
# this checkout they exit 1 with "shared gate not found at
|
|
# /home/runner/utils/..." -- which is what this workflow had been doing
|
|
# on every run since those hooks were added.
|
|
- name: Check out the shared gates
|
|
uses: actions/checkout@v4
|
|
with:
|
|
repository: kuhyx/utils
|
|
path: .utils
|
|
- name: Point the delegates at that checkout
|
|
run: echo "UTILS_ROOT=$GITHUB_WORKSPACE/.utils" >> "$GITHUB_ENV"
|
|
|
|
- uses: actions/setup-python@v5
|
|
with:
|
|
python-version: "3.x"
|
|
- uses: astral-sh/setup-uv@v10.2.0
|
|
|
|
# Every hook brings its own environment except the language: system
|
|
# ones; of those only dependency-freshness imports third-party code
|
|
# (pyyaml, packaging). The whole requirements.txt used to be installed
|
|
# here for nothing -- 28 s of a 60 s run.
|
|
- name: Install pre-commit and the system hooks' imports
|
|
run: uv pip install --system pre-commit pyyaml packaging
|
|
|
|
# One cache per group: a shared key would hold whichever group saved
|
|
# first, and the others would rebuild their hook envs on every run. The
|
|
# restore key lets a config change reuse every env whose rev it kept.
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: ~/.cache/pre-commit
|
|
key: pre-commit-${{ matrix.group }}-${{ env.pythonLocation }}-${{ hashFiles('.pre-commit-config.yaml') }}
|
|
restore-keys: pre-commit-${{ matrix.group }}-${{ env.pythonLocation }}-
|
|
|
|
- name: pre-commit run (${{ matrix.group }})
|
|
env:
|
|
SKIP: ${{ matrix.skip }}
|
|
run: pre-commit run ${{ matrix.hooks }} --all-files --show-diff-on-failure --color=always
|