From bf15655c83ea4e8a0ac24cb8eb8ac0d3e7446c04 Mon Sep 17 00:00:00 2001 From: Will Jones Date: Sat, 25 Jul 2026 09:22:35 -0700 Subject: [PATCH] chore: unify SDK versions and release tags on a single line (#3714) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Python was versioned and tagged separately from the Rust, Java, and Node.js SDKs, and had drifted three minor versions ahead (0.36 vs 0.33). Users had no way to tell which Python version corresponded to which Rust or Node release, and the gap had no meaning behind it. This unifies the two tracks so there is one version and one tag for all four SDKs. ## Version The shared version is set to `0.37.0-beta.0`. Python continues its own sequence (highest published: 0.36 → 0.37) while Rust, Java, and Node.js jump 0.33 → 0.37 to meet it. Picking Python's next minor means Python users see no discontinuity at all, and only the other SDKs skip forward. Note that `main` trails the `release/v0.32` branch on both lines (main is at 0.32.0-beta.3 / 0.35.0-beta.3; the release branch carries 0.33.0-beta.0 / 0.36.0-beta.0), so 0.37 is chosen to clear the highest tag on either branch. Every index stays monotonic: | index | publishes | last published | next | |---|---|---|---| | PyPI | stable only | 0.34.0 | 0.37.0 | | Fury | previews | 0.36.0b0 | 0.37.0-beta.1 | | npm | both | 0.33.0-beta.0 | 0.37.0-beta.1 | | crates.io | stable only | 0.31.0 | 0.37.0 | | Maven | both | 0.33.0-beta.0 | 0.37.0-beta.1 | A one-time jump for three SDKs, versus explaining the offset indefinitely. ## Mechanism * `python/.bumpversion.toml` is removed. `python/Cargo.toml` — the source of the Python package version, since `pyproject.toml` declares `dynamic = ["version"]` — becomes a tracked file of the root config. Its `cargo update -p lancedb-python` pre-commit hook is dropped as redundant: `ci/update_lockfiles.sh` already refreshes every workspace member version in `Cargo.lock`. * `pypi-publish.yml` triggers on `v*` instead of `python-v*`, so one tag releases all four packages. `ci/bump_version.sh` and `make-release-commit.yml` lose their now-dead tag-prefix and per-language plumbing, including the `python` / `other` dispatch inputs. * The two byte-identical GH release jobs in `npm-publish.yml` and `pypi-publish.yml` are replaced by a single `gh-release.yml`. One release per tag, named `LanceDB vX.Y.Z`, instead of separate "Python LanceDB" and "Node/Rust LanceDB" releases for the same commit. The trade-off: there is no longer a way to ship a Python-only patch without also releasing crates.io, Maven, and npm. That is the cost of making drift structurally impossible. ## Beta releases marked "Latest" (#3666) Both GH release jobs used: ```yaml prerelease: ${{ contains('beta', github.ref) }} ``` The arguments are reversed. `contains(search, item)` asks whether *`search`* contains *`item`*, so this evaluated "does the literal string `'beta'` contain `refs/tags/python-v0.35.0-beta.2`?" — always `false`. Every beta was published as a full release, and GitHub awards "Latest" to the newest non-prerelease. The new workflow derives the flag from the parsed version rather than the raw ref, and sets `make_latest` explicitly: ```yaml prerelease: ${{ steps.extract_version.outputs.prerelease }} make_latest: ${{ steps.extract_version.outputs.prerelease == 'false' }} ``` npm was never affected (`--tag preview` uses correct bash), and PyPI already excludes pre-releases from resolution. This only fixes releases published from here on. Already-published betas need a one-time backfill: ```shell gh api --paginate /repos/lancedb/lancedb/releases \ --jq '.[] | select(.prerelease == false) | select(.tag_name | test("beta")) | .id' \ | xargs -I{} gh api -X PATCH /repos/lancedb/lancedb/releases/{} -F prerelease=true ``` ## Verification Ran `ci/bump_version.sh` end-to-end against this branch with the release tooling installed: * `preview` → tags `v0.37.0-beta.1` (previous tag `v0.33.0-beta.0` detected, `pre_n` bump) * `stable` → tags `v0.37.0` * Both paths update `.bumpversion.toml`, `rust/lancedb/Cargo.toml`, `nodejs/Cargo.toml`, `python/Cargo.toml`, `nodejs/package.json`, the 7 `nodejs/npm/*/package.json` files, both Java poms, and `docs/src/java/java.md` together * `check_breaking_changes.py` resolves the last stable as `v0.31.0`, so the minor-version gate passes All five touched workflows parse as valid YAML and the pre-commit hooks pass. ## Notes for review * This targets `main` only, so it takes effect at the next release-branch cut. The in-flight `release/v0.32` branch still carries `v0.33.0-beta.0` / `python-v0.36.0-beta.0`; if we want the imminent stable to be 0.37.0, this needs to be applied there too. * Historical `python-v*` tags are left alone. The changelog builder scans `^v`, which does not match them, so the first unified release's notes will compute `fromTag` from the Rust/Node line only — a one-time gap in the Python-side changelog. * Pre-existing and not addressed here: `ci/update_lockfiles.sh --amend` amends the commit that `bump-my-version` has already tagged, so the lockfile update lands outside the tag on stable releases. Fixes #3666 --- .bumpversion.toml | 9 ++- .github/workflows/cargo-publish.yml | 1 - .github/workflows/gh-release.yml | 85 +++++++++++++++++++++++ .github/workflows/make-release-commit.yml | 36 ++-------- .github/workflows/npm-publish.yml | 67 ------------------ .github/workflows/pypi-publish.yml | 78 ++------------------- Cargo.lock | 6 +- ci/bump_version.sh | 6 +- docs/src/java/java.md | 2 +- java/lancedb-core/pom.xml | 2 +- java/pom.xml | 2 +- nodejs/Cargo.toml | 2 +- nodejs/npm/darwin-arm64/package.json | 2 +- nodejs/npm/linux-arm64-gnu/package.json | 2 +- nodejs/npm/linux-arm64-musl/package.json | 2 +- nodejs/npm/linux-x64-gnu/package.json | 2 +- nodejs/npm/linux-x64-musl/package.json | 2 +- nodejs/npm/win32-arm64-msvc/package.json | 2 +- nodejs/npm/win32-x64-msvc/package.json | 2 +- nodejs/package-lock.json | 4 +- nodejs/package.json | 2 +- python/.bumpversion.toml | 49 ------------- python/Cargo.toml | 2 +- release_process.md | 46 ++++++------ rust/lancedb/Cargo.toml | 2 +- 25 files changed, 154 insertions(+), 261 deletions(-) create mode 100644 .github/workflows/gh-release.yml delete mode 100644 python/.bumpversion.toml diff --git a/.bumpversion.toml b/.bumpversion.toml index d36c4e158..57bcad5da 100644 --- a/.bumpversion.toml +++ b/.bumpversion.toml @@ -1,5 +1,5 @@ [tool.bumpversion] -current_version = "0.32.0-beta.3" +current_version = "0.37.0-beta.0" parse = """(?x) (?P0|[1-9]\\d*)\\. (?P0|[1-9]\\d*)\\. @@ -75,6 +75,13 @@ filename = "nodejs/Cargo.toml" replace = "\nversion = \"{new_version}\"" search = "\nversion = \"{current_version}\"" +# The Python package takes its version from here (pyproject.toml declares +# `dynamic = ["version"]`, so maturin reads it out of the crate manifest). +[[tool.bumpversion.files]] +filename = "python/Cargo.toml" +replace = "\nversion = \"{new_version}\"" +search = "\nversion = \"{current_version}\"" + # Java documentation [[tool.bumpversion.files]] filename = "docs/src/java/java.md" diff --git a/.github/workflows/cargo-publish.yml b/.github/workflows/cargo-publish.yml index 08f01d9a0..052fb1876 100644 --- a/.github/workflows/cargo-publish.yml +++ b/.github/workflows/cargo-publish.yml @@ -6,7 +6,6 @@ on: # We don't publish pre-releases for Rust. Crates.io is just a source # distribution, so we don't need to publish pre-releases. - "v*-beta*" - - "*-v*" # for example, python-vX.Y.Z env: # This env var is used by Swatinem/rust-cache@v2 for the cache diff --git a/.github/workflows/gh-release.yml b/.github/workflows/gh-release.yml new file mode 100644 index 000000000..683d55d71 --- /dev/null +++ b/.github/workflows/gh-release.yml @@ -0,0 +1,85 @@ +name: GitHub Release + +# All SDKs share one version, so a single `vX.Y.Z` tag produces a single GitHub +# release covering all of them. The per-package publish workflows (PyPI, NPM, +# Cargo, Maven) trigger off the same tag independently. + +on: + push: + tags: + - "v*" + +permissions: + contents: read + +jobs: + gh-release: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + lfs: true + - name: Extract version + id: extract_version + env: + GITHUB_REF: ${{ github.ref }} + run: | + set -e + echo "Extracting tag and version from $GITHUB_REF" + if [[ $GITHUB_REF =~ refs/tags/v(.*) ]]; then + VERSION=${BASH_REMATCH[1]} + TAG=v$VERSION + echo "tag=$TAG" >> $GITHUB_OUTPUT + echo "version=$VERSION" >> $GITHUB_OUTPUT + else + echo "Failed to extract version from $GITHUB_REF" + exit 1 + fi + echo "Extracted version $VERSION from $GITHUB_REF" + if [[ $VERSION =~ beta ]]; then + echo "This is a beta release" + echo "prerelease=true" >> $GITHUB_OUTPUT + + # Get last release (that is not this one) + FROM_TAG=$(git tag --sort='version:refname' \ + | grep ^v \ + | grep -vF "$TAG" \ + | python ci/semver_sort.py v \ + | tail -n 1) + else + echo "This is a stable release" + echo "prerelease=false" >> $GITHUB_OUTPUT + # Get last stable tag (ignore betas) + FROM_TAG=$(git tag --sort='version:refname' \ + | grep ^v \ + | grep -vF "$TAG" \ + | grep -v beta \ + | python ci/semver_sort.py v \ + | tail -n 1) + fi + echo "Found from tag $FROM_TAG" + echo "from_tag=$FROM_TAG" >> $GITHUB_OUTPUT + - name: Create Release Notes + id: release_notes + uses: mikepenz/release-changelog-builder-action@v4 + with: + configuration: .github/release_notes.json + toTag: ${{ steps.extract_version.outputs.tag }} + fromTag: ${{ steps.extract_version.outputs.from_tag }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Create GH release + uses: softprops/action-gh-release@v2 + with: + # Marking betas as pre-releases keeps them from taking the "Latest" + # badge on the releases page. + prerelease: ${{ steps.extract_version.outputs.prerelease }} + make_latest: ${{ steps.extract_version.outputs.prerelease == 'false' }} + tag_name: ${{ steps.extract_version.outputs.tag }} + token: ${{ secrets.GITHUB_TOKEN }} + generate_release_notes: false + name: LanceDB v${{ steps.extract_version.outputs.version }} + body: ${{ steps.release_notes.outputs.changelog }} diff --git a/.github/workflows/make-release-commit.yml b/.github/workflows/make-release-commit.yml index 538c7f486..2ab69ee32 100644 --- a/.github/workflows/make-release-commit.yml +++ b/.github/workflows/make-release-commit.yml @@ -1,13 +1,14 @@ name: Create release commit -# This workflow increments versions, tags the version, and pushes it. +# This workflow increments the version, tags it, and pushes it. All SDKs share +# a single version, so one tag releases all of them. # When a tag is pushed, another workflow is triggered that creates a GH release # and uploads the binaries. This workflow is only for creating the tag. # This script will enforce that a minor version is incremented if there are any -# breaking changes since the last minor increment. However, it isn't able to -# differentiate between breaking changes in Node versus Python. If you wish to -# bypass this check, you can manually increment the version and push the tag. +# breaking changes since the last minor increment. A breaking change in any SDK +# bumps the minor version for all of them. If you wish to bypass this check, you +# can manually increment the version and push the tag. on: workflow_dispatch: inputs: @@ -24,16 +25,6 @@ on: options: - preview - stable - python: - description: 'Make a Python release' - required: true - default: true - type: boolean - other: - description: 'Make a Node/Rust/Java release' - required: true - default: true - type: boolean bump-minor: description: 'Bump minor version' required: true @@ -65,25 +56,12 @@ jobs: run: | git config user.name 'Lance Release' git config user.email 'lance-dev@lancedb.com' - - name: Bump Python version - if: ${{ inputs.python }} - working-directory: python - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Need to get the commit before bumping the version, so we can - # determine if there are breaking changes in the next step as well. - echo "COMMIT_BEFORE_BUMP=$(git rev-parse HEAD)" >> $GITHUB_ENV - - pip install bump-my-version PyGithub packaging - bash ../ci/bump_version.sh ${{ inputs.type }} ${{ inputs.bump-minor }} python-v - - name: Bump Node/Rust version - if: ${{ inputs.other }} + - name: Bump version env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | pip install bump-my-version PyGithub packaging - bash ci/bump_version.sh ${{ inputs.type }} ${{ inputs.bump-minor }} v $COMMIT_BEFORE_BUMP + bash ci/bump_version.sh ${{ inputs.type }} ${{ inputs.bump-minor }} bash ci/update_lockfiles.sh --amend - name: Push new version tag if: ${{ !inputs.dry_run }} diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 5707b085a..8a049ee0f 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -26,73 +26,6 @@ concurrency: cancel-in-progress: true jobs: - gh-release: - if: startsWith(github.ref, 'refs/tags/v') - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/checkout@v6 - with: - fetch-depth: 0 - lfs: true - - name: Extract version - id: extract_version - env: - GITHUB_REF: ${{ github.ref }} - run: | - set -e - echo "Extracting tag and version from $GITHUB_REF" - if [[ $GITHUB_REF =~ refs/tags/v(.*) ]]; then - VERSION=${BASH_REMATCH[1]} - TAG=v$VERSION - echo "tag=$TAG" >> $GITHUB_OUTPUT - echo "version=$VERSION" >> $GITHUB_OUTPUT - else - echo "Failed to extract version from $GITHUB_REF" - exit 1 - fi - echo "Extracted version $VERSION from $GITHUB_REF" - if [[ $VERSION =~ beta ]]; then - echo "This is a beta release" - - # Get last release (that is not this one) - FROM_TAG=$(git tag --sort='version:refname' \ - | grep ^v \ - | grep -vF "$TAG" \ - | python ci/semver_sort.py v \ - | tail -n 1) - else - echo "This is a stable release" - # Get last stable tag (ignore betas) - FROM_TAG=$(git tag --sort='version:refname' \ - | grep ^v \ - | grep -vF "$TAG" \ - | grep -v beta \ - | python ci/semver_sort.py v \ - | tail -n 1) - fi - echo "Found from tag $FROM_TAG" - echo "from_tag=$FROM_TAG" >> $GITHUB_OUTPUT - - name: Create Release Notes - id: release_notes - uses: mikepenz/release-changelog-builder-action@v4 - with: - configuration: .github/release_notes.json - toTag: ${{ steps.extract_version.outputs.tag }} - fromTag: ${{ steps.extract_version.outputs.from_tag }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Create GH release - uses: softprops/action-gh-release@v2 - with: - prerelease: ${{ contains('beta', github.ref) }} - tag_name: ${{ steps.extract_version.outputs.tag }} - token: ${{ secrets.GITHUB_TOKEN }} - generate_release_notes: false - name: Node/Rust LanceDB v${{ steps.extract_version.outputs.version }} - body: ${{ steps.release_notes.outputs.changelog }} - build-lancedb: strategy: fail-fast: false diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml index 720079292..8825e7fb0 100644 --- a/.github/workflows/pypi-publish.yml +++ b/.github/workflows/pypi-publish.yml @@ -3,7 +3,7 @@ name: PyPI Publish on: push: tags: - - 'python-v*' + - 'v*' pull_request: # This should trigger a dry run (we skip the final publish step) paths: @@ -72,7 +72,7 @@ jobs: package-name: ${{ matrix.config.package_name }} rustflags: ${{ matrix.config.rustflags }} - uses: actions/upload-artifact@v7 - if: startsWith(github.ref, 'refs/tags/python-v') + if: startsWith(github.ref, 'refs/tags/v') with: name: wheels-linux-${{ matrix.config.package_name }}-${{ matrix.config.platform }}-${{ matrix.config.manylinux }} path: target/wheels/*.whl @@ -101,7 +101,7 @@ jobs: python-minor-version: 10 args: "--release --strip --target ${{ matrix.config.target }} --features fp16kernels" - uses: actions/upload-artifact@v7 - if: startsWith(github.ref, 'refs/tags/python-v') + if: startsWith(github.ref, 'refs/tags/v') with: name: wheels-mac-${{ matrix.config.target }} path: target/wheels/lancedb-*.whl @@ -127,14 +127,14 @@ jobs: python-minor-version: 10 args: "--release --strip" - uses: actions/upload-artifact@v7 - if: startsWith(github.ref, 'refs/tags/python-v') + if: startsWith(github.ref, 'refs/tags/v') with: name: wheels-windows path: target/wheels/lancedb-*.whl if-no-files-found: error publish: name: Publish wheels - if: startsWith(github.ref, 'refs/tags/python-v') + if: startsWith(github.ref, 'refs/tags/v') needs: [linux, mac, windows] runs-on: ubuntu-latest permissions: @@ -183,72 +183,6 @@ jobs: uses: pypa/gh-action-pypi-publish@release/v1 with: packages-dir: target/wheels/ - gh-release: - if: startsWith(github.ref, 'refs/tags/python-v') - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/checkout@v6 - with: - fetch-depth: 0 - lfs: true - - name: Extract version - id: extract_version - env: - GITHUB_REF: ${{ github.ref }} - run: | - set -e - echo "Extracting tag and version from $GITHUB_REF" - if [[ $GITHUB_REF =~ refs/tags/python-v(.*) ]]; then - VERSION=${BASH_REMATCH[1]} - TAG=python-v$VERSION - echo "tag=$TAG" >> $GITHUB_OUTPUT - echo "version=$VERSION" >> $GITHUB_OUTPUT - else - echo "Failed to extract version from $GITHUB_REF" - exit 1 - fi - echo "Extracted version $VERSION from $GITHUB_REF" - if [[ $VERSION =~ beta ]]; then - echo "This is a beta release" - - # Get last release (that is not this one) - FROM_TAG=$(git tag --sort='version:refname' \ - | grep ^python-v \ - | grep -vF "$TAG" \ - | python ci/semver_sort.py python-v \ - | tail -n 1) - else - echo "This is a stable release" - # Get last stable tag (ignore betas) - FROM_TAG=$(git tag --sort='version:refname' \ - | grep ^python-v \ - | grep -vF "$TAG" \ - | grep -v beta \ - | python ci/semver_sort.py python-v \ - | tail -n 1) - fi - echo "Found from tag $FROM_TAG" - echo "from_tag=$FROM_TAG" >> $GITHUB_OUTPUT - - name: Create Python Release Notes - id: python_release_notes - uses: mikepenz/release-changelog-builder-action@v4 - with: - configuration: .github/release_notes.json - toTag: ${{ steps.extract_version.outputs.tag }} - fromTag: ${{ steps.extract_version.outputs.from_tag }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Create Python GH release - uses: softprops/action-gh-release@v2 - with: - prerelease: ${{ contains('beta', github.ref) }} - tag_name: ${{ steps.extract_version.outputs.tag }} - token: ${{ secrets.GITHUB_TOKEN }} - generate_release_notes: false - name: Python LanceDB v${{ steps.extract_version.outputs.version }} - body: ${{ steps.python_release_notes.outputs.changelog }} report-failure: name: Report Workflow Failure runs-on: ubuntu-latest @@ -256,7 +190,7 @@ jobs: permissions: contents: read issues: write - if: always() && failure() && startsWith(github.ref, 'refs/tags/python-v') + if: always() && failure() && startsWith(github.ref, 'refs/tags/v') steps: - uses: actions/checkout@v6 - uses: ./.github/actions/create-failure-issue diff --git a/Cargo.lock b/Cargo.lock index 26b64d182..f8bde1b00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5378,7 +5378,7 @@ dependencies = [ [[package]] name = "lancedb" -version = "0.32.0-beta.3" +version = "0.37.0-beta.0" dependencies = [ "ahash", "anyhow", @@ -5466,7 +5466,7 @@ dependencies = [ [[package]] name = "lancedb-nodejs" -version = "0.32.0-beta.3" +version = "0.37.0-beta.0" dependencies = [ "arrow-array", "arrow-buffer", @@ -5491,7 +5491,7 @@ dependencies = [ [[package]] name = "lancedb-python" -version = "0.35.0-beta.3" +version = "0.37.0-beta.0" dependencies = [ "arrow", "async-trait", diff --git a/ci/bump_version.sh b/ci/bump_version.sh index 1b3311c88..559e8ffdc 100644 --- a/ci/bump_version.sh +++ b/ci/bump_version.sh @@ -2,9 +2,9 @@ set -e RELEASE_TYPE=${1:-"stable"} BUMP_MINOR=${2:-false} -TAG_PREFIX=${3:-"v"} # Such as "python-v" -HEAD_SHA=${4:-$(git rev-parse HEAD)} +HEAD_SHA=$(git rev-parse HEAD) +readonly TAG_PREFIX="v" readonly SELF_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) PREV_TAG=$(git tag --sort='version:refname' | grep ^$TAG_PREFIX | python $SELF_DIR/semver_sort.py $TAG_PREFIX | tail -n 1) @@ -12,7 +12,7 @@ echo "Found previous tag $PREV_TAG" # Initially, we don't want to tag if we are doing stable, because we will bump # again later. See comment at end for why. -if [[ "$RELEASE_TYPE" == 'stable' ]]; then +if [[ "$RELEASE_TYPE" == 'stable' ]]; then BUMP_ARGS="--no-tag" fi diff --git a/docs/src/java/java.md b/docs/src/java/java.md index a7a010c99..891cc1674 100644 --- a/docs/src/java/java.md +++ b/docs/src/java/java.md @@ -14,7 +14,7 @@ Add the following dependency to your `pom.xml`: com.lancedb lancedb-core - 0.32.0-beta.3 + 0.37.0-beta.0 ``` diff --git a/java/lancedb-core/pom.xml b/java/lancedb-core/pom.xml index 9333f0cc6..eb47e25f3 100644 --- a/java/lancedb-core/pom.xml +++ b/java/lancedb-core/pom.xml @@ -8,7 +8,7 @@ com.lancedb lancedb-parent - 0.32.0-beta.3 + 0.37.0-beta.0 ../pom.xml diff --git a/java/pom.xml b/java/pom.xml index 721d61b93..a6ebf1165 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -6,7 +6,7 @@ com.lancedb lancedb-parent - 0.32.0-beta.3 + 0.37.0-beta.0 pom ${project.artifactId} LanceDB Java SDK Parent POM diff --git a/nodejs/Cargo.toml b/nodejs/Cargo.toml index dda9c681e..aef5fd54d 100644 --- a/nodejs/Cargo.toml +++ b/nodejs/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "lancedb-nodejs" edition.workspace = true -version = "0.32.0-beta.3" +version = "0.37.0-beta.0" publish = false license.workspace = true description.workspace = true diff --git a/nodejs/npm/darwin-arm64/package.json b/nodejs/npm/darwin-arm64/package.json index f3d444fc6..618b02547 100644 --- a/nodejs/npm/darwin-arm64/package.json +++ b/nodejs/npm/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@lancedb/lancedb-darwin-arm64", - "version": "0.32.0-beta.3", + "version": "0.37.0-beta.0", "os": ["darwin"], "cpu": ["arm64"], "main": "lancedb.darwin-arm64.node", diff --git a/nodejs/npm/linux-arm64-gnu/package.json b/nodejs/npm/linux-arm64-gnu/package.json index 9aabfec02..3eb4eeaba 100644 --- a/nodejs/npm/linux-arm64-gnu/package.json +++ b/nodejs/npm/linux-arm64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@lancedb/lancedb-linux-arm64-gnu", - "version": "0.32.0-beta.3", + "version": "0.37.0-beta.0", "os": ["linux"], "cpu": ["arm64"], "main": "lancedb.linux-arm64-gnu.node", diff --git a/nodejs/npm/linux-arm64-musl/package.json b/nodejs/npm/linux-arm64-musl/package.json index 37f734fdc..7dbed5ae4 100644 --- a/nodejs/npm/linux-arm64-musl/package.json +++ b/nodejs/npm/linux-arm64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@lancedb/lancedb-linux-arm64-musl", - "version": "0.32.0-beta.3", + "version": "0.37.0-beta.0", "os": ["linux"], "cpu": ["arm64"], "main": "lancedb.linux-arm64-musl.node", diff --git a/nodejs/npm/linux-x64-gnu/package.json b/nodejs/npm/linux-x64-gnu/package.json index cf7489468..733aef750 100644 --- a/nodejs/npm/linux-x64-gnu/package.json +++ b/nodejs/npm/linux-x64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@lancedb/lancedb-linux-x64-gnu", - "version": "0.32.0-beta.3", + "version": "0.37.0-beta.0", "os": ["linux"], "cpu": ["x64"], "main": "lancedb.linux-x64-gnu.node", diff --git a/nodejs/npm/linux-x64-musl/package.json b/nodejs/npm/linux-x64-musl/package.json index 46699201c..041a49cb4 100644 --- a/nodejs/npm/linux-x64-musl/package.json +++ b/nodejs/npm/linux-x64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@lancedb/lancedb-linux-x64-musl", - "version": "0.32.0-beta.3", + "version": "0.37.0-beta.0", "os": ["linux"], "cpu": ["x64"], "main": "lancedb.linux-x64-musl.node", diff --git a/nodejs/npm/win32-arm64-msvc/package.json b/nodejs/npm/win32-arm64-msvc/package.json index 433d2615e..2604d021e 100644 --- a/nodejs/npm/win32-arm64-msvc/package.json +++ b/nodejs/npm/win32-arm64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@lancedb/lancedb-win32-arm64-msvc", - "version": "0.32.0-beta.3", + "version": "0.37.0-beta.0", "os": [ "win32" ], diff --git a/nodejs/npm/win32-x64-msvc/package.json b/nodejs/npm/win32-x64-msvc/package.json index 6ff05abc1..2ee52df53 100644 --- a/nodejs/npm/win32-x64-msvc/package.json +++ b/nodejs/npm/win32-x64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@lancedb/lancedb-win32-x64-msvc", - "version": "0.32.0-beta.3", + "version": "0.37.0-beta.0", "os": ["win32"], "cpu": ["x64"], "main": "lancedb.win32-x64-msvc.node", diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json index 8cb52d0aa..2317c89a4 100644 --- a/nodejs/package-lock.json +++ b/nodejs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@lancedb/lancedb", - "version": "0.32.0-beta.3", + "version": "0.37.0-beta.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@lancedb/lancedb", - "version": "0.32.0-beta.3", + "version": "0.37.0-beta.0", "cpu": [ "x64", "arm64" diff --git a/nodejs/package.json b/nodejs/package.json index 749f4b816..e9b861ad1 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -11,7 +11,7 @@ "ann" ], "private": false, - "version": "0.32.0-beta.3", + "version": "0.37.0-beta.0", "main": "dist/index.js", "exports": { ".": "./dist/index.js", diff --git a/python/.bumpversion.toml b/python/.bumpversion.toml deleted file mode 100644 index 15b9eefa9..000000000 --- a/python/.bumpversion.toml +++ /dev/null @@ -1,49 +0,0 @@ -[tool.bumpversion] -current_version = "0.35.0-beta.3" -parse = """(?x) - (?P0|[1-9]\\d*)\\. - (?P0|[1-9]\\d*)\\. - (?P0|[1-9]\\d*) - (?:-(?P[a-zA-Z-]+)\\.(?P0|[1-9]\\d*))? -""" -serialize = [ - "{major}.{minor}.{patch}-{pre_l}.{pre_n}", - "{major}.{minor}.{patch}", -] -search = "{current_version}" -replace = "{new_version}" -regex = false -ignore_missing_version = false -ignore_missing_files = false -tag = true -sign_tags = false -tag_name = "python-v{new_version}" -tag_message = "Bump version: {current_version} → {new_version}" -allow_dirty = true -commit = true -message = "Bump version: {current_version} → {new_version}" -commit_args = "" -# bump-my-version >=1.4.0 rejects pre_commit_hooks containing shell syntax unless opted in. -allow_shell_hooks = true - -# Update Cargo.lock after version bump -pre_commit_hooks = [ - """ - cd python && cargo update -p lancedb-python - if git diff --quiet ../Cargo.lock; then - echo "Cargo.lock unchanged" - else - git add ../Cargo.lock - echo "Updated and staged Cargo.lock" - fi - """, -] - -[tool.bumpversion.parts.pre_l] -values = ["beta", "final"] -optional_value = "final" - -[[tool.bumpversion.files]] -filename = "Cargo.toml" -search = "\nversion = \"{current_version}\"" -replace = "\nversion = \"{new_version}\"" diff --git a/python/Cargo.toml b/python/Cargo.toml index 9a635cd64..a0e9394ec 100644 --- a/python/Cargo.toml +++ b/python/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lancedb-python" -version = "0.35.0-beta.3" +version = "0.37.0-beta.0" publish = false edition.workspace = true description = "Python bindings for LanceDB" diff --git a/release_process.md b/release_process.md index 6df46962c..f223504a7 100644 --- a/release_process.md +++ b/release_process.md @@ -1,12 +1,17 @@ # Release process -There are five total packages we release. Four are the `lancedb` packages -for Python, Rust, Java, and Node.js. The other one is the legacy `vectordb` -package node.js. +We release four `lancedb` packages: Python, Rust, Java, and Node.js. -The Python package is versioned and released separately from the Rust, Java, and Node.js -ones. For Node.js the release process is shared between `lancedb` and -`vectordb` for now. +All four share a single version number, defined by `current_version` in +`.bumpversion.toml`. One `vX.Y.Z` tag releases all of them, so a breaking change +in any SDK bumps the minor version for every SDK. + +> [!NOTE] +> Python used to be versioned separately, under `python-vX.Y.Z` tags. It ran +> three minor versions ahead of the other SDKs, which made the two numbers hard +> to reason about. Both tracks were merged at `v0.37.0`: the Python line went +> `0.36` → `0.37` as usual, while Rust, Java, and Node.js jumped `0.33` → `0.37` +> to catch up. Tags before `v0.37.0` follow the old split scheme. ## Preview releases @@ -27,20 +32,21 @@ The release process uses a handful of GitHub actions to automate the process. ┌─────────────────────┐ │Create Release Commit│ └─┬───────────────────┘ - │ ┌────────────┐ ┌──►Python GH Release - ├──►(tag) python-vX.Y.Z ───►│PyPI Publish├─┤ - │ └────────────┘ └──►Python Wheels - │ - │ ┌───────────┐ - └──►(tag) vX.Y.Z ───┬──────►│NPM Publish├──┬──►Rust/Node GH Release - │ └───────────┘ │ - │ └──►NPM Packages - │ ┌─────────────┐ - ├──────►│Cargo Publish├───►Cargo Release - │ └─────────────┘ - │ ┌─────────────┐ - └──────►│Maven Publish├───►Java Maven Repo Release - └─────────────┘ + │ ┌──────────────┐ + └──►(tag) vX.Y.Z ─┬─►│GitHub Release├───►GH Release + │ └──────────────┘ + │ ┌────────────┐ + ├─►│PyPI Publish├─────►Python Wheels + │ └────────────┘ + │ ┌───────────┐ + ├─►│NPM Publish├──────►NPM Packages + │ └───────────┘ + │ ┌─────────────┐ + ├─►│Cargo Publish├────►Cargo Release + │ └─────────────┘ + │ ┌─────────────┐ + └─►│Maven Publish├────►Java Maven Repo Release + └─────────────┘ ``` To start a release, trigger a `Create Release Commit` action from diff --git a/rust/lancedb/Cargo.toml b/rust/lancedb/Cargo.toml index 7b016556f..ad6a4e2d6 100644 --- a/rust/lancedb/Cargo.toml +++ b/rust/lancedb/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lancedb" -version = "0.32.0-beta.3" +version = "0.37.0-beta.0" edition.workspace = true description = "LanceDB: A serverless, low-latency vector database for AI applications" license.workspace = true