# Comprehensive CI workflow with uv # .github/workflows/ci.yml name: CI on: push: branches: [main, develop] pull_request: branches: [main] env: UV_SYSTEM_PYTHON: 1 # Optional: use system Python jobs: # Linting and formatting lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install uv uses: astral-sh/setup-uv@v6 with: version: "0.9.5" enable-cache: true - name: Set up Python run: uv python install 3.11 - name: Install dependencies run: uv sync --frozen --all-extras - name: Run ruff (linter) run: uv run ruff check . - name: Run ruff (formatter) run: uv run ruff format --check . - name: Run mypy (type checker) run: uv run mypy src/ # Test matrix across multiple Python versions test: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] python-version: ["3.11", "3.12"] steps: - uses: actions/checkout@v4 - name: Install uv uses: astral-sh/setup-uv@v6 with: enable-cache: true cache-dependency-glob: "uv.lock" - name: Set up Python ${{ matrix.python-version }} run: uv python install ${{ matrix.python-version }} - name: Install dependencies run: uv sync --frozen --all-extras - name: Run tests run: uv run pytest --cov --cov-report=xml - name: Upload coverage if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11' uses: codecov/codecov-action@v3 with: file: ./coverage.xml # Build and verify package build: runs-on: ubuntu-latest needs: [lint, test] steps: - uses: actions/checkout@v4 - name: Install uv uses: astral-sh/setup-uv@v6 - name: Set up Python run: uv python install 3.11 - name: Build package run: uv build - name: Check package metadata run: uv run twine check dist/* - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: dist path: dist/ # Optional: Publish to PyPI (on release tags) publish: if: startsWith(github.ref, 'refs/tags/v') needs: [build] runs-on: ubuntu-latest permissions: id-token: write # Required for trusted publishing steps: - uses: actions/checkout@v4 - name: Download artifacts uses: actions/download-artifact@v4 with: name: dist path: dist/ - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: packages-dir: dist/