name: Publish to PyPI
on:
push:
tags:
- "v*"
workflow_dispatch:
jobs:
tests:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.11", "3.12", "3.13"]
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Set up uv
uses: astral-sh/setup-uv@v3
with:
enable-cache: true
cache-dependency-glob: "**/uv.lock"
- name: Install dependencies
run: uv sync --extra dev
- name: Run tests
run: uv run pytest
integration:
runs-on: ubuntu-latest
needs: tests
timeout-minutes: 60
environment: Integration
env:
FABRIC_INTEGRATION_TESTS: "1"
FABRIC_TEST_WORKSPACE_NAME: ${{ secrets.FABRIC_TEST_WORKSPACE_NAME }}
FABRIC_TEST_LAKEHOUSE_NAME: ${{ secrets.FABRIC_TEST_LAKEHOUSE_NAME }}
FABRIC_TEST_SQL_DATABASE: ${{ secrets.FABRIC_TEST_SQL_DATABASE }}
FABRIC_TEST_SOURCE_CONNECTION_ID: ${{ secrets.FABRIC_TEST_SOURCE_CONNECTION_ID }}
FABRIC_TEST_SOURCE_TYPE: ${{ secrets.FABRIC_TEST_SOURCE_TYPE }}
FABRIC_TEST_SOURCE_SCHEMA: ${{ secrets.FABRIC_TEST_SOURCE_SCHEMA }}
FABRIC_TEST_SOURCE_TABLE: ${{ secrets.FABRIC_TEST_SOURCE_TABLE }}
FABRIC_TEST_DEST_CONNECTION_ID: ${{ secrets.FABRIC_TEST_DEST_CONNECTION_ID }}
FABRIC_TEST_DEST_TABLE_NAME: ${{ secrets.FABRIC_TEST_DEST_TABLE_NAME }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.13"
- name: Install ODBC driver
run: |
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e ".[dev,sql,telemetry]"
- name: Run integration tests
run: |
pytest -m integration
publish:
needs: [tests, integration]
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Verify tag matches pyproject version
run: |
python - <<'PY'
import os
import sys
import tomllib
tag = os.environ["GITHUB_REF_NAME"]
if tag.startswith("v"):
tag = tag[1:]
with open("pyproject.toml", "rb") as handle:
version = tomllib.load(handle)["project"]["version"]
if tag != version:
print(f"Tag version {tag} does not match pyproject version {version}.")
sys.exit(1)
print(f"Tag version {tag} matches pyproject version {version}.")
PY
- name: Set up uv
uses: astral-sh/setup-uv@v3
with:
enable-cache: true
cache-dependency-glob: "**/uv.lock"
- name: Build package
run: |
uv venv
uv pip install --upgrade build
uv run python -m build
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}