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 "$@"

Reply via email to