Root cause of the simultaneous lane-shas failures on PRs #46 and #47: workflows installed with unlocked 'uv pip install -e .' against floor-only specs (numpy>=1.26, ...) while the repo maintains uv.lock — so a PyPI release landing between runs shifts the runner's resolved set, and the byte-exact lane SHA pins move with it. Timeline: main lane run green at 23:40Z, both PR runs (diffs no lane executes) red after 00:02Z; the identical trees verify 9/9 locally against the locked venv, and 'uv lock --check' is clean. All six workflows now 'uv sync --locked' (--extra dev where [dev] was installed) — CI tests the locked universe, so lane pins can only move when code moves. Locked-sync also fails loudly on a stale lock instead of silently resolving fresh. Self-validating: this PR's own lane-shas run uses this branch's workflow. [Verification]: smoke suite passed locally (175 passed); lane repro on the failing PRs' tree: 9/9 pinned SHAs; uv lock --check clean.
75 lines
2.2 KiB
YAML
75 lines
2.2 KiB
YAML
name: full-pytest
|
|
|
|
# Post-merge FAST lane — runs on every push to main.
|
|
#
|
|
# Marker: -m "not quarantine and not slow"
|
|
# ~9.5k unit/integration tests; excludes the slow registry in conftest.py
|
|
# (soak / bench / proof / register-matrix; ~912 tests including the 16 min
|
|
# phase2 fixture floor).
|
|
#
|
|
# Why "full-pytest" still names this file:
|
|
# Keep the workflow id stable for Forgejo required-check / history matching.
|
|
# The job display name and this comment state the true contract: FAST on main.
|
|
# The complete non-quarantine suite runs in nightly-full-pytest.yml.
|
|
#
|
|
# PR gate: smoke.yml (small critical subset).
|
|
# Lane pins: lane-shas.yml.
|
|
# Full soak: nightly-full-pytest.yml (schedule + workflow_dispatch).
|
|
#
|
|
# See:
|
|
# conftest.py — QUARANTINE + SLOW_FILES / SLOW_TESTS registries
|
|
# docs/testing-lanes.md — lane commands and CI policy (SSoT)
|
|
# docs/ci-optimization.md — runner bottleneck + capacity notes
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: full-pytest-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
pytest:
|
|
name: fast pytest (-m "not quarantine and not slow" -n 2)
|
|
runs-on: ubuntu-latest
|
|
# Headroom over ~9.5 min parallel on a 10-core host; Act 2-vCPU is slower.
|
|
timeout-minutes: 30
|
|
|
|
steps:
|
|
- name: checkout
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 1
|
|
|
|
- name: set up uv
|
|
uses: astral-sh/setup-uv@v5
|
|
with:
|
|
python-version: '3.12.13'
|
|
enable-cache: true
|
|
|
|
- name: install dependencies
|
|
run: |
|
|
uv sync --locked --extra dev
|
|
|
|
- name: pytest (parallel, quarantine and slow excluded)
|
|
env:
|
|
PYTHONPATH: ${{ github.workspace }}
|
|
CORE_SHOWCASE_SKIP_BUDGET: "1"
|
|
run: |
|
|
uv run pytest -m "not quarantine and not slow" -n 2 --tb=short -q --maxfail=10
|
|
|
|
- name: report quarantine size (informational)
|
|
if: always()
|
|
env:
|
|
PYTHONPATH: ${{ github.workspace }}
|
|
run: |
|
|
uv run python -c "
|
|
import sys
|
|
sys.path.insert(0, '.')
|
|
from conftest import QUARANTINE
|
|
print(f'::notice title=Quarantine size::{len(QUARANTINE)} tests currently quarantined. Goal: shrink this number.')
|
|
"
|