We create a full release of Lance up to every 2 weeks. In between full releases, we make preview releases of the latest features and bug fixes, which are hosted on fury.io. This allows us to release frequently and get feedback on new features while keeping under the PyPI project size limits.
The Lance release process is now automated using bump-my-version to eliminate
manual version updates. The workflow handles version bumping, breaking change
validation, and release creation automatically.
There are three conditions that can trigger a full release:
- There's a bugfix we urgently want to get out to a broad audience
- We want to make a release of LanceDB that requires new features from Lance (LanceDB can't depend on a preview release of Lance)
- It's been two weeks since we last released a full release.
Otherwise, we should make a preview release.
First, make sure the CI on main is green.
Trigger the Create release action with the following parameters:
- release_type: Choose based on changes (patch/minor/major)
- release_channel:
preview - dry_run:
false(usetrueto test first) - draft_release:
true(to review release notes before publishing)
This will create a tag on the current main with format vX.Y.Z-beta.N. After
creating the tag, the action will create a GitHub release for the new tag.
Once that release is published, it will trigger publish jobs for Python.
The action will automatically generate release notes. Please review these and make any necessary edits.
Note
Preview releases are not published to crates.io, since Rust is a source
distribution. Users can simply point to the tag on GitHub in their Cargo.toml.
First, make sure the CI on main is green.
Trigger the Create release action with the following parameters:
- release_type: Choose based on changes (patch/minor/major)
- release_channel:
stable - dry_run:
false(usetrueto test first) - draft_release:
true(to review release notes before publishing)
The workflow will:
- Check for breaking changes automatically
- Update all version numbers using bump-my-version
- Create a commit with the version update
- Create a tag with format
vX.Y.Z - Push both the commit and tag
- Create a GitHub release
The action will automatically generate release notes. Please review these and make any necessary edits.
Once that release is published, it will trigger publish jobs for Rust, Python, and Java.
The release process now uses bump-my-version configured in .bumpversion.toml to:
- Synchronize versions across all Rust crates
- Update Python and Java package versions
- Update all Cargo.lock files automatically
- patch: Bug fixes and minor improvements (0.32.1 → 0.32.2)
- minor: New features or breaking changes (0.32.1 → 0.33.0)
- major: Major breaking changes (0.32.1 → 1.0.0)
The breaking change detection script (scripts/check_breaking_changes.py) will
prevent patch releases when breaking changes are detected.
We try to avoid breaking changes, but sometimes they are necessary. When there
are breaking changes, we will increment the minor version. (This is valid
semantic versioning because we are still in 0.x versions.)
The release workflow automatically detects breaking changes by:
- Analyzing commit messages for breaking change indicators
- Checking for changes in public Rust APIs
- Detecting migration files
When a PR makes a breaking change, the PR author should mark the PR using the
conventional commit markers: either exclamation mark after the type
(such as feat!: change signature of func) or have BREAKING CHANGE in the
body of the PR.
Some things that are considered breaking changes:
- Upgrading a dependency pin that is in the Rust API. In particular, upgrading
DataFusionandArroware breaking changes. Changing dependencies that are not exposed in our public API are not considered breaking changes. - Changing the signature of a public function or method.
- Removing a public function or method.
We do make exceptions for APIs that are marked as experimental. These are APIs
that are under active development and not in major use. These changes should not
receive the breaking-change label.
To test the release process locally:
# Install bump-my-version
pip install bump-my-version
# Test version bumping (dry run)
python ci/bump_version.py patch --dry-run
# Check for breaking changes
python ci/check_breaking_changes.pyIf versions become out of sync:
python ci/bump_version.py patch --no-validateIf a release fails:
- Check the GitHub Actions logs
- Fix any issues
- Re-run with
dry_run: truefirst - Once successful, run with
dry_run: false
If you need to update versions manually:
bump-my-version bump --new-version 0.33.0
cargo update -p lance # Update lock files.bumpversion.toml- Configuration for version managementci/bump_version.py- Version update orchestrationci/check_breaking_changes.py- Breaking change detection.github/workflows/make-release-commit.yml- Main release workflow.github/workflows/bump-version/action.yml- Version bump action