This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new 2921ec758 ci: use nightly date suffix for Gemfury npm package versions
(#4158)
2921ec758 is described below
commit 2921ec758ba290f72be978ec5024f4c5422c3a00
Author: Kent Wu <[email protected]>
AuthorDate: Mon Mar 30 19:31:49 2026 -0400
ci: use nightly date suffix for Gemfury npm package versions (#4158)
**Summary**
This PR appends a nightly date suffix to gemfury npm publishes (ex.
`0.23.0-nightly.20260330`). This removes the need to remove and
re-publish the gemfury packages, which reverts the package visibility to
private.
This fixes the package visibility issue, as going forward the nightly
publish will publish to a new nightly version string, and set the `dev`
tag to it.
**Test Plan**
Packaged tarballs to `/tmp/adbc-npm-test`
```sh
NPM_TOKEN="${GEMFURY_PUSH_TOKEN}" \
NPM_REGISTRY="https://npm.fury.io/kentkwu/" \
NPM_TAG="dev" \
bash ci/scripts/node_npm_upload.sh /tmp/adbc-npm-test
```
```sh
curl -s -H "Authorization: Bearer ${GEMFURY_API_TOKEN}" \
"https://api.fury.io/1/packages?limit=50" \
| jq -r 'sort_by(.name)[] | "\(.name)@\(.latest_version.version)"'
```
closes #4157
---
ci/scripts/gemfury_clean.py | 17 +++++--------
ci/scripts/node_npm_upload.sh | 58 ++++++++++++++++++++++++++++++++++++-------
2 files changed, 55 insertions(+), 20 deletions(-)
diff --git a/ci/scripts/gemfury_clean.py b/ci/scripts/gemfury_clean.py
index 6fba100aa..291e30f9f 100755
--- a/ci/scripts/gemfury_clean.py
+++ b/ci/scripts/gemfury_clean.py
@@ -50,17 +50,12 @@ def main():
print(versions)
versions.sort(key=lambda v: v["created_at"], reverse=True)
- # npm registries don't allow re-uploading an existing version, so
all
- # existing versions must be removed to allow the nightly re-upload
- if package.get("kind_key") == "js":
- to_delete = [version["id"] for version in versions]
- else:
- # Always keep at least 1 version
- to_delete = [
- version["id"]
- for version in versions[1:]
- if version["created_at"] < cutoff.isoformat()
- ]
+ # Always keep at least 1 version
+ to_delete = [
+ version["id"]
+ for version in versions[1:]
+ if version["created_at"] < cutoff.isoformat()
+ ]
print("Removing", len(to_delete), "version(s) of", len(versions))
for version_id in to_delete:
diff --git a/ci/scripts/node_npm_upload.sh b/ci/scripts/node_npm_upload.sh
index ddb1876d8..a2d7c14b2 100755
--- a/ci/scripts/node_npm_upload.sh
+++ b/ci/scripts/node_npm_upload.sh
@@ -18,21 +18,45 @@
# Publish Node.js packages to an npm registry.
#
+# For non-npmjs registries (e.g. Gemfury nightlies), the script appends a
+# nightly date suffix to the version (e.g. 0.23.0-nightly.20260330) to avoid
+# "version already exists" errors.
+#
# Usage: ./ci/scripts/node_npm_upload.sh <packages_dir>
#
# Environment variables:
-# NPM_TOKEN npm authentication token (required)
-# NPM_REGISTRY registry URL (default: https://registry.npmjs.org)
-# NPM_TAG dist-tag to publish under (default: latest)
-# DRY_RUN set to 1 to pass --dry-run to npm publish
+# NPM_TOKEN npm authentication token (required)
+# NPM_REGISTRY registry URL (default: https://registry.npmjs.org)
+# NPM_TAG dist-tag to publish under (default: latest)
+# DRY_RUN set to 1 to pass --dry-run to npm publish
set -euo pipefail
+# Prevent macOS tar from including ._* resource fork files
+export COPYFILE_DISABLE=1
+
+# Rewrite the "version" field in a tarball's package.json and repack it
+repack_with_version() {
+ local pkg="$1" new_version="$2"
+ local tmpdir
+ tmpdir=$(mktemp -d)
+ tar -xzf "${pkg}" -C "${tmpdir}"
+ sed -i.bak "s/\"version\": *\"[^\"]*\"/\"version\": \"${new_version}\"/"
"${tmpdir}/package/package.json"
+ rm -f "${tmpdir}/package/package.json.bak"
+ tar -czf "${pkg}" -C "${tmpdir}" package
+ rm -rf "${tmpdir}"
+}
+
+# Read the "version" field from a tarball's package.json
+read_tarball_version() {
+ tar -xzf "$1" -O package/package.json | grep -o '"version": *"[^"]*"' |
head -1 | cut -d'"' -f4
+}
+
main() {
local packages_dir
packages_dir="$(realpath "$1")"
local registry="${NPM_REGISTRY:-https://registry.npmjs.org}"
- local registry_key="${registry%/}" # strip trailing slash for .npmrc key
construction
+ local registry_key="${registry%/}"
local dry_run_flag=""
if [[ "${DRY_RUN:-0}" == "1" ]]; then
dry_run_flag="--dry-run"
@@ -47,21 +71,37 @@ main() {
exit 1
fi
- # Write a temp .npmrc with the auth token for the target registry
local npmrc
npmrc=$(mktemp)
trap "rm -f ${npmrc}" EXIT
echo "//${registry_key#*://}/:_authToken=${NPM_TOKEN}" > "${npmrc}"
+ # For non-npmjs registries (e.g. Gemfury), append a nightly date suffix
+ # so each publish gets a unique version
+ if [[ "${registry}" != *"registry.npmjs.org"* ]]; then
+ local base_version
+ base_version=$(read_tarball_version "$(set --
"${packages_dir}"/apache-arrow-adbc-driver-manager-[0-9]*.tgz; echo "$1")")
+ local new_version="${base_version}-nightly.$(date +%Y%m%d)"
+ echo "==== Rewriting version to ${new_version} for nightly publish"
+ for pkg in "${packages_dir}"/apache-arrow-adbc-driver-manager-*.tgz; do
+ repack_with_version "${pkg}" "${new_version}"
+ done
+ fi
+
# Publish platform-specific packages first, then the main package
- for pkg in "${packages_dir}"/apache-arrow-adbc-driver-manager-*-*.tgz; do
+ local platform_pkgs=()
+ shopt -s nullglob
+ platform_pkgs=("${packages_dir}"/apache-arrow-adbc-driver-manager-*-*.tgz)
+ shopt -u nullglob
+ for pkg in "${platform_pkgs[@]+"${platform_pkgs[@]}"}"; do
echo "==== Publishing ${pkg}"
npm publish "${pkg}" --access public --registry "${registry}"
--userconfig "${npmrc}" ${tag_flag} ${dry_run_flag}
done
echo "==== Publishing main package"
- npm publish "${packages_dir}"/apache-arrow-adbc-driver-manager-[0-9]*.tgz \
- --access public --registry "${registry}" --userconfig "${npmrc}"
${tag_flag} ${dry_run_flag}
+ local main_pkg
+ main_pkg=$(set --
"${packages_dir}"/apache-arrow-adbc-driver-manager-[0-9]*.tgz; echo "$1")
+ npm publish "${main_pkg}" --access public --registry "${registry}"
--userconfig "${npmrc}" ${tag_flag} ${dry_run_flag}
}
main "$@"