Repository navigation
ci: repin Ruff workflow to latest central SHA #12
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| branches: [main] | |
| # Cancel in-progress runs when a newer commit is pushed to the same branch | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| contents: read | |
| jobs: | |
| # Central GitHub Actions and gh-aw source validation; Python checks stay local. | |
| automation-validation: | |
| name: Validate GitHub automation | |
| permissions: | |
| contents: read | |
| uses: DevOpsDerek/workflows/.github/workflows/validate-agentic-workflows.yml@dac4b81c298cb3ea6821ea312efa5375f42d5ccb | |
| # Parse a side-effecting script without running it or sending email. | |
| python-syntax: | |
| name: Python syntax (no execution) | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Parse SMTP report script | |
| uses: DevOpsDerek/workflows/.github/actions/check-python-syntax@dac4b81c298cb3ea6821ea312efa5375f42d5ccb | |
| with: | |
| python-version: "3.12.8" | |
| source-path: 06_automation/send_report.py | |
| lint: | |
| name: Lint (ruff) | |
| permissions: | |
| contents: read | |
| uses: DevOpsDerek/workflows/.github/workflows/lint-python-ruff.yml@5ecebff22598835cbf5ccd7bfa07c036cce22ee9 | |
| with: | |
| python-version: "3.12.8" | |
| ruff-version: "0.11.13" | |
| # ── Job 2: Test matrix ─────────────────────────────────────────────────────── | |
| test: | |
| name: Test (Python ${{ matrix.python-version }} / ${{ matrix.os }}) | |
| needs: lint | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false # Run all matrix combinations even if one fails | |
| matrix: | |
| os: [ubuntu-latest, macos-latest] | |
| python-version: ["3.9", "3.11", "3.12"] | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| # Cache pip downloads to speed up subsequent runs | |
| - name: Cache pip | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/pip | |
| key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('requirements*.txt') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pip-${{ matrix.python-version }}- | |
| - name: Install dependencies | |
| run: | | |
| pip install --upgrade pip | |
| pip install -r requirements.txt | |
| pip install -r requirements-dev.txt | |
| - name: Run tests with coverage | |
| run: | | |
| python -m pytest tests/ \ | |
| --tb=short \ | |
| --cov=. \ | |
| --cov-report=term-missing \ | |
| --cov-report=xml | |
| - name: Upload coverage report | |
| # Only upload from one matrix entry to avoid duplicates | |
| if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: coverage-report | |
| path: coverage.xml | |
| # ── Job 3: Exercise smoke test ─────────────────────────────────────────────── | |
| exercises: | |
| name: Exercise solutions (Python ${{ matrix.python-version }}) | |
| needs: lint | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ["3.9", "3.12"] | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Install dependencies | |
| run: | | |
| pip install --upgrade pip | |
| pip install -r requirements.txt | |
| pip install -r requirements-dev.txt | |
| - name: Run exercise solution tests only | |
| run: | | |
| python -m pytest tests/test_exercises.py -v --tb=short |