name: CI on: push: branches: [ main ] pull_request: branches: [ main ] # Матрица из двух систем. # # Обе джобы стояли на windows-latest, и это дорого обошлось: инвариант A37 не # держался на Windows, а тесты установки и остановки процессов молча # предполагали Linux. Прогон на одной системе не показывал ни того, ни другого. # Проект работает на Linux и активно получает Linux-правки, поэтому обе системы # проверяются одинаковым набором. jobs: test: name: Clean Runner Test (${{ matrix.os }}) runs-on: ${{ matrix.os }} timeout-minutes: 15 strategy: fail-fast: false matrix: os: [windows-latest, ubuntu-latest] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Python 3.11 uses: actions/setup-python@v5 with: python-version: '3.11' cache: 'pip' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -e ".[dev,web]" - name: Code Quality (ruff) run: | ruff check . - name: Run Hermetic Offline Pytest Suite run: | pytest -v - name: Run Automated Release Gate run: | python scripts/release_gate.py headless: name: Headless Run (${{ matrix.os }}, no GUI dependencies) runs-on: ${{ matrix.os }} timeout-minutes: 15 strategy: fail-fast: false matrix: os: [windows-latest, ubuntu-latest] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Python 3.11 uses: actions/setup-python@v5 with: python-version: '3.11' cache: 'pip' - name: Install dependencies without GUI extras run: | python -m pip install --upgrade pip pip install -e ".[dev,web]" pip uninstall -y customtkinter # A test module importing customtkinter at module scope aborts collection # of the WHOLE session instead of skipping itself, which takes the release # gate down with it. This job fails if that guard is ever dropped again. - name: Suite must skip, not abort, without GUI dependencies run: | pytest -q