You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2026/04/10 01:14:22 UTC

(skywalking-graalvm-distro) branch fix/post-vote-script-robustness created (now 533fa93)

This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a change to branch fix/post-vote-script-robustness
in repository https://gitbox.apache.org/repos/asf/skywalking-graalvm-distro.git


      at 533fa93  Fix post-vote script: pipefail crash, python3 arg passing, and idempotency

This branch includes the following new commits:

     new 533fa93  Fix post-vote script: pipefail crash, python3 arg passing, and idempotency

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(skywalking-graalvm-distro) 01/01: Fix post-vote script: pipefail crash, python3 arg passing, and idempotency

Posted by wu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch fix/post-vote-script-robustness
in repository https://gitbox.apache.org/repos/asf/skywalking-graalvm-distro.git

commit 533fa9372d30dd92e3a8d3af6104be152f79007a
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Fri Apr 10 09:14:02 2026 +0800

    Fix post-vote script: pipefail crash, python3 arg passing, and idempotency
    
    Three bugs fixed:
    
    1. git show on submodule pom.xml exits 128 (submodule content not
       accessible via superproject tag). With set -euo pipefail, the
       pipeline silently killed the script. Added || true.
    
    2. Python3 heredoc arguments were placed after the PYEOF terminator,
       making them a separate shell command instead of python3 args.
       Changed to python3 - <args> <<'PYEOF' pattern.
    
    3. SVN move and remove steps now check if already completed before
       attempting, making the script safe to re-run after partial failure.
    
    Also added a pre-flight check that python3 actually works (not just
    exists as a broken asdf/pyenv shim).
---
 release/post-vote.sh | 62 ++++++++++++++++++++++++++++++----------------------
 1 file changed, 36 insertions(+), 26 deletions(-)

diff --git a/release/post-vote.sh b/release/post-vote.sh
index 2df4e6d..0c9ae35 100755
--- a/release/post-vote.sh
+++ b/release/post-vote.sh
@@ -86,6 +86,9 @@ for cmd in git gh svn sed date python3; do
     command -v "${cmd}" >/dev/null 2>&1 || error "'${cmd}' is not installed"
 done
 
+# Validate python3 actually works (not just exists as a broken shim)
+python3 --version >/dev/null 2>&1 || error "'python3' found but not functional — check your PATH or asdf/pyenv shims"
+
 # Verify tag exists
 git rev-parse "${TAG}" >/dev/null 2>&1 \
     || error "Tag ${TAG} not found locally. Run: git fetch --tags"
@@ -110,7 +113,7 @@ TAG_COMMIT=$(git rev-parse "${TAG}")
 # Determine the upstream SkyWalking version label used in website entries
 # Format: X.Y.Z (10.3.0-dev-<short-commit>)
 SW_VERSION_RAW=$(git show "${TAG}:skywalking/pom.xml" 2>/dev/null \
-    | sed -n '/<version>/{s/.*<version>\(.*\)<\/version>.*/\1/;p;q;}')
+    | sed -n '/<version>/{s/.*<version>\(.*\)<\/version>.*/\1/;p;q;}' || true)
 if [[ -n "${SW_VERSION_RAW}" ]]; then
     VERSION_LABEL="${VERSION} (${SW_VERSION_RAW}-${SW_COMMIT_SHORT})"
 else
@@ -203,24 +206,29 @@ echo ""
 [[ -n "${SVN_PASS}" ]] || error "SVN password is required"
 
 # ─── Step 2: SVN move from dist/dev to dist/release ─────────────────────────
-log "SVN: Verifying source exists in dist/dev..."
-svn info "${SVN_DEV_DIR}" --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive >/dev/null 2>&1 \
-    || error "SVN source not found: ${SVN_DEV_DIR}"
-
-# Create parent directory in dist/release if needed
-if ! svn info "${SVN_RELEASE_BASE}" --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive >/dev/null 2>&1; then
-    log "Creating ${SVN_RELEASE_BASE}..."
-    svn mkdir "${SVN_RELEASE_BASE}" \
-        -m "Create graalvm-distro directory in dist/release" \
-        --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive
-fi
+# Check if already moved (idempotent)
+if svn info "${SVN_RELEASE_DIR}" --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive >/dev/null 2>&1; then
+    log "SVN: ${SVN_RELEASE_DIR} already exists — skipping move (already done)."
+else
+    log "SVN: Verifying source exists in dist/dev..."
+    svn info "${SVN_DEV_DIR}" --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive >/dev/null 2>&1 \
+        || error "SVN source not found: ${SVN_DEV_DIR}"
+
+    # Create parent directory in dist/release if needed
+    if ! svn info "${SVN_RELEASE_BASE}" --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive >/dev/null 2>&1; then
+        log "Creating ${SVN_RELEASE_BASE}..."
+        svn mkdir "${SVN_RELEASE_BASE}" \
+            -m "Create graalvm-distro directory in dist/release" \
+            --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive
+    fi
 
-log "SVN: Moving dist/dev/${VERSION} → dist/release/${VERSION}..."
-svn mv "${SVN_DEV_DIR}" "${SVN_RELEASE_DIR}" \
-    -m "Release Apache SkyWalking GraalVM Distro ${VERSION}" \
-    --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive
+    log "SVN: Moving dist/dev/${VERSION} → dist/release/${VERSION}..."
+    svn mv "${SVN_DEV_DIR}" "${SVN_RELEASE_DIR}" \
+        -m "Release Apache SkyWalking GraalVM Distro ${VERSION}" \
+        --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive
 
-log "SVN move complete: ${SVN_RELEASE_DIR}"
+    log "SVN move complete: ${SVN_RELEASE_DIR}"
+fi
 
 # ─── Step 3: Ask whether to remove oldest release from dist/release ─────────
 # Apache policy: only the latest release should remain in dist/release.
@@ -255,11 +263,15 @@ if [[ -n "${OLD_VERSIONS}" ]]; then
     read -r -p "  Remove older version(s) from dist/release? [y/N] " remove_old
     if [[ "${remove_old}" =~ ^[Yy]$ ]]; then
         for old_ver in ${OLD_VERSIONS}; do
-            log "SVN: Removing ${SVN_RELEASE_BASE}/${old_ver}..."
-            svn rm "${SVN_RELEASE_BASE}/${old_ver}" \
-                -m "Remove old GraalVM Distro ${old_ver} from dist/release (archived at archive.apache.org)" \
-                --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive
-            log "Removed: ${old_ver}"
+            if ! svn info "${SVN_RELEASE_BASE}/${old_ver}" --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive >/dev/null 2>&1; then
+                log "SVN: ${old_ver} already removed — skipping."
+            else
+                log "SVN: Removing ${SVN_RELEASE_BASE}/${old_ver}..."
+                svn rm "${SVN_RELEASE_BASE}/${old_ver}" \
+                    -m "Remove old GraalVM Distro ${old_ver} from dist/release (archived at archive.apache.org)" \
+                    --username "${SVN_USER}" --password "${SVN_PASS}" --non-interactive
+                log "Removed: ${old_ver}"
+            fi
             REMOVED_VERSIONS="${REMOVED_VERSIONS}${old_ver} "
         done
         REMOVED_VERSIONS=$(echo "${REMOVED_VERSIONS}" | xargs)
@@ -292,7 +304,7 @@ RELEASES_FILE="data/releases.yml"
 #   1. Add new version entry with closer.cgi / downloads.apache.org URLs
 #   2. For kept old versions: migrate URLs to archive.apache.org
 #   3. For removed versions: delete their entries entirely
-python3 <<'PYEOF'
+python3 - "${RELEASES_FILE}" "${VERSION}" "${VERSION_LABEL}" "${RELEASE_DATE}" "${REMOVED_VERSIONS}" <<'PYEOF'
 import sys
 
 releases_file = sys.argv[1]
@@ -457,14 +469,13 @@ if removed_versions:
 actions.append("migrated kept old version URLs to archive.apache.org")
 print(f"releases.yml: {'; '.join(actions)}")
 PYEOF
-"${RELEASES_FILE}" "${VERSION}" "${VERSION_LABEL}" "${RELEASE_DATE}" "${REMOVED_VERSIONS}"
 
 # ─── Step 6: Update data/docs.yml ────────────────────────────────────────────
 log "Updating data/docs.yml..."
 
 DOCS_FILE="data/docs.yml"
 
-python3 <<'PYEOF'
+python3 - "${DOCS_FILE}" "${VERSION}" "${VERSION_LABEL}" "${TAG_COMMIT}" "${REMOVED_VERSIONS}" <<'PYEOF'
 import sys
 
 docs_file = sys.argv[1]
@@ -570,7 +581,6 @@ if removed_versions:
     actions.append(f"removed doc entries for {', '.join(sorted(removed_versions))}")
 print(f"docs.yml: {'; '.join(actions)}")
 PYEOF
-"${DOCS_FILE}" "${VERSION}" "${VERSION_LABEL}" "${TAG_COMMIT}" "${REMOVED_VERSIONS}"
 
 # ─── Step 7: Create release event post ──────────────────────────────────────
 log "Creating release event post..."