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 <[email protected]> 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..."
