mirror of
https://github.com/lancedb/lancedb.git
synced 2026-10-15 16:22:27 +00:00
## Summary The Python wheel builds used different protoc versions: v24.4 on Linux, v21.12 on Windows, and whatever Homebrew shipped on macOS. None of them verified the download. A new composite action, `.github/actions/setup-protoc`, now holds one pin, v36.2, with a SHA-256 for each platform's zip. - macOS and Windows: the action downloads protoc, checks its hash, and installs it. - Linux: protoc has to be installed inside the manylinux container, so the build reads the version and hash from the action's outputs and checks the hash there. protobuf does not publish checksum files for protoc. The pinned hashes are the digests GitHub recorded for the v36.2 release assets. Older releases such as v24.4 have none, which is why this moves to v36.2. protoc only runs at build time, through `prost-build` in the Lance crates. The Linux protoc binary is statically linked, so it runs in the manylinux 2_17 container. The action is also added to the path triggers of `pypi-publish.yml` and `python.yml`, so a change to the pin runs the wheel builds. Follow-up to https://github.com/lancedb/lancedb/pull/4522#issuecomment-6160848344. The sdist job in that PR can use the same action once this merges. ## Evidence Running the action's install script locally on linux-aarch_64 installs `libprotoc 36.2`, and a wrong hash fails with `protoc checksum mismatch`. `cargo check -p lancedb` with `PROTOC` set to protoc 36.2 builds the Lance protos. The PyPI Publish dry run on this PR covers the Linux, macOS and Windows builds. ## Merge Risk **Door:** Two-way. CI only. **Blast Radius:** Python wheel builds. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
268 lines
8.1 KiB
YAML
268 lines
8.1 KiB
YAML
name: Python
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
pull_request:
|
|
paths:
|
|
- Cargo.toml
|
|
- Cargo.lock
|
|
- rust-toolchain.toml
|
|
- python/**
|
|
- rust/**
|
|
- .github/workflows/python.yml
|
|
- .github/workflows/build_linux_wheel/**
|
|
- .github/workflows/build_mac_wheel/**
|
|
- .github/workflows/build_windows_wheel/**
|
|
- .github/actions/setup-protoc/**
|
|
- .github/workflows/run_tests/**
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
env:
|
|
# Color output for pytest is off by default.
|
|
PYTEST_ADDOPTS: "--color=yes"
|
|
FORCE_COLOR: "1"
|
|
PIP_EXTRA_INDEX_URL: "https://pypi.fury.io/lance-format/ https://pypi.fury.io/lancedb/"
|
|
RUST_BACKTRACE: "1"
|
|
|
|
jobs:
|
|
lint:
|
|
name: "Lint"
|
|
timeout-minutes: 30
|
|
runs-on: "ubuntu-22.04"
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
working-directory: python
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 0
|
|
lfs: true
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.13"
|
|
- name: Install ruff
|
|
run: |
|
|
pip install ruff==0.9.9
|
|
- name: Format check
|
|
run: ruff format --check .
|
|
- name: Lint
|
|
run: ruff check .
|
|
|
|
type-check:
|
|
name: "Type Check"
|
|
timeout-minutes: 60
|
|
runs-on: ubuntu-2404-8x-x64
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
working-directory: python
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 0
|
|
lfs: true
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.13"
|
|
- name: Install protobuf compiler
|
|
run: |
|
|
sudo apt update
|
|
sudo apt install -y protobuf-compiler
|
|
pip install toml
|
|
- name: Install dependencies
|
|
run: |
|
|
python ../ci/parse_requirements.py pyproject.toml --extras dev,tests,embeddings > requirements.txt
|
|
pip install -r requirements.txt
|
|
- name: Run pyright
|
|
run: pyright
|
|
|
|
doctest:
|
|
name: "Doctest"
|
|
timeout-minutes: 60
|
|
runs-on: ubuntu-2404-8x-x64
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
working-directory: python
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 0
|
|
lfs: true
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.13"
|
|
cache: "pip"
|
|
- name: Install protobuf
|
|
run: |
|
|
sudo apt update
|
|
sudo apt install -y protobuf-compiler
|
|
# `pip install -e .` builds the extension with maturin, which is most of
|
|
# this job's ~33 minutes. It had no Rust cache, so every dependency was
|
|
# recompiled from scratch on every run.
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
# Restore everywhere, but only save from main. Per-PR saves are
|
|
# unreadable outside their own branch anyway, since GitHub scopes
|
|
# caches to the creating ref.
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- name: Install
|
|
run: |
|
|
pip install --extra-index-url https://pypi.fury.io/lance-format/ --extra-index-url https://pypi.fury.io/lancedb/ -e .[tests,dev,embeddings]
|
|
pip install mlx
|
|
- name: Doctest
|
|
run: pytest --doctest-modules python/lancedb
|
|
linux:
|
|
name: "Linux: python-3.${{ matrix.python-minor-version }}"
|
|
timeout-minutes: 30
|
|
strategy:
|
|
matrix:
|
|
python-minor-version: ["10", "13"]
|
|
runs-on: "ubuntu-24.04"
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
working-directory: python
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 0
|
|
lfs: true
|
|
- name: Install protobuf
|
|
run: |
|
|
sudo apt update
|
|
sudo apt install -y protobuf-compiler
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: 3.${{ matrix.python-minor-version }}
|
|
- uses: ./.github/workflows/build_linux_wheel
|
|
with:
|
|
args: --profile ci
|
|
- uses: ./.github/workflows/run_tests
|
|
with:
|
|
integration: true
|
|
- name: Test without pylance or pandas
|
|
run: |
|
|
pip uninstall -y pylance pandas
|
|
pytest -vv python/tests/test_table.py python/tests/test_namespace_no_pylance.py
|
|
# Make sure wheels are not included in the Rust cache
|
|
- name: Delete wheels
|
|
run: rm -rf target/wheels
|
|
platform:
|
|
name: "Mac"
|
|
timeout-minutes: 30
|
|
runs-on: macos-14
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
working-directory: python
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 0
|
|
lfs: true
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.13"
|
|
# maturin runs cargo natively on macOS (docker is Linux-only), so the host
|
|
# target dir is cacheable. This job had no Rust cache.
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
# Restore everywhere, but only save from main. Per-PR saves are
|
|
# unreadable outside their own branch anyway, since GitHub scopes
|
|
# caches to the creating ref.
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- uses: ./.github/workflows/build_mac_wheel
|
|
with:
|
|
args: --profile ci
|
|
- uses: ./.github/workflows/run_tests
|
|
# Make sure wheels are not included in the Rust cache
|
|
- name: Delete wheels
|
|
run: rm -rf target/wheels
|
|
windows:
|
|
name: "Windows: ${{ matrix.config.name }}"
|
|
timeout-minutes: 60
|
|
strategy:
|
|
matrix:
|
|
config:
|
|
- name: x86
|
|
runner: windows-latest
|
|
runs-on: "${{ matrix.config.runner }}"
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
working-directory: python
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 0
|
|
lfs: true
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.13"
|
|
# maturin runs cargo natively on Windows (docker is Linux-only), so the
|
|
# host target dir is cacheable. This job had no Rust cache at all and so
|
|
# rebuilt every dependency from scratch on every run.
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
# Restore everywhere, but only save from main. The repo sits at
|
|
# GitHub's cache cap, so per-PR saves just evict main's entries.
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- uses: ./.github/workflows/build_windows_wheel
|
|
with:
|
|
args: --profile ci
|
|
- uses: ./.github/workflows/run_tests
|
|
# Make sure wheels are not included in the Rust cache
|
|
- name: Delete wheels
|
|
run: rm -rf target/wheels
|
|
min-deps:
|
|
name: "Minimum dependencies"
|
|
timeout-minutes: 60
|
|
runs-on: "ubuntu-24.04"
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
working-directory: python
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 0
|
|
lfs: true
|
|
- name: Install dependencies
|
|
run: |
|
|
sudo apt update
|
|
sudo apt install -y protobuf-compiler
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.10"
|
|
# As with Doctest, `pip install -e .` compiles the extension and this job
|
|
# had no Rust cache, which is most of its ~37 minutes.
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
# Restore everywhere, but only save from main. Per-PR saves are
|
|
# unreadable outside their own branch anyway, since GitHub scopes
|
|
# caches to the creating ref.
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- name: Install lancedb
|
|
run: |
|
|
pip install "pydantic==2.7.4" "pyarrow==16"
|
|
pip install --extra-index-url https://pypi.fury.io/lance-format/ --extra-index-url https://pypi.fury.io/lancedb/ -e .[tests]
|
|
- name: Run tests
|
|
run: pytest -m "not slow and not s3_test" -x -v --durations=30 python/tests
|