v3.0.11 #185
Workflow file for this run
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/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 |