From 3941f3f7bf7fed66ccda37a9d5c088c9cf0285d4 Mon Sep 17 00:00:00 2001 From: Hong-Yi Chen Date: Tue, 14 Oct 2025 22:38:05 +0800 Subject: [PATCH 1/6] build: upgrade release tool to JDK 25 --- release/release.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/release/release.py b/release/release.py index 92b76dee1e3ee..6184edcb4b555 100644 --- a/release/release.py +++ b/release/release.py @@ -89,7 +89,7 @@ def get_jdk(version): else: jdk_java_home = jdk_env["JAVA_HOME"] java_version = execute(f"{jdk_java_home}/bin/java -version", env=jdk_env) if (version == 8 and "1.8.0" not in java_version) or \ - (f"{version}.0" not in java_version and '"{version}"' not in java_version): + (f"{version}.0" not in java_version and f'"{version}"' not in java_version): preferences.unset(key) fail(f"JDK {version} is required") return jdk_env @@ -127,14 +127,14 @@ def command_stage_docs(): if not os.path.exists(kafka_site_repo_path) or not os.path.exists(os.path.join(kafka_site_repo_path, "powered-by.html")): fail("{kafka_site_repo_path} doesn't exist or does not appear to be the kafka-site repository") - jdk21_env = get_jdk(21) + jdk25_env = get_jdk(25) # We explicitly override the version of the project that we normally get from gradle.properties since we want to be # able to run this from a release branch where we made some updates, but the build would show an incorrect SNAPSHOT # version due to already having bumped the bugfix version number. gradle_version_override = detect_docs_release_version(project_version) - cmd("Building docs", f"./gradlew -Pversion={gradle_version_override} clean siteDocsTar aggregatedJavadoc", cwd=repo_dir, env=jdk21_env) + cmd("Building docs", f"./gradlew -Pversion={gradle_version_override} clean siteDocsTar aggregatedJavadoc", cwd=repo_dir, env=jdk25_env) docs_tar = os.path.join(repo_dir, "core", "build", "distributions", f"kafka_2.13-{gradle_version_override}-site-docs.tgz") @@ -229,7 +229,7 @@ def verify_gpg_key(): preferences.once(f"verify_gpg_key_{gpg_key_pass_id}", verify_gpg_key) apache_id = preferences.get('apache_id', lambda: prompt("Please enter your apache-id: ")) -jdk21_env = get_jdk(21) +jdk25_env = get_jdk(25) def verify_prerequisites(): @@ -328,9 +328,9 @@ def delete_gitrefs(): git.targz(rc_tag, f"kafka-{release_version}-src/", f"{artifacts_dir}/kafka-{release_version}-src.tgz") -cmd("Building artifacts", "./gradlew clean && ./gradlew releaseTarGz -PscalaVersion=2.13", cwd=kafka_dir, env=jdk21_env, shell=True) +cmd("Building artifacts", "./gradlew clean && ./gradlew releaseTarGz -PscalaVersion=2.13", cwd=kafka_dir, env=jdk25_env, shell=True) cmd("Copying artifacts", f"cp {kafka_dir}/core/build/distributions/* {artifacts_dir}", shell=True) -cmd("Building docs", "./gradlew clean aggregatedJavadoc", cwd=kafka_dir, env=jdk21_env) +cmd("Building docs", "./gradlew clean aggregatedJavadoc", cwd=kafka_dir, env=jdk25_env) cmd("Copying docs", f"cp -R {kafka_dir}/build/docs/javadoc {artifacts_dir}") for filename in os.listdir(artifacts_dir): @@ -355,8 +355,8 @@ def delete_gitrefs(): svn.commit_artifacts(rc_tag, artifacts_dir, work_dir) confirm_or_fail("Going to build and upload mvn artifacts based on these settings:\n" + textfiles.read(global_gradle_props) + '\nOK?') -cmd("Building and uploading archives", "./gradlew publish -PscalaVersion=2.13", cwd=kafka_dir, env=jdk21_env, shell=True) -cmd("Building and uploading archives", "mvn deploy -Pgpg-signing", cwd=os.path.join(kafka_dir, "streams/quickstart"), env=jdk21_env, shell=True) +cmd("Building and uploading archives", "./gradlew publish -PscalaVersion=2.13", cwd=kafka_dir, env=jdk25_env, shell=True) +cmd("Building and uploading archives", "mvn deploy -Pgpg-signing", cwd=os.path.join(kafka_dir, "streams/quickstart"), env=jdk25_env, shell=True) # TODO: Many of these suggested validation steps could be automated # and would help pre-validate a lot of the stuff voters test From b715387d1838dbff636ac0bbf8d7074114d30e79 Mon Sep 17 00:00:00 2001 From: Hong-Yi Chen Date: Tue, 14 Oct 2025 22:38:19 +0800 Subject: [PATCH 2/6] fix: make has_staged_changes/has_unstaged_changes return booleans --- release/git.py | 15 +++++++++++++-- release/release.py | 4 ++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/release/git.py b/release/git.py index 02d7dc8cbe284..17126e98986b7 100644 --- a/release/git.py +++ b/release/git.py @@ -20,6 +20,7 @@ """ import os +import subprocess from runtime import repo_dir, execute, cmd @@ -33,12 +34,22 @@ def __defaults(kwargs): def has_staged_changes(**kwargs): __defaults(kwargs) - execute("git diff --cached --exit-code --quiet", **kwargs) + try: + # 0: no staged changes; non-zero: there are staged changes + execute("git diff --cached --exit-code --quiet", **kwargs) + return False + except subprocess.CalledProcessError: + return True def has_unstaged_changes(**kwargs): __defaults(kwargs) - execute("git diff --exit-code --quiet", **kwargs) + try: + # 0: no unstaged changes; non-zero: there are unstaged changes + execute("git diff --exit-code --quiet", **kwargs) + return False + except subprocess.CalledProcessError: + return True def fetch_tags(remote=push_remote_name, **kwargs): diff --git a/release/release.py b/release/release.py index 6184edcb4b555..3b3feace6034d 100644 --- a/release/release.py +++ b/release/release.py @@ -245,8 +245,8 @@ def prereq(name, soft_check): fail(f"Pre-requisite not met: {name}. Error: {e}") prereq('Apache Maven CLI (mvn) in PATH', lambda: "Apache Maven" in execute("mvn -v")) prereq("svn CLI in PATH", lambda: "svn" in execute("svn --version")) - prereq("Verifying that you have no unstaged git changes", lambda: git.has_unstaged_changes()) - prereq("Verifying that you have no staged git changes", lambda: git.has_staged_changes()) + prereq("Verifying that you have no unstaged git changes", lambda: not git.has_unstaged_changes()) + prereq("Verifying that you have no staged git changes", lambda: not git.has_staged_changes()) return True From ddacb45cd9f22a7414387f463a73054d9cb949a5 Mon Sep 17 00:00:00 2001 From: Hong-Yi Chen Date: Tue, 14 Oct 2025 22:05:21 +0800 Subject: [PATCH 3/6] fix: add --no-parallel to aggregatedJavadoc to avoid build failures --- release/release.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release/release.py b/release/release.py index 3b3feace6034d..bb9050d7f8ee9 100644 --- a/release/release.py +++ b/release/release.py @@ -134,7 +134,7 @@ def command_stage_docs(): # version due to already having bumped the bugfix version number. gradle_version_override = detect_docs_release_version(project_version) - cmd("Building docs", f"./gradlew -Pversion={gradle_version_override} clean siteDocsTar aggregatedJavadoc", cwd=repo_dir, env=jdk25_env) + cmd("Building docs", f"./gradlew -Pversion={gradle_version_override} clean siteDocsTar aggregatedJavadoc --no-parallel", cwd=repo_dir, env=jdk25_env) docs_tar = os.path.join(repo_dir, "core", "build", "distributions", f"kafka_2.13-{gradle_version_override}-site-docs.tgz") @@ -330,7 +330,7 @@ def delete_gitrefs(): git.targz(rc_tag, f"kafka-{release_version}-src/", f"{artifacts_dir}/kafka-{release_version}-src.tgz") cmd("Building artifacts", "./gradlew clean && ./gradlew releaseTarGz -PscalaVersion=2.13", cwd=kafka_dir, env=jdk25_env, shell=True) cmd("Copying artifacts", f"cp {kafka_dir}/core/build/distributions/* {artifacts_dir}", shell=True) -cmd("Building docs", "./gradlew clean aggregatedJavadoc", cwd=kafka_dir, env=jdk25_env) +cmd("Building docs", "./gradlew clean aggregatedJavadoc --no-parallel", cwd=kafka_dir, env=jdk25_env) cmd("Copying docs", f"cp -R {kafka_dir}/build/docs/javadoc {artifacts_dir}") for filename in os.listdir(artifacts_dir): From 33dcc69e69c863ad33a3306ada1751af56165812 Mon Sep 17 00:00:00 2001 From: Hong-Yi Chen Date: Thu, 16 Oct 2025 01:46:51 +0800 Subject: [PATCH 4/6] fix: disable parallel execution only for aggregatedJavadoc to avoid performance impact on the siteDocsTar task --- release/release.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/release/release.py b/release/release.py index bb9050d7f8ee9..4e5919bd38009 100644 --- a/release/release.py +++ b/release/release.py @@ -134,7 +134,10 @@ def command_stage_docs(): # version due to already having bumped the bugfix version number. gradle_version_override = detect_docs_release_version(project_version) - cmd("Building docs", f"./gradlew -Pversion={gradle_version_override} clean siteDocsTar aggregatedJavadoc --no-parallel", cwd=repo_dir, env=jdk25_env) + cmd("Building docs",f"./gradlew -Pversion={gradle_version_override} clean siteDocsTar", cwd=repo_dir, env=jdk25_env,) + # Disable parallel execution for aggregatedJavadoc due to Gradle 9 issues + cmd("Building docs", f"./gradlew -Pversion={gradle_version_override} aggregatedJavadoc --no-parallel", cwd=repo_dir, env=jdk25_env,) + docs_tar = os.path.join(repo_dir, "core", "build", "distributions", f"kafka_2.13-{gradle_version_override}-site-docs.tgz") From e04d1e12cbb8abc0e9e50f1daa3b2ca74ba3a1c7 Mon Sep 17 00:00:00 2001 From: Hong-Yi Chen Date: Sat, 18 Oct 2025 15:23:05 +0800 Subject: [PATCH 5/6] Address comments --- release/git.py | 21 ++++++--------------- release/release.py | 4 ++-- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/release/git.py b/release/git.py index 17126e98986b7..3fe47d721a2f1 100644 --- a/release/git.py +++ b/release/git.py @@ -20,7 +20,6 @@ """ import os -import subprocess from runtime import repo_dir, execute, cmd @@ -32,24 +31,16 @@ def __defaults(kwargs): kwargs["cwd"] = repo_dir -def has_staged_changes(**kwargs): +def ensure_no_staged_changes(**kwargs): __defaults(kwargs) - try: - # 0: no staged changes; non-zero: there are staged changes - execute("git diff --cached --exit-code --quiet", **kwargs) - return False - except subprocess.CalledProcessError: - return True + execute("git diff --cached --exit-code --quiet", **kwargs) + return True -def has_unstaged_changes(**kwargs): +def ensure_no_unstaged_changes(**kwargs): __defaults(kwargs) - try: - # 0: no unstaged changes; non-zero: there are unstaged changes - execute("git diff --exit-code --quiet", **kwargs) - return False - except subprocess.CalledProcessError: - return True + execute("git diff --exit-code --quiet", **kwargs) + return True def fetch_tags(remote=push_remote_name, **kwargs): diff --git a/release/release.py b/release/release.py index 4e5919bd38009..2620d449f8a63 100644 --- a/release/release.py +++ b/release/release.py @@ -248,8 +248,8 @@ def prereq(name, soft_check): fail(f"Pre-requisite not met: {name}. Error: {e}") prereq('Apache Maven CLI (mvn) in PATH', lambda: "Apache Maven" in execute("mvn -v")) prereq("svn CLI in PATH", lambda: "svn" in execute("svn --version")) - prereq("Verifying that you have no unstaged git changes", lambda: not git.has_unstaged_changes()) - prereq("Verifying that you have no staged git changes", lambda: not git.has_staged_changes()) + prereq("Verifying that you have no unstaged git changes", lambda: git.ensure_no_unstaged_changes()) + prereq("Verifying that you have no staged git changes", lambda: git.ensure_no_staged_changes()) return True From 4adce367cb1b74e7e9b34cb68ff4fce3087d98dd Mon Sep 17 00:00:00 2001 From: Hong-Yi Chen Date: Wed, 22 Oct 2025 07:00:33 +0800 Subject: [PATCH 6/6] Address comments --- release/templates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/templates.py b/release/templates.py index 2f9f07b0e3c1e..528b6732c1a8b 100644 --- a/release/templates.py +++ b/release/templates.py @@ -25,7 +25,7 @@ def requirements_instructions(prefs_file, prefs): return f""" Requirements: 1. Updated docs to reference the new release version where appropriate. -2. JDK8 and JDK17 compilers and libraries +2. JDK25 compiler and libraries 3. Your Apache ID, already configured with SSH keys on id.apache.org and SSH keys available in this shell session 4. All issues in the target release resolved with valid resolutions (if not, this script will report the problematic JIRAs) 5. A GPG key used for signing the release. This key should have been added to public Apache servers and the KEYS file on the Kafka site