Skip to content

ci: disable pytest-timeout plugin on Windows (-p no:timeout) #9

ci: disable pytest-timeout plugin on Windows (-p no:timeout)

ci: disable pytest-timeout plugin on Windows (-p no:timeout) #9

Workflow file for this run

name: autorun CI
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
checks: write
pull-requests: write
issues: read
jobs:
ci:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
python-version: ["3.12", "3.13"]
exclude:
# macOS runners are expensive, so only test on latest Python
- os: macos-latest
python-version: "3.12"
# Windows: skip older Python (same cost-saving pattern as macos)
- os: windows-latest
python-version: "3.12"
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install uv and Python
# setup-uv@v7 is the current recommended version per official uv docs.
# python-version here replaces actions/setup-python -- setup-uv handles both.
# enable-cache speeds up installs by caching the uv cache between runs.
uses: astral-sh/setup-uv@v7
with:
python-version: ${{ matrix.python-version }}
enable-cache: true
- name: Verify Python version
run: |
uv run python --version
echo "Expected: Python ${{ matrix.python-version }}"
- name: Install dependencies
# UV workspace with committed uv.lock -- use --locked to reproduce exact environment.
# --dev installs [dependency-groups] dev from all workspace members (uv-native):
# pytest>=8.4.2, pytest-asyncio>=1.2.0, pytest-cov>=7.0.0, pytest-mock>=3.15.1,
# pytest-timeout>=2.1.0 (plugin pyproject.toml:165-172).
# --all-extras also installs [project.optional-dependencies] extras (compatible pins).
run: uv sync --locked --dev --all-extras
- name: Lint - critical errors only (blocking)
# E9: syntax errors, F63/F7/F82: undefined names/imports -- these always fail CI
run: uvx ruff check --select E9,F63,F7,F82 .
# TODO: enable ruff format --check as a blocking step once the codebase has been
# uniformly formatted. The code was not written with ruff format -- 150 of 153
# files need reformatting. Run `uvx ruff format .` in a dedicated commit when ready.
# Suggested step to uncomment:
# - name: Lint - format check (blocking)
# run: uvx ruff format --check .
- name: Lint - full check (non-blocking)
# Style and other issues reported but do not fail CI
run: uvx ruff check --exit-zero .
- name: Run unit tests
# Run from plugins/autorun/ so pytest discovers plugins/autorun/pyproject.toml
# for asyncio_mode, markers, timeout config (not the workspace root pyproject.toml).
# Tests live at plugins/autorun/tests/ -- running from repo root finds nothing.
# --junitxml uses absolute workspace path so dorny/test-reporter finds the XML.
# Safe subset: excludes tests requiring real tmux sessions, running daemon,
# subprocess spawning, external APIs, or >5s wall-clock time.
# Coverage threshold (fail_under=60) omitted -- calibrated for full suite.
# --timeout=0 on Windows: pytest-timeout thread method sends spurious
# KeyboardInterrupt during session teardown on Windows (all tests pass
# but exit code is 1). Disable timeout on Windows CI as a workaround.
working-directory: plugins/autorun
run: >-
uv run pytest tests/
-m "not tmux and not daemon and not subprocess and not e2e and not interactive and not stress and not race and not slow"
--tb=short -v
--junitxml=${{ github.workspace }}/test_results_${{ matrix.os }}_py${{ matrix.python-version }}.xml
${{ runner.os == 'Windows' && '-p no:timeout' || '' }}
- name: Publish test results
# dorny/test-reporter: 1.1k stars, updated 2026, pure Node.js (no Docker).
# Works on Linux, macOS, and Windows (pure Node.js, no Docker required).
# reporter: java-junit parses the JUnit XML that pytest --junitxml generates.
# fail-on-error: false prevents publishing from independently failing the job.
uses: dorny/test-reporter@v1
if: always()
with:
name: "autorun Tests (${{ matrix.os }}, py${{ matrix.python-version }})"
path: test_results*.xml
reporter: java-junit
fail-on-error: false