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.
72 lines
2.2 KiB
YAML
72 lines
2.2 KiB
YAML
name: nightly-full-pytest
|
||
|
||
# Nightly FULL lane — complete non-quarantine suite including the slow registry.
|
||
#
|
||
# Marker: -m "not quarantine"
|
||
# Includes soak / bench / proof / register-matrix (SLOW_FILES + SLOW_TESTS).
|
||
# Intentionally off the PR and post-merge critical path so a single 2-vCPU
|
||
# Act runner is not held for 1–2h after every main push (see docs/ci-optimization.md).
|
||
#
|
||
# Risk owned here: a main merge can break slow tests until the next nightly
|
||
# (or a manual workflow_dispatch). Treat red nightlies as release-blocking
|
||
# debt; re-run via Actions → nightly-full-pytest → Run workflow after fixes.
|
||
#
|
||
# See docs/testing-lanes.md for the full CI policy.
|
||
|
||
on:
|
||
schedule:
|
||
# 02:00 UTC daily — off peak for human PR iteration.
|
||
- cron: '0 2 * * *'
|
||
workflow_dispatch:
|
||
|
||
permissions:
|
||
contents: read
|
||
|
||
concurrency:
|
||
group: nightly-full-pytest
|
||
cancel-in-progress: false
|
||
|
||
jobs:
|
||
pytest:
|
||
name: full pytest (-m "not quarantine" -n 2)
|
||
runs-on: ubuntu-latest
|
||
# Full suite parallel floor includes ~16 min phase2 fixture; thrashing on a
|
||
# 2-vCPU Act host has been observed well past 60 min. Prefer a red timeout
|
||
# only after a genuine hang, not under normal soak load.
|
||
timeout-minutes: 120
|
||
|
||
steps:
|
||
- name: checkout
|
||
uses: actions/checkout@v4
|
||
with:
|
||
fetch-depth: 1
|
||
ref: main
|
||
|
||
- 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, full suite, quarantine excluded)
|
||
env:
|
||
PYTHONPATH: ${{ github.workspace }}
|
||
CORE_SHOWCASE_SKIP_BUDGET: "1"
|
||
run: |
|
||
uv run pytest -m "not quarantine" -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.')
|
||
"
|