Skip to content

v3.0.11

v3.0.11 #185

Workflow file for this run

name: CI/CD Pipeline
'on':
pull_request:
push:
tags: ['v*']
env:
LATEST_PYTHON_VERSION: '3.14'
jobs:
lint:
name: Lint (ruff)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: astral-sh/ruff-action@v3
with:
args: "check"
test:
name: Test Python ${{ matrix.python-version }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
needs: lint
strategy:
fail-fast: false
matrix:
os: ['ubuntu-latest', 'macos-latest', 'windows-latest']
python-version: ['3.10', '3.14']
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Set up Python ${{ matrix.python-version }}
run: uv python install ${{ matrix.python-version }}
- name: Install MySQL client libraries (Ubuntu)
if: startsWith(matrix.os, 'ubuntu')
run: sudo apt-get update && sudo apt-get install -y default-libmysqlclient-dev pkg-config
- name: Install MySQL client libraries (macOS)
if: startsWith(matrix.os, 'macos')
run: brew install mysql-client pkg-config
- name: Install dependencies
run: |
uv venv
if [[ '${{ matrix.os }}' == 'windows-latest' ]]; then
# Skip MySQL on Windows - mysqlclient requires C compilation with MySQL headers
uv sync --locked --all-extras --dev --no-install-package mysqlclient --no-install-package aiomysql
elif [[ '${{ matrix.os }}' == 'macos-latest' ]]; then
export PKG_CONFIG_PATH="$(brew --prefix mysql-client)/lib/pkgconfig"
uv sync --locked --all-extras --group dev
else
uv sync --locked --all-extras --group dev
fi
shell: bash
- name: Run tests with coverage
uses: nick-fields/retry@v3
with:
timeout_minutes: 2
max_attempts: 3
command: uv run --no-sync coverage run -m pytest tests/unit && uv run --no-sync coverage report && uv run --no-sync coverage xml
shell: bash
- name: Upload coverage to Codecov
if: matrix.python-version == env.LATEST_PYTHON_VERSION && matrix.os == 'ubuntu-latest'
uses: codecov/codecov-action@v5
- name: Upload test results to Codecov
if: matrix.python-version == env.LATEST_PYTHON_VERSION && matrix.os == 'ubuntu-latest'
uses: codecov/codecov-action@v5
with:
report_type: test_results
integration-test:
name: Integration Tests
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Set up Python ${{ env.LATEST_PYTHON_VERSION }}
run: uv python install ${{ env.LATEST_PYTHON_VERSION }}
- name: Install MySQL client libraries
run: sudo apt-get update && sudo apt-get install -y default-libmysqlclient-dev pkg-config
- name: Install dependencies
run: uv sync --locked --all-extras --group dev
- name: Install ODBC driver for MSSQL
run: |
UBUNTU_VERSION=$(lsb_release -rs)
UBUNTU_CODENAME=$(lsb_release -cs)
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --batch --yes --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/ubuntu/${UBUNTU_VERSION}/prod ${UBUNTU_CODENAME} main" | sudo tee /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
shell: bash
- name: Run integration tests
uses: nick-fields/retry@v3
with:
timeout_minutes: 3
max_attempts: 3
command: uv run --no-sync pytest tests/integration
shell: bash
build:
name: Build Package
runs-on: ubuntu-latest
needs: [test, integration-test]
if: startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Set up Python ${{ env.LATEST_PYTHON_VERSION }}
run: uv python install ${{ env.LATEST_PYTHON_VERSION }}
- name: Build package
run: uv build
- name: Smoke test (wheel)
run: uv run --isolated --no-project --with dist/*.whl tests/smoke_test.py
- name: Smoke test (sdist)
run: uv run --isolated --no-project --with dist/*.tar.gz tests/smoke_test.py
- name: Upload artifacts
uses: actions/upload-artifact@v6
with:
name: python-packages
path: dist/
retention-days: 7
release:
name: Create Release
runs-on: ubuntu-latest
needs: build
if: startsWith(github.ref, 'refs/tags/v')
permissions:
contents: write
steps:
- name: Download artifacts
uses: actions/download-artifact@v7
with:
name: python-packages
path: release-assets/
- name: Create Release
uses: softprops/action-gh-release@v2
with:
name: Release ${{ github.ref_name }}
body: |
Automated release for version ${{ github.ref_name }}
draft: false
prerelease: false
files: release-assets/*
publish:
name: Publish to PyPI
runs-on: ubuntu-latest
needs: release
if: startsWith(github.ref, 'refs/tags/v')
environment: release
permissions:
id-token: write
steps:
- name: Download package artifacts
uses: actions/download-artifact@v7
with:
name: python-packages
path: dist
- name: Publish to TestPyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
repository-url: https://test.pypi.org/legacy/
packages-dir: dist/
skip-existing: true
verbose: true
attestations: false
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: dist/
skip-existing: true
verbose: true
attestations: false