mirror of
https://github.com/lancedb/lancedb.git
synced 2026-09-03 20:18:54 +00:00
a87cada90e
The bindings are built, installed and published with pnpm everywhere,
but a parallel npm dependency graph was still being maintained beside
it. This removes it, raises the supported Node floor to the versions we
actually test, and gives Dependabot the npm coverage it was missing.
## Dropping npm
`nodejs/package-lock.json` was regenerated by `ci/update_lockfiles.sh`
on every release commit and read by nothing — no workflow runs `npm ci`
or `npm install` in `nodejs/`, and npm never publishes a lockfile in a
package tarball. It could not even agree with the real install, since
npm does not see pnpm's `overrides`. Because GitHub's dependency graph
parses `package-lock.json`, it was also reporting vulnerabilities for a
tree we neither install nor ship.
`docs/package.json`, `docs/package-lock.json` and `docs/tsconfig.json`
go too. They depend on `file:../node` and
`file:../node/node_modules/apache-arrow` — the `node/` directory was
removed long ago — the tsconfig compiles `src/*.ts` where no TypeScript
files exist, and nothing installs any of it. `docs.yml` only referenced
the lockfile to configure an npm cache for an install it never ran.
Two `workflow_dispatch` workflows for regenerating those lockfiles are
removed as well. Both were already broken: they `uses:` composite
actions at `.github/workflows/update_package_lock{,_nodejs}` that do not
exist, so dispatching either failed immediately.
The remaining `npx` calls become direct `node_modules/.bin/...`
invocations. These were already running locally installed binaries
rather than resolving anything, but naming the binary removes the npm
CLI from the loop and does not depend on which Node version is active.
`dev.yml`'s commitlint check was the last place doing real npm
dependency resolution — an unpinned `npm install
@commitlint/config-conventional` that also bypassed the
`minimumReleaseAge` hold configured for `nodejs/` — and is now a pinned
`pnpm dlx`.
## Node support
Node 18 and 20 both reached end-of-life, in April 2025 and April 2026.
The matrix moves to 22, 24 and 26, and `engines` rises from `>= 18` to
`>= 22` so the declared floor is one the matrix actually covers. Node 22
is LTS until April 2027; 24 is LTS; 26 is Current and becomes LTS in
October 2026.
This also removes the reason the workflows reached for `npx` in the
first place: pnpm 11 requires Node >= 22.13, which every matrix version
now satisfies.
The prebuilt-binary smoke test in `npm-publish.yml` moves from Node 20
to Node 22 — the floor, where a napi ABI problem would surface first —
rather than fanning out across all three, to keep the publish matrix
from tripling.
## Dependabot
There were no npm-ecosystem entries at all, which is why the advisories
behind #4073 went unnoticed. Both pnpm lockfiles are now watched —
`nodejs/` and `nodejs/examples/`, which is a separate install — using
the same `lockfile-only` strategy as the existing cargo and pip entries,
so version ranges in `package.json` are left alone.
## Pre-commit biome
The hook ran `npx @biomejs/biome@1.8.3` while `nodejs/package.json`
resolved 1.9.4. The two disagree about formatting, so the hook rejected
code that `pnpm lint` accepts, and failed on unmodified `main` for
anyone touching `nodejs/`. It now uses the pnpm-managed biome, which
fixes the drift with no source changes.
## Testing
`dev.yml`'s commitlint job does not check out the repo, so it runs in an
empty workspace, and I could not verify `pnpm/action-setup` there
locally. It triggers on `pull_request_target`, so this PR exercises it
directly — worth confirming green before merge. I did verify the `pnpm
dlx` invocation itself locally: it accepts a conventional title and
rejects a non-conventional one with exit 1.
Node 26 is new enough that the examples job may surface gaps in prebuilt
native binaries (`onnxruntime-node`, `sharp`) before their maintainers
publish for it.
## Not included
`nodejs/examples/` still pins `sharp: "0.33.5"` and has its own audit
findings. Raising the Node floor unblocks that work — sharp 0.35
requires Node >= 20.9, which the matrix now satisfies — but it is a
dependency bump rather than tooling cleanup, so it is left separate.
## Breaking changes
`@lancedb/lancedb` now requires Node >= 22; previously >= 18. The
`@types/node` peer range moves from `>=18` to `>=22` to match. Users on
Node 18 or 20 must upgrade their runtime; both have been end-of-life for
some time. Existing installs are unaffected, since `engines` is only
checked on install.
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
466 lines
19 KiB
YAML
466 lines
19 KiB
YAML
name: NPM Publish
|
|
|
|
env:
|
|
MACOSX_DEPLOYMENT_TARGET: '10.13'
|
|
CARGO_INCREMENTAL: '0'
|
|
|
|
permissions:
|
|
contents: write
|
|
id-token: write
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- "v*"
|
|
# The cross-compiled targets (musl especially) break from toolchain and
|
|
# dependency changes that nothing else in CI catches, and discovering that
|
|
# mid-release is expensive. A nightly run keeps that signal while dropping
|
|
# the full 8-target release matrix from all ~90 pushes to main each month.
|
|
# `report-failure` files an issue when a nightly breaks.
|
|
schedule:
|
|
- cron: "0 8 * * *"
|
|
workflow_dispatch:
|
|
pull_request:
|
|
# This should trigger a dry run (we skip the final publish step)
|
|
paths:
|
|
- .github/workflows/npm-publish.yml
|
|
- Cargo.toml # Change in dependency frequently breaks builds
|
|
- Cargo.lock
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
build-lancedb:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
settings:
|
|
- target: aarch64-apple-darwin
|
|
host: macos-latest
|
|
features: fp16kernels
|
|
# Fat LTO was ~111 of this job's ~113 minutes.
|
|
lto: thin
|
|
codegen_units: 16
|
|
pre_build: |-
|
|
brew install protobuf
|
|
- target: x86_64-pc-windows-msvc
|
|
host: windows-2025
|
|
features: ","
|
|
# The lower peak also keeps this on the standard 4-core runner.
|
|
lto: thin
|
|
codegen_units: 16
|
|
pre_build: |-
|
|
choco install --no-progress protoc ninja nasm
|
|
tail -n 1000 /c/ProgramData/chocolatey/logs/chocolatey.log
|
|
# There is an issue where choco doesn't add nasm to the path
|
|
export PATH="$PATH:/c/Program Files/NASM"
|
|
nasm -v
|
|
- target: aarch64-pc-windows-msvc
|
|
host: windows-2025
|
|
features: ","
|
|
lto: thin
|
|
codegen_units: 16
|
|
pre_build: |-
|
|
choco install --no-progress protoc
|
|
rustup target add aarch64-pc-windows-msvc
|
|
- target: x86_64-unknown-linux-gnu
|
|
host: ubuntu-latest
|
|
features: fp16kernels
|
|
# https://github.com/napi-rs/napi-rs/blob/main/debian.Dockerfile
|
|
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
|
|
pre_build: |-
|
|
set -e &&
|
|
apt-get update &&
|
|
apt-get install -y protobuf-compiler pkg-config &&
|
|
# The base image (manylinux2014-cross) sets TARGET_CC to the old
|
|
# GCC 4.8 cross-compiler. aws-lc-sys checks TARGET_CC before CC,
|
|
# so it picks up GCC even though the napi-rs image sets CC=clang.
|
|
# Override to use the image's clang-18 which supports -fuse-ld=lld.
|
|
export TARGET_CC=clang TARGET_CXX=clang++
|
|
- target: x86_64-unknown-linux-musl
|
|
# This one seems to need some extra memory
|
|
host: ubuntu-2404-8x-x64
|
|
features: fp16kernels
|
|
pre_build: |-
|
|
set -e &&
|
|
sudo apt-get update &&
|
|
sudo apt-get install -y protobuf-compiler pkg-config &&
|
|
rustup target add x86_64-unknown-linux-musl &&
|
|
export EXTRA_ARGS="-x"
|
|
- target: aarch64-unknown-linux-gnu
|
|
host: ubuntu-2404-8x-x64
|
|
# https://github.com/napi-rs/napi-rs/blob/main/debian-aarch64.Dockerfile
|
|
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64
|
|
features: "fp16kernels"
|
|
# Fat LTO OOM-killed rustc every nightly; even with lld it peaked
|
|
# at 31391 MiB of the runner's 32 GiB.
|
|
lto: thin
|
|
codegen_units: 16
|
|
# arm64 Linux links through GNU `ld` where x86_64 defaults to
|
|
# `rust-lld`, which is why only arm64 OOM'd. lld cut the largest
|
|
# linker process 7.0 -> 4.0 GiB (lancedb/sophon#7313).
|
|
linker: /tmp/aarch64-lld-clang
|
|
pre_build: |-
|
|
set -e &&
|
|
apt-get update &&
|
|
apt-get install -y protobuf-compiler pkg-config &&
|
|
export TARGET_CC=clang TARGET_CXX=clang++ &&
|
|
# The manylinux2014 sysroot has glibc 2.17 headers which lack
|
|
# AT_HWCAP2 (added in Linux 3.17). Define it for aws-lc-sys.
|
|
export CFLAGS="$CFLAGS -DAT_HWCAP2=26" &&
|
|
rustup target add aarch64-unknown-linux-gnu
|
|
# Not `&&`-chained: in dash, errexit does not fire for a
|
|
# non-final command in an `&&` list, so failures were ignored.
|
|
#
|
|
# A wrapper rather than `-C link-arg` because the per-target
|
|
# rustflags variable does not reach every unit that links, while
|
|
# the linker variable does. `clang` because GCC silently ignores
|
|
# `-fuse-ld=lld` unless built with lld support. Two echoes
|
|
# because printf's newline escape gets rewritten to `;` between
|
|
# here and the container.
|
|
echo '#!/bin/sh' > /tmp/aarch64-lld-clang
|
|
echo 'exec clang --target=aarch64-unknown-linux-gnu --sysroot=/usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot --gcc-toolchain=/usr/aarch64-unknown-linux-gnu -fuse-ld=lld "$@"' >> /tmp/aarch64-lld-clang
|
|
chmod 0755 /tmp/aarch64-lld-clang
|
|
# Fail now, not at the cdylib link ~30 minutes later. Linking at
|
|
# all also proves lld resolved; clang errors out when it cannot.
|
|
echo 'int main(void){return 0;}' > /tmp/probe.c
|
|
/tmp/aarch64-lld-clang /tmp/probe.c -o /tmp/probe
|
|
readelf -h /tmp/probe | grep AArch64
|
|
- target: aarch64-unknown-linux-musl
|
|
host: ubuntu-2404-8x-x64
|
|
features: ","
|
|
# Fat LTO took the whole runner down. lld cannot help: it died
|
|
# inside rustc's LLVM, before any linker was spawned.
|
|
lto: thin
|
|
codegen_units: 16
|
|
pre_build: |-
|
|
set -e &&
|
|
sudo apt-get update &&
|
|
sudo apt-get install -y protobuf-compiler &&
|
|
rustup target add aarch64-unknown-linux-musl &&
|
|
export EXTRA_ARGS="-x"
|
|
name: build - ${{ matrix.settings.target }}
|
|
runs-on: ${{ matrix.settings.host }}
|
|
# On the job, not exported from `pre_build`: `Swatinem/rust-cache` hashes
|
|
# `CARGO_*` into its cache key before any step runs, so a step-local export
|
|
# leaves the key unchanged while cargo still rebuilds cold. The ThinLTO
|
|
# legs had been doing that every run.
|
|
#
|
|
# Not `RUSTFLAGS`: setting it, even to "", discards every config-file
|
|
# rustflag, silently dropping .cargo/config.toml's `target-cpu` and
|
|
# `target-feature` from the published binaries.
|
|
env:
|
|
CARGO_PROFILE_RELEASE_LTO: ${{ matrix.settings.lto || 'fat' }}
|
|
CARGO_PROFILE_RELEASE_CODEGEN_UNITS: ${{ matrix.settings.codegen_units || '1' }}
|
|
# Empty elsewhere: a per-target variable is only read for that triple.
|
|
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: ${{ matrix.settings.linker }}
|
|
defaults:
|
|
run:
|
|
working-directory: nodejs
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- name: Setup pnpm
|
|
uses: pnpm/action-setup@v6
|
|
with:
|
|
version: 11.1.1
|
|
- name: Setup node
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
# pnpm 11 requires Node >= 22.13.
|
|
node-version: 24
|
|
cache: pnpm
|
|
cache-dependency-path: nodejs/pnpm-lock.yaml
|
|
- name: Install
|
|
uses: dtolnay/rust-toolchain@stable
|
|
if: ${{ !matrix.settings.docker }}
|
|
with:
|
|
toolchain: stable
|
|
targets: ${{ matrix.settings.target }}
|
|
# These builds were entirely uncached: the old key was static, so
|
|
# `actions/cache` (which only writes on a miss) could never refresh it,
|
|
# and the multi-GB whole-`target/` copy it tried to store never fit the
|
|
# repo's cache budget, so no entry was ever saved. rust-cache prunes
|
|
# `target/` to dependency artifacts and keys on Cargo.lock plus the rustc
|
|
# version, which both fixes the key and keeps entries a sane size.
|
|
#
|
|
# This caches dependency *compilation* only. The LTO link of the cdylib
|
|
# re-runs regardless, since the local crate changes every time, so the
|
|
# win is larger on the non-LTO jobs than here.
|
|
- name: Cache cargo (native builds)
|
|
uses: Swatinem/rust-cache@v2
|
|
if: ${{ !matrix.settings.docker }}
|
|
with:
|
|
# The release profile and per-target dirs differ from what the test
|
|
# workflows cache, so these need to be separate entries.
|
|
key: release-${{ matrix.settings.target }}
|
|
# Only the nightly run on main writes, so tag and PR runs restore a
|
|
# warm entry without every dependabot PR writing its own (which would
|
|
# be unreadable elsewhere anyway, since GitHub scopes caches to the
|
|
# creating ref). The nightly cadence also keeps entries inside
|
|
# GitHub's 7-day eviction window, which a tag-only trigger would not.
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
# Docker builds can use rust-cache too: the workspace is bind-mounted, so
|
|
# `target/` lives on the host and rust-cache's prune keeps the entry
|
|
# small.
|
|
#
|
|
# Two differences from the native builds. The container's CARGO_HOME is
|
|
# bind-mounted from `.cargo-cache` rather than ~/.cargo, so that is cached
|
|
# explicitly. And the key uses the *host* rustc version, not the compiler
|
|
# that built these artifacts -- safe, since cargo fingerprints the real
|
|
# one; a base-image bump just costs one cold build.
|
|
- name: Cache cargo (docker builds)
|
|
uses: Swatinem/rust-cache@v2
|
|
if: ${{ matrix.settings.docker }}
|
|
with:
|
|
key: docker-${{ matrix.settings.target }}
|
|
cache-directories: .cargo-cache
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- name: Install dependencies
|
|
run: pnpm install --frozen-lockfile
|
|
- name: Install Zig
|
|
uses: mlugg/setup-zig@v2
|
|
if: ${{ contains(matrix.settings.target, 'musl') }}
|
|
with:
|
|
version: 0.14.1
|
|
- name: Install cargo-zigbuild
|
|
uses: taiki-e/install-action@v2
|
|
if: ${{ contains(matrix.settings.target, 'musl') }}
|
|
with:
|
|
tool: cargo-zigbuild
|
|
- name: Build in docker
|
|
uses: addnab/docker-run-action@v3
|
|
if: ${{ matrix.settings.docker }}
|
|
with:
|
|
image: ${{ matrix.settings.docker }}
|
|
# All three mounts must live under `.cargo-cache`, which is what the
|
|
# cache step above saves. Previously the registry mounts pointed at
|
|
# `.cargo/...`, a path nothing cached, so the container re-downloaded
|
|
# the whole crate registry on every run.
|
|
#
|
|
# `docker run` inherits nothing; `-e NAME` carries the job's `env:` in.
|
|
options: "--user 0:0 -v ${{ github.workspace }}/.cargo-cache/git/db:/usr/local/cargo/git/db \
|
|
-v ${{ github.workspace }}/.cargo-cache/registry/cache:/usr/local/cargo/registry/cache \
|
|
-v ${{ github.workspace }}/.cargo-cache/registry/index:/usr/local/cargo/registry/index \
|
|
-e CARGO_PROFILE_RELEASE_LTO \
|
|
-e CARGO_PROFILE_RELEASE_CODEGEN_UNITS \
|
|
-e CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER \
|
|
-v ${{ github.workspace }}:/build -w /build/nodejs"
|
|
run: |
|
|
set -e
|
|
${{ matrix.settings.pre_build }}
|
|
node_modules/.bin/napi build --platform --release \
|
|
--features ${{ matrix.settings.features }} \
|
|
--target ${{ matrix.settings.target }} \
|
|
--dts ../lancedb/native.d.ts \
|
|
--js ../lancedb/native.js \
|
|
--strip \
|
|
--output-dir dist/
|
|
# The container runs as root (`--user 0:0`), so everything it wrote to the
|
|
# mounted cache dirs is root-owned. rust-cache's post step runs as the
|
|
# runner user and has to both read these and delete from them while
|
|
# pruning, so hand them back before it runs.
|
|
- name: Take ownership of docker build output
|
|
if: ${{ matrix.settings.docker }}
|
|
run: |
|
|
sudo chown -R "$(id -u):$(id -g)" \
|
|
"${{ github.workspace }}/.cargo-cache" \
|
|
"${{ github.workspace }}/target"
|
|
- name: Build
|
|
run: |
|
|
${{ matrix.settings.pre_build }}
|
|
node_modules/.bin/napi build --platform --release \
|
|
--features ${{ matrix.settings.features }} \
|
|
--target ${{ matrix.settings.target }} \
|
|
--dts ../lancedb/native.d.ts \
|
|
--js ../lancedb/native.js \
|
|
--strip \
|
|
$EXTRA_ARGS \
|
|
--output-dir dist/
|
|
if: ${{ !matrix.settings.docker }}
|
|
shell: bash
|
|
# The standard Windows runners have ~14 GB free, and a release `target/`
|
|
# for this workspace is a large fraction of that. Report the remaining
|
|
# headroom so a build that only just fits is visible before a dependency
|
|
# bump turns it into a failed release. `always()` so the numbers are
|
|
# still there when the build is what ran out of space.
|
|
- name: Report disk headroom
|
|
if: always()
|
|
run: df -h
|
|
shell: bash
|
|
- name: Report peak memory
|
|
if: always() && runner.os == 'Linux'
|
|
shell: bash
|
|
run: |
|
|
peak=$(find /sys/fs/cgroup -name memory.peak -readable \
|
|
-exec cat {} + 2>/dev/null | sort -n | tail -1)
|
|
if [ -n "$peak" ]; then
|
|
echo "peak memory: $((peak / 1024 / 1024)) MiB"
|
|
else
|
|
echo "peak memory: unavailable (no readable cgroup v2 memory.peak)"
|
|
fi
|
|
free -g || true
|
|
- name: Upload artifact
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: lancedb-${{ matrix.settings.target }}
|
|
path: nodejs/dist/*.node
|
|
if-no-files-found: error
|
|
# The generic files are the same in all distros so we just pick
|
|
# one to do the upload.
|
|
- name: Make generic artifacts
|
|
if: ${{ matrix.settings.target == 'aarch64-apple-darwin' }}
|
|
run: pnpm tsc
|
|
- name: Upload Generic Artifacts
|
|
if: ${{ matrix.settings.target == 'aarch64-apple-darwin' }}
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: nodejs-dist
|
|
path: |
|
|
nodejs/dist/*
|
|
!nodejs/dist/*.node
|
|
test-lancedb:
|
|
name: "Test: ${{ matrix.settings.target }} - node@${{ matrix.node }}"
|
|
needs:
|
|
- build-lancedb
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
settings:
|
|
# TODO: Get tests passing on Windows (failing from test tmpdir issue)
|
|
# - host: windows-latest
|
|
# target: x86_64-pc-windows-msvc
|
|
- host: macos-latest
|
|
target: aarch64-apple-darwin
|
|
- target: x86_64-unknown-linux-gnu
|
|
host: ubuntu-latest
|
|
- target: aarch64-unknown-linux-gnu
|
|
host: ubuntu-2404-8x-arm64
|
|
node:
|
|
- '22'
|
|
runs-on: ${{ matrix.settings.host }}
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
working-directory: nodejs
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- name: Setup pnpm
|
|
uses: pnpm/action-setup@v6
|
|
with:
|
|
version: 11.1.1
|
|
- name: Setup Node.js 24 for install
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
# pnpm 11 requires Node >= 22.13; use 24 since 22 hits EOL
|
|
# in October.
|
|
node-version: 24
|
|
cache: pnpm
|
|
cache-dependency-path: nodejs/pnpm-lock.yaml
|
|
- name: Install dependencies
|
|
run: pnpm install --frozen-lockfile
|
|
- name: Setup Node.js ${{ matrix.node }} for test
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version: ${{ matrix.node }}
|
|
- name: Download artifacts
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
name: lancedb-${{ matrix.settings.target }}
|
|
path: nodejs/dist/
|
|
# For testing purposes:
|
|
# run-id: 13982782871
|
|
# github-token: ${{ secrets.GITHUB_TOKEN }} # token with actions:read permissions on target repo
|
|
- uses: actions/download-artifact@v8
|
|
with:
|
|
name: nodejs-dist
|
|
path: nodejs/dist
|
|
# For testing purposes:
|
|
# github-token: ${{ secrets.GITHUB_TOKEN }} # token with actions:read permissions on target repo
|
|
# run-id: 13982782871
|
|
- name: List packages
|
|
run: ls -R dist
|
|
- name: Move built files
|
|
run: cp dist/native.d.ts dist/native.js dist/*.node lancedb/
|
|
- name: Test bindings
|
|
# Invoke the installed jest binary directly; the pnpm shim is set up
|
|
# against the install-phase Node, not the version selected above.
|
|
run: node_modules/.bin/jest --verbose
|
|
publish:
|
|
name: Publish
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
working-directory: nodejs
|
|
needs:
|
|
- test-lancedb
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- name: Setup pnpm
|
|
uses: pnpm/action-setup@v6
|
|
with:
|
|
version: 11.1.1
|
|
- name: Setup node
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version: 24
|
|
cache: pnpm
|
|
cache-dependency-path: nodejs/pnpm-lock.yaml
|
|
registry-url: "https://registry.npmjs.org"
|
|
- name: Install dependencies
|
|
run: pnpm install --frozen-lockfile
|
|
- uses: actions/download-artifact@v8
|
|
with:
|
|
name: nodejs-dist
|
|
path: nodejs/dist
|
|
# For testing purposes:
|
|
# run-id: 13982782871
|
|
# github-token: ${{ secrets.GITHUB_TOKEN }} # token with actions:read permissions on target repo
|
|
- uses: actions/download-artifact@v8
|
|
name: Download arch-specific binaries
|
|
with:
|
|
pattern: lancedb-*
|
|
path: nodejs/nodejs-artifacts
|
|
merge-multiple: true
|
|
# For testing purposes:
|
|
# run-id: 13982782871
|
|
# github-token: ${{ secrets.GITHUB_TOKEN }} # token with actions:read permissions on target repo
|
|
- name: Display structure of downloaded files
|
|
run: find dist && find nodejs-artifacts
|
|
- name: Move artifacts
|
|
run: pnpm exec napi artifacts -d nodejs-artifacts
|
|
- name: List packages
|
|
run: find npm
|
|
- name: Publish
|
|
env:
|
|
DRY_RUN: ${{ !startsWith(github.ref, 'refs/tags/v') }}
|
|
run: |
|
|
npm config set provenance true
|
|
ARGS="--access public"
|
|
if [[ $DRY_RUN == "true" ]]; then
|
|
ARGS="$ARGS --dry-run"
|
|
fi
|
|
VERSION=$(node -p "require('./package.json').version")
|
|
if [[ $VERSION == *-* ]]; then
|
|
ARGS="$ARGS --tag preview"
|
|
fi
|
|
npm publish $ARGS
|
|
report-failure:
|
|
name: Report Workflow Failure
|
|
runs-on: ubuntu-latest
|
|
needs: [build-lancedb, test-lancedb, publish]
|
|
# Nightly runs are the only thing watching the cross-compiled targets now,
|
|
# so they have to report failures too or the signal is silently lost.
|
|
if: always() && failure() && (startsWith(github.ref, 'refs/tags/v') || github.event_name == 'schedule')
|
|
permissions:
|
|
contents: read
|
|
issues: write
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- uses: ./.github/actions/create-failure-issue
|
|
with:
|
|
job-results: ${{ toJSON(needs) }}
|
|
workflow-name: ${{ github.workflow }}
|