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

wusheng pushed a commit to branch feature/release-automation
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit 72533eb20430a839bdd0bc5dfa635bc0c8f14519
Author: Wu Sheng <[email protected]>
AuthorDate: Sun Mar 15 11:00:03 2026 +0800

    Automate release process with unified release.sh script
    
    Replace separate create_release_tars.sh and start_next_version.sh with
    a single interactive release.sh that runs all steps end-to-end: GPG
    signer verification, tool checks, version detection, artifact build,
    SVN upload, vote email generation, and next version PR preparation.
    Uses a single git clone instead of two separate clones.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
 docs/en/guides/How-to-release.md       |  94 ++-------
 tools/releasing/.gitignore             |   3 +
 tools/releasing/create_release_tars.sh |  90 --------
 tools/releasing/release.sh             | 362 +++++++++++++++++++++++++++++++++
 tools/releasing/start_next_version.sh  |  80 --------
 5 files changed, 381 insertions(+), 248 deletions(-)

diff --git a/docs/en/guides/How-to-release.md b/docs/en/guides/How-to-release.md
index 4bee867f0d..3f6edf15d0 100644
--- a/docs/en/guides/How-to-release.md
+++ b/docs/en/guides/How-to-release.md
@@ -8,92 +8,30 @@ Add your GPG public key into the [SkyWalking GPG 
KEYS](https://dist.apache.org/r
 - If you are a PMC member, use your Apache ID and password to log in this svn, 
and update the file. **Don't override the existing file.**
 - If you are a committer, please ask a PMC member to help you. 
 
-## Create artifacts for the release
+## Run the release script
 
-- Create a new empty folder to do the release work.
-- Set the version numbers and run the release script file 
[`tools/releasing/create_release_tars.sh`](https://github.com/apache/skywalking/blob/master/tools/releasing/create_release_tars.sh)
+The release script 
[`tools/releasing/release.sh`](https://github.com/apache/skywalking/blob/master/tools/releasing/release.sh)
 automates the following steps:
 
-```bash
-export RELEASE_VERSION=x.y.z # (example: RELEASE_VERSION=10.1.0)
-export NEXT_RELEASE_VERSION=x.y.z # (example: NEXT_RELEASE_VERSION=10.2.0)
-curl -Ls 
https://raw.githubusercontent.com/apache/skywalking/refs/heads/master/tools/releasing/create_release_tars.sh
 | bash -
-```
-
-After all the steps are completed, you will have the following files in the 
folder:
-
-```text
-apache-skywalking-apm-${RELEASE_VERSION}-bin.tar.gz
-apache-skywalking-apm-${RELEASE_VERSION}-bin.tar.gz.asc
-apache-skywalking-apm-${RELEASE_VERSION}-bin.tar.gz.sha512
-apache-skywalking-apm-${RELEASE_VERSION}-src.tar.gz
-apache-skywalking-apm-${RELEASE_VERSION}-src.tar.gz.asc
-apache-skywalking-apm-${RELEASE_VERSION}-src.tar.gz.sha512
-```
-
-## Start the next iteration
-
-Once the binary and source packages are created, you can start updating the 
version to the next number and open a pull request.
+1. Verify GPG signer (`@apache.org` email required)
+2. Check required tools (`gpg`, `svn`, `shasum`, `git`, `yq`)
+3. Detect current version from `pom.xml`
+4. Calculate release version (strip `-SNAPSHOT`) and next version (bump minor)
+5. Clone the repository, build source and binary tarballs, GPG sign, SHA512 
checksum
+6. Upload artifacts to SVN staging 
(`https://dist.apache.org/repos/dist/dev/skywalking/{version}`)
+7. Generate the vote email (with sha512 checksums and submodule commit IDs 
filled in)
+8. Prepare next version PR (bump version, rotate changelog, update `menu.yml`, 
push branch)
 
 ```bash
-curl -Ls 
https://raw.githubusercontent.com/apache/skywalking/refs/heads/master/tools/releasing/start_next_version.sh
 | bash -
+cd tools/releasing
+bash release.sh
 ```
 
-## Upload to Apache svn
-1. Use your Apache ID to log in to 
`https://dist.apache.org/repos/dist/dev/skywalking/`.
-1. Create a folder and name it by the release version and round, such as: 
`x.y.z`
-1. Upload the source code package to the folder with files ending with `.asc` 
and `.sha512`.
-    * Package name: `apache-skywalking-x.y.z-src.tar.gz`
-    * See Section "Build and sign the source code package" for more details 
-1. Upload the distribution package to the folder with files ending with `.asc` 
and `.sha512`.
-    * Package name:  `apache-skywalking-bin-x.y.z.tar.gz`.
-    * Create a `.sha512` package: `shasum -a 512 file > file.sha512`
-
-## Call a vote in dev
-Call a vote in `[email protected]`
-
-```
-Mail title: [VOTE] Release Apache SkyWalking version x.y.z
-
-Mail content:
-Hi All,
-This is a call for vote to release Apache SkyWalking version x.y.z.
-
-Release notes:
-
- * 
https://github.com/apache/skywalking/blob/master/docs/en/changes/changes-x.y.z.md
-
-Release Candidate:
-
- * https://dist.apache.org/repos/dist/dev/skywalking/xxxx
- * sha512 checksums
-   - sha512xxxxyyyzzz apache-skywalking-apm-x.x.x-src.tgz
-   - sha512xxxxyyyzzz apache-skywalking-apm-bin-x.x.x.tar.gz
-
-Release Tag :
-
- * (Git Tag) vx.y.z
-
-Release CommitID :
+The script is interactive — it confirms the GPG signer and version numbers 
before proceeding.
 
- * https://github.com/apache/skywalking/tree/(Git Commit ID)
- * Git submodule
-   * skywalking-ui: https://github.com/apache/skywalking-booster-ui/tree/(Git 
Commit ID)
-   * apm-protocol/apm-network/src/main/proto: 
https://github.com/apache/skywalking-data-collect-protocol/tree/(Git Commit ID)
-   * 
oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
 https://github.com/apache/skywalking-query-protocol/tree/(Git Commit ID)
+After the script completes, copy the generated vote email and send it to 
`[email protected]`.
 
-Keys to verify the Release Candidate :
-
- * https://dist.apache.org/repos/dist/release/skywalking/KEYS
-
-Guide to build the release from source :
-
- * 
https://github.com/apache/skywalking/blob/vx.y.z/docs/en/guides/How-to-build.md
-
-Voting will start now (xxxx date) and will remain open for at least 72 hours, 
Request all PMC members to give their vote.
-[ ] +1 Release this package.
-[ ] +0 No opinion.
-[ ] -1 Do not release this package because....
-```
+## Call a vote in dev
+The release script generates the vote email automatically. Send it to 
`[email protected]`.
 
 ## Vote Check
 All PMC members and committers should check these before casting +1 votes.
diff --git a/tools/releasing/.gitignore b/tools/releasing/.gitignore
new file mode 100644
index 0000000000..8e479cb34f
--- /dev/null
+++ b/tools/releasing/.gitignore
@@ -0,0 +1,3 @@
+skywalking/
+svn-staging/
+apache-skywalking-apm-*
diff --git a/tools/releasing/create_release_tars.sh 
b/tools/releasing/create_release_tars.sh
deleted file mode 100755
index fb55ea9795..0000000000
--- a/tools/releasing/create_release_tars.sh
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/env bash
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# This script relies on few environment variables to determine source code 
package
-# behavior, those variables are:
-#   RELEASE_VERSION -- The version of this source package.
-#   NEXT_RELEASE_VERSION -- The version of the next release.
-# For example: RELEASE_VERSION=10.0.0, NEXT_RELEASE_VERSION=10.0.1
-
-set -e -o pipefail
-
-if [ "$RELEASE_VERSION" == "" ] || [ "$NEXT_RELEASE_VERSION" == "" ]; then
-  echo "RELEASE_VERSION or NEXT_RELEASE_VERSION environment variable not 
found."
-  echo "Please set the RELEASE_VERSION and NEXT_RELEASE_VERSION."
-  echo "For example: export RELEASE_VERSION=10.0.0"
-  echo "           : export NEXT_RELEASE_VERSION=10.0.1"
-  exit 1
-fi
-
-PRODUCT_NAME="apache-skywalking-apm"
-TAG=v${RELEASE_VERSION}
-SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
-MVN=${MVN:-./mvnw}
-
-if [ -d "skywalking" ]; then
-  rm -rf skywalking
-fi
-
-echo "Cloning the repository..."
-git clone --recurse-submodules -j4 --depth 1 
https://github.com/apache/skywalking.git && cd skywalking
-
-echo "Checking out the release branch ${RELEASE_VERSION}-release..."
-git checkout -b ${RELEASE_VERSION}-release
-
-log_file=$(mktemp)
-echo "Setting the release version ${RELEASE_VERSION} in pom.xml, log file: 
${log_file}"
-${MVN} versions:set-property -DgenerateBackupPoms=false -Dproperty=revision 
-DnewVersion=${RELEASE_VERSION} > ${log_file} 2>&1
-
-echo "Committing the pom.xml changes..."
-git add pom.xml
-git commit -m "Prepare for release ${RELEASE_VERSION}"
-
-echo "Creating the release tag ${TAG}..."
-git tag ${TAG}
-
-echo "Pushing the release tag ${TAG} to the remote repository..."
-git push --set-upstream origin ${TAG}
-
-log_file=$(mktemp)
-echo "Generating a static version.properties, log file: ${log_file}"
-${MVN} -q -pl oap-server/server-starter -am initialize \
-       
-DgenerateGitPropertiesFilename="$(pwd)/oap-server/server-starter/src/main/resources/version.properties"
 > ${log_file} 2>&1
-
-echo "Creating the release source artifacts..."
-tar czf "${SCRIPT_DIR}"/${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz \
-    --exclude .git \
-    --exclude .DS_Store \
-    --exclude .github \
-    --exclude .gitignore \
-    --exclude .gitmodules \
-    --exclude .mvn/wrapper/maven-wrapper.jar \
-    .
-
-log_file=$(mktemp)
-echo "Building the release binary artifacts, log file: ${log_file}"
-${MVN} install package -DskipTests > ${log_file} 2>&1
-mv "${SCRIPT_DIR}"/skywalking/dist/${PRODUCT_NAME}-bin.tar.gz 
./${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz
-
-cd "${SCRIPT_DIR}"
-gpg --armor --detach-sig ${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz
-gpg --armor --detach-sig ${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz
-
-shasum -a 512 ${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz > 
${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz.sha512
-shasum -a 512 ${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz > 
${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz.sha512
diff --git a/tools/releasing/release.sh b/tools/releasing/release.sh
new file mode 100755
index 0000000000..5264fe6299
--- /dev/null
+++ b/tools/releasing/release.sh
@@ -0,0 +1,362 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Apache SkyWalking release automation script.
+# Usage: bash release.sh
+
+set -e -o pipefail
+
+SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
+PROJECT_DIR=$(cd "${SCRIPT_DIR}/../.." && pwd)
+PRODUCT_NAME="apache-skywalking-apm"
+SVN_DEV_URL="https://dist.apache.org/repos/dist/dev/skywalking";
+CLONE_DIR="${SCRIPT_DIR}/skywalking"
+MVN=./mvnw
+
+# ========================== Shared functions ==========================
+
+clone_repo() {
+    cd "${SCRIPT_DIR}"
+    if [ -d "${CLONE_DIR}" ]; then
+        rm -rf "${CLONE_DIR}"
+    fi
+    echo "Cloning the repository..."
+    git clone --recurse-submodules -j4 --depth 1 
https://github.com/apache/skywalking.git
+}
+
+build_release_artifacts() {
+    local TAG=v${RELEASE_VERSION}
+
+    cd "${CLONE_DIR}"
+
+    echo "Checking out the release branch ${RELEASE_VERSION}-release..."
+    git checkout -b ${RELEASE_VERSION}-release
+
+    log_file=$(mktemp)
+    echo "Setting the release version ${RELEASE_VERSION} in pom.xml, log file: 
${log_file}"
+    ${MVN} versions:set-property -DgenerateBackupPoms=false 
-Dproperty=revision -DnewVersion=${RELEASE_VERSION} > ${log_file} 2>&1
+
+    echo "Committing the pom.xml changes..."
+    git add pom.xml
+    git commit -m "Prepare for release ${RELEASE_VERSION}"
+
+    echo "Creating the release tag ${TAG}..."
+    git tag ${TAG}
+
+    echo "Pushing the release tag ${TAG} to the remote repository..."
+    git push --set-upstream origin ${TAG}
+
+    log_file=$(mktemp)
+    echo "Generating a static version.properties, log file: ${log_file}"
+    ${MVN} -q -pl oap-server/server-starter -am initialize \
+           
-DgenerateGitPropertiesFilename="$(pwd)/oap-server/server-starter/src/main/resources/version.properties"
 > ${log_file} 2>&1
+
+    echo "Creating the release source artifacts..."
+    tar czf "${SCRIPT_DIR}"/${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz \
+        --exclude .git \
+        --exclude .DS_Store \
+        --exclude .github \
+        --exclude .gitignore \
+        --exclude .gitmodules \
+        --exclude .mvn/wrapper/maven-wrapper.jar \
+        .
+
+    log_file=$(mktemp)
+    echo "Building the release binary artifacts, log file: ${log_file}"
+    ${MVN} install package -DskipTests > ${log_file} 2>&1
+    mv dist/${PRODUCT_NAME}-bin.tar.gz 
"${SCRIPT_DIR}"/${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz
+
+    cd "${SCRIPT_DIR}"
+
+    gpg --armor --detach-sig ${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz
+    gpg --armor --detach-sig ${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz
+
+    shasum -a 512 ${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz > 
${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz.sha512
+    shasum -a 512 ${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz > 
${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz.sha512
+
+    echo "Release artifacts built successfully."
+}
+
+prepare_next_version() {
+    cd "${CLONE_DIR}"
+
+    echo "Setting the next release version ${NEXT_RELEASE_VERSION}-SNAPSHOT in 
pom.xml..."
+    ${MVN} versions:set-property -DgenerateBackupPoms=false 
-Dproperty=revision -DnewVersion=${NEXT_RELEASE_VERSION}-SNAPSHOT
+
+    echo "Committing the pom.xml changes..."
+    git add pom.xml
+    git commit -m "Update the next release version to 
${NEXT_RELEASE_VERSION}-SNAPSHOT"
+
+    echo "Moving the changelog file..."
+    mv docs/en/changes/changes.md docs/en/changes/changes-${RELEASE_VERSION}.md
+
+    echo "Updating the changelog file..."
+    cat docs/en/changes/changes.tpl | sed 
"s/NEXT_RELEASE_VERSION/${NEXT_RELEASE_VERSION}/g" > docs/en/changes/changes.md
+
+    echo "Committing the changelog files..."
+    git add docs
+    git commit -m "Update the changelog files"
+
+    echo "Updating the menu.yml file..."
+    local new_menu_file=$(mktemp)
+    local major_version=$(echo ${RELEASE_VERSION} | cut -d. -f1)
+    yq '(.catalog[] | select(.name=="Changelog") | .catalog[] | 
select(.name=="'"${major_version}.x Releases"'") | .catalog) |= [{ "name": 
"'"${RELEASE_VERSION}"'", "path": "/en/changes/changes-'${RELEASE_VERSION}'" }] 
+ .' docs/menu.yml > ${new_menu_file}
+    mv ${new_menu_file} docs/menu.yml
+    git add docs
+    git commit -m "Update the menu.yml file"
+
+    echo "Pushing the changes to the remote repository..."
+    git push --set-upstream origin ${RELEASE_VERSION}-release
+
+    echo "Opening the PR..."
+    open 
https://github.com/apache/skywalking/pull/new/${RELEASE_VERSION}-release
+}
+
+upload_to_svn() {
+    local SRC_TAR="${SCRIPT_DIR}/${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz"
+    local BIN_TAR="${SCRIPT_DIR}/${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz"
+    local SVN_DIR="${SCRIPT_DIR}/svn-staging"
+    local SVN_VERSION_DIR="${SVN_DIR}/${RELEASE_VERSION}"
+
+    if [ -d "${SVN_DIR}" ]; then
+        rm -rf "${SVN_DIR}"
+    fi
+
+    echo "Checking out SVN dev directory..."
+    svn co --depth empty "${SVN_DEV_URL}" "${SVN_DIR}"
+
+    mkdir -p "${SVN_VERSION_DIR}"
+
+    cp "${SRC_TAR}" "${SRC_TAR}.asc" "${SRC_TAR}.sha512" "${SVN_VERSION_DIR}/"
+    cp "${BIN_TAR}" "${BIN_TAR}.asc" "${BIN_TAR}.sha512" "${SVN_VERSION_DIR}/"
+
+    cd "${SVN_DIR}"
+    svn add "${RELEASE_VERSION}"
+    svn commit -m "Upload Apache SkyWalking ${RELEASE_VERSION} release 
candidate"
+
+    echo "Artifacts uploaded to: ${SVN_DEV_URL}/${RELEASE_VERSION}"
+
+    rm -rf "${SVN_DIR}"
+}
+
+generate_vote_email() {
+    local TAG=v${RELEASE_VERSION}
+    local SRC_TAR="${SCRIPT_DIR}/${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz"
+    local BIN_TAR="${SCRIPT_DIR}/${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz"
+    local SRC_SHA512=$(cat "${SRC_TAR}.sha512")
+    local BIN_SHA512=$(cat "${BIN_TAR}.sha512")
+    local VOTE_DATE=$(date +"%B %d, %Y")
+
+    # Extract submodule commit IDs from the cloned release repo
+    local UI_COMMIT=$(git -C "${CLONE_DIR}" submodule status -- skywalking-ui 
| awk '{print $1}' | tr -d '+-')
+    local PROTOCOL_COMMIT=$(git -C "${CLONE_DIR}" submodule status -- 
apm-protocol/apm-network/src/main/proto | awk '{print $1}' | tr -d '+-')
+    local QUERY_COMMIT=$(git -C "${CLONE_DIR}" submodule status -- 
oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
 | awk '{print $1}' | tr -d '+-')
+
+    cat <<EOF
+
+========================================================================
+Vote Email - Copy and send to [email protected]
+========================================================================
+
+Mail title: [VOTE] Release Apache SkyWalking version ${RELEASE_VERSION}
+
+Mail content:
+Hi All,
+This is a call for vote to release Apache SkyWalking version 
${RELEASE_VERSION}.
+
+Release notes:
+
+ * 
https://github.com/apache/skywalking/blob/master/docs/en/changes/changes-${RELEASE_VERSION}.md
+
+Release Candidate:
+
+ * ${SVN_DEV_URL}/${RELEASE_VERSION}
+ * sha512 checksums
+   - ${SRC_SHA512}
+   - ${BIN_SHA512}
+
+Release Tag :
+
+ * (Git Tag) ${TAG}
+
+Release CommitID :
+
+ * https://github.com/apache/skywalking/tree/${TAG}
+ * Git submodule
+   * skywalking-ui: 
https://github.com/apache/skywalking-booster-ui/tree/${UI_COMMIT}
+   * apm-protocol/apm-network/src/main/proto: 
https://github.com/apache/skywalking-data-collect-protocol/tree/${PROTOCOL_COMMIT}
+   * 
oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
 https://github.com/apache/skywalking-query-protocol/tree/${QUERY_COMMIT}
+
+Keys to verify the Release Candidate :
+
+ * https://dist.apache.org/repos/dist/release/skywalking/KEYS
+
+Guide to build the release from source :
+
+ * 
https://github.com/apache/skywalking/blob/${TAG}/docs/en/guides/How-to-build.md
+
+Voting will start now (${VOTE_DATE}) and will remain open for at least 72 
hours, Request all PMC members to give their vote.
+[ ] +1 Release this package.
+[ ] +0 No opinion.
+[ ] -1 Do not release this package because....
+
+========================================================================
+
+EOF
+}
+
+# ========================== Main flow ==========================
+
+# Step 1: Check GPG signer
+echo "=== Step 1: Checking GPG signer ==="
+
+GPG_KEY_ID=$(git config user.signingkey 2>/dev/null || true)
+if [ -z "$GPG_KEY_ID" ]; then
+    echo "No git signing key configured. Trying default GPG key..."
+    GPG_KEY_ID=$(gpg --list-secret-keys --keyid-format LONG 2>/dev/null | grep 
-A1 '^sec' | tail -1 | awk '{print $1}' || true)
+fi
+
+if [ -z "$GPG_KEY_ID" ]; then
+    echo "ERROR: No GPG secret key found. Please configure a GPG key first."
+    exit 1
+fi
+
+GPG_UIDS=$(gpg --list-secret-keys --keyid-format LONG 2>/dev/null | grep 'uid' 
| sed 's/.*] //')
+GPG_EMAIL=$(echo "$GPG_UIDS" | grep -oE 
'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' | head -1)
+
+if [[ "$GPG_EMAIL" != *"@apache.org" ]]; then
+    echo "WARNING: GPG key email '${GPG_EMAIL}' is not an @apache.org address."
+    echo "Apache releases must be signed with an @apache.org GPG key."
+    exit 1
+fi
+
+echo "GPG Signer: ${GPG_UIDS}"
+echo "GPG Email:  ${GPG_EMAIL}"
+read -p "Is this the correct GPG signer? [y/N] " confirm
+if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
+    echo "Aborted."
+    exit 1
+fi
+
+# Step 2: Check required tools
+echo ""
+echo "=== Step 2: Checking required tools ==="
+
+MISSING_TOOLS=()
+for tool in gpg svn shasum git yq; do
+    if ! command -v "$tool" &>/dev/null; then
+        MISSING_TOOLS+=("$tool")
+    fi
+done
+
+if [ ${#MISSING_TOOLS[@]} -gt 0 ]; then
+    echo "ERROR: Missing required tools: ${MISSING_TOOLS[*]}"
+    exit 1
+fi
+
+echo "All required tools are available."
+
+# Step 3: Detect current version
+echo ""
+echo "=== Step 3: Detecting current version ==="
+
+CURRENT_VERSION=$(grep '<revision>' "${PROJECT_DIR}/pom.xml" | head -1 | sed 
's/.*<revision>\(.*\)<\/revision>.*/\1/')
+
+if [ -z "$CURRENT_VERSION" ]; then
+    echo "ERROR: Could not detect version from pom.xml."
+    exit 1
+fi
+
+echo "Current version: ${CURRENT_VERSION}"
+
+# Step 4: Calculate versions
+echo ""
+echo "=== Step 4: Calculating versions ==="
+
+RELEASE_VERSION="${CURRENT_VERSION%-SNAPSHOT}"
+
+if [ "$RELEASE_VERSION" == "$CURRENT_VERSION" ]; then
+    echo "WARNING: Current version '${CURRENT_VERSION}' does not end with 
-SNAPSHOT."
+    read -p "Continue with release version '${RELEASE_VERSION}'? [y/N] " 
confirm
+    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
+        echo "Aborted."
+        exit 1
+    fi
+fi
+
+MAJOR=$(echo "$RELEASE_VERSION" | cut -d. -f1)
+MINOR=$(echo "$RELEASE_VERSION" | cut -d. -f2)
+NEXT_MINOR=$((MINOR + 1))
+NEXT_RELEASE_VERSION="${MAJOR}.${NEXT_MINOR}.0"
+
+echo "Release version:      ${RELEASE_VERSION}"
+echo "Next dev version:     ${NEXT_RELEASE_VERSION}-SNAPSHOT"
+read -p "Are these versions correct? [y/N] " confirm
+if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
+    read -p "Enter release version: " RELEASE_VERSION
+    read -p "Enter next release version (without -SNAPSHOT): " 
NEXT_RELEASE_VERSION
+fi
+
+# Step 5: Clone and build
+echo ""
+echo "=== Step 5: Cloning repository and building release artifacts ==="
+clone_repo
+build_release_artifacts
+
+# Verify artifacts
+SRC_TAR="${SCRIPT_DIR}/${PRODUCT_NAME}-${RELEASE_VERSION}-src.tar.gz"
+BIN_TAR="${SCRIPT_DIR}/${PRODUCT_NAME}-${RELEASE_VERSION}-bin.tar.gz"
+
+for f in "${SRC_TAR}" "${SRC_TAR}.asc" "${SRC_TAR}.sha512" \
+         "${BIN_TAR}" "${BIN_TAR}.asc" "${BIN_TAR}.sha512"; do
+    if [ ! -f "$f" ]; then
+        echo "ERROR: Expected artifact not found: $f"
+        exit 1
+    fi
+done
+
+echo "All artifacts verified:"
+ls -lh "${SCRIPT_DIR}"/${PRODUCT_NAME}-${RELEASE_VERSION}-*
+
+# Step 6: Upload to SVN
+echo ""
+echo "=== Step 6: Uploading to SVN staging ==="
+upload_to_svn
+
+# Step 7: Generate vote email
+echo ""
+echo "=== Step 7: Generating vote email ==="
+generate_vote_email
+
+# Step 8: Next version
+echo ""
+echo "=== Step 8: Starting next version iteration ==="
+prepare_next_version
+
+echo ""
+echo 
"========================================================================="
+echo "Release process complete!"
+echo "  Release version: ${RELEASE_VERSION}"
+echo "  Next dev version: ${NEXT_RELEASE_VERSION}-SNAPSHOT"
+echo "  SVN staging: ${SVN_DEV_URL}/${RELEASE_VERSION}"
+echo ""
+echo "Next steps:"
+echo "  1. Send the vote email to [email protected]"
+echo "  2. Merge the next-version PR once the vote passes"
+echo 
"========================================================================="
diff --git a/tools/releasing/start_next_version.sh 
b/tools/releasing/start_next_version.sh
deleted file mode 100644
index 457bc69a7c..0000000000
--- a/tools/releasing/start_next_version.sh
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env bash
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# This script relies on few environment variables to determine source code 
package
-# behavior, those variables are:
-#   RELEASE_VERSION -- The version of this source package.
-#   NEXT_RELEASE_VERSION -- The version of the next release.
-# For example: RELEASE_VERSION=10.0.0, NEXT_RELEASE_VERSION=10.0.1
-
-set -e -o pipefail
-
-if [ "$RELEASE_VERSION" == "" ] || [ "$NEXT_RELEASE_VERSION" == "" ]; then
-  echo "RELEASE_VERSION or NEXT_RELEASE_VERSION environment variable not 
found."
-  echo "Please set the RELEASE_VERSION and NEXT_RELEASE_VERSION."
-  echo "For example: export RELEASE_VERSION=10.0.0"
-  echo "           : export NEXT_RELEASE_VERSION=10.0.1"
-  exit 1
-fi
-
-if ! command -v yq &> /dev/null; then
-  echo "yq is not installed. Please install yq first."
-  exit 1
-fi
-
-if [ -d "skywalking" ]; then
-  rm -rf skywalking
-fi
-
-echo "Cloning the repository..."
-git clone --recurse-submodules -j4 --depth 1 
https://github.com/apache/skywalking.git && cd skywalking
-
-echo "Checking out the release branch ${RELEASE_VERSION}-release..."
-git checkout -b ${RELEASE_VERSION}-release
-
-echo "Setting the next release version ${NEXT_RELEASE_VERSION} in pom.xml..."
-./mvnw versions:set-property -DgenerateBackupPoms=false -Dproperty=revision 
-DnewVersion=${NEXT_RELEASE_VERSION}-SNAPSHOT
-
-echo "Committing the pom.xml changes..."
-git add pom.xml
-git commit -m "Update the next release version to 
${NEXT_RELEASE_VERSION}-SNAPSHOT"
-
-echo "Moving the changelog file..."
-mv docs/en/changes/changes.md docs/en/changes/changes-$RELEASE_VERSION.md
-
-echo "Updating the changelog file..."
-cat docs/en/changes/changes.tpl | sed 
"s/NEXT_RELEASE_VERSION/${NEXT_RELEASE_VERSION}/g" > docs/en/changes/changes.md
-
-echo "Committing the changelog files..."
-git add docs
-git commit -m "Update the changelog files"
-
-echo "Updating the menu.yml file..."
-new_menu_file=$(mktemp)
-major_version=$(echo ${RELEASE_VERSION} | cut -d. -f1)
-yq '(.catalog[] | select(.name=="Changelog") | .catalog[] | 
select(.name=="'"${major_version}.x Releases"'") | .catalog) |= [{ "name": 
"'"${RELEASE_VERSION}"'", "path": "/en/changes/changes-'${RELEASE_VERSION}'" }] 
+ .' docs/menu.yml > ${new_menu_file}
-mv ${new_menu_file} docs/menu.yml
-git add docs
-git commit -m "Update the menu.yml file"
-
-echo "Pushing the changes to the remote repository..."
-git push --set-upstream origin ${RELEASE_VERSION}-release
-
-echo "Opening the PR..."
-open https://github.com/apache/skywalking/pull/new/${RELEASE_VERSION}-release

Reply via email to