name: Publish to PyPI
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
run_integration_tests:
description: "Run integration tests"
required: false
type: boolean
default: false
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
if: >-
${{
github.event_name != 'workflow_dispatch' ||
inputs.run_integration_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 }}
FABRIC_TEST_WAREHOUSE_NAME: ${{ secrets.FABRIC_TEST_WAREHOUSE_NAME }}
FABRIC_TEST_SOURCE_SQL_QUERY: ${{ secrets.FABRIC_TEST_SOURCE_SQL_QUERY }}
FABRIC_TEST_SOURCE_SQL_CONNECTION_ID: ${{ secrets.FABRIC_TEST_SOURCE_SQL_CONNECTION_ID }}
FABRIC_TEST_DATAFLOW_NAME: ${{ secrets.FABRIC_TEST_DATAFLOW_NAME }}
FABRIC_TEST_SEMANTIC_MODEL_TABLE: ${{ secrets.FABRIC_TEST_SEMANTIC_MODEL_TABLE }}
FABRIC_TEST_SEMANTIC_MODEL_COLUMNS: ${{ secrets.FABRIC_TEST_SEMANTIC_MODEL_COLUMNS }}
FABRIC_TEST_SEMANTIC_MODEL_TABLE_2: ${{ secrets.FABRIC_TEST_SEMANTIC_MODEL_TABLE_2 }}
FABRIC_TEST_SEMANTIC_MODEL_COLUMNS_2: ${{ secrets.FABRIC_TEST_SEMANTIC_MODEL_COLUMNS_2 }}
FABRIC_TEST_SEMANTIC_MODEL_SCHEMA: ${{ secrets.FABRIC_TEST_SEMANTIC_MODEL_SCHEMA }}
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: 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 --extra sql --extra telemetry
- name: Run integration tests
run: |
uv run pytest -m integration
publish:
needs: [tests, integration]
if: >-
${{
always() &&
needs.tests.result == 'success' &&
(needs.integration.result == 'success' || needs.integration.result == 'skipped')
}}
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
ref_name = os.environ["GITHUB_REF_NAME"]
ref_type = os.environ.get("GITHUB_REF_TYPE", "")
with open("pyproject.toml", "rb") as handle:
version = tomllib.load(handle)["project"]["version"]
if ref_type == "tag":
tag = ref_name[1:] if ref_name.startswith("v") else ref_name
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}.")
sys.exit(0)
if ref_name != "main":
print(
"Publish workflow must run on main when using workflow_dispatch "
f"(got {ref_name})."
)
sys.exit(1)
print(
"Publish workflow running on main (workflow_dispatch). "
f"Using 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 }}