From 3d3bf26b08b1471577bd01d6ba581461e9363f0d Mon Sep 17 00:00:00 2001
From: dervoeti
Date: Fri, 13 Jun 2025 15:19:03 +0200
Subject: [PATCH 1/4] feat: support custom product versions
---
kafka/Dockerfile | 33 +++++++++++++++++++++++----------
1 file changed, 23 insertions(+), 10 deletions(-)
diff --git a/kafka/Dockerfile b/kafka/Dockerfile
index 21cfa10f1..b819c276d 100644
--- a/kafka/Dockerfile
+++ b/kafka/Dockerfile
@@ -6,6 +6,7 @@ FROM stackable/image/kafka/kcat AS kcat
FROM stackable/image/java-devel AS kafka-builder
ARG PRODUCT
+ARG RELEASE
ARG SCALA
ARG OPA_AUTHORIZER
ARG JMX_EXPORTER
@@ -21,22 +22,34 @@ COPY --chown=${STACKABLE_USER_UID}:0 kafka/stackable/patches/${PRODUCT} /stackab
RUN <${ORIGINAL_VERSION}<\/kafka.version>/${NEW_VERSION}<\/kafka.version>/g" streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+sed -i "s/${ORIGINAL_VERSION}<\/version>/${NEW_VERSION}<\/version>/g" streams/quickstart/pom.xml
+sed -i "s/${ORIGINAL_VERSION}<\/version>/${NEW_VERSION}<\/version>/g" streams/quickstart/java/pom.xml
+
# Create snapshot of the source code including custom patches
-tar -czf /stackable/kafka-${PRODUCT}-src.tar.gz .
+tar -czf /stackable/kafka-${NEW_VERSION}-src.tar.gz .
# TODO: Try to install gradle via package manager (if possible) instead of fetching it from the internet
# We don't specify "-x test" to skip the tests, as we might bump some Kafka internal dependencies in the future and
# it's a good idea to run the tests in this case.
./gradlew clean releaseTarGz
./gradlew cyclonedxBom
-tar -xf core/build/distributions/kafka_${SCALA}-${PRODUCT}.tgz -C /stackable
-cp build/reports/bom.json /stackable/kafka_${SCALA}-${PRODUCT}.cdx.json
-rm -rf /stackable/kafka_${SCALA}-${PRODUCT}/site-docs/
+tar -xf core/build/distributions/kafka_${SCALA}-${NEW_VERSION}.tgz -C /stackable
+cp build/reports/bom.json /stackable/kafka_${SCALA}-${NEW_VERSION}.cdx.json
+rm -rf /stackable/kafka_${SCALA}-${NEW_VERSION}/site-docs/
(cd .. && rm -rf ${PRODUCT})
# TODO (@NickLarsenNZ): Compile from source: https://github.com/StyraInc/opa-kafka-plugin
curl https://repo.stackable.tech/repository/packages/kafka-opa-authorizer/opa-authorizer-${OPA_AUTHORIZER}-all.jar \
- -o /stackable/kafka_${SCALA}-${PRODUCT}/libs/opa-authorizer-${OPA_AUTHORIZER}-all.jar
+ -o /stackable/kafka_${SCALA}-${NEW_VERSION}/libs/opa-authorizer-${OPA_AUTHORIZER}-all.jar
# JMX exporter
curl https://repo.stackable.tech/repository/packages/jmx-exporter/jmx_prometheus_javaagent-${JMX_EXPORTER}.jar \
@@ -65,9 +78,9 @@ LABEL \
summary="The Stackable image for Apache Kafka." \
description="This image is deployed by the Stackable Operator for Apache Kafka."
-COPY --chown=${STACKABLE_USER_UID}:0 --from=kafka-builder /stackable/kafka_${SCALA}-${PRODUCT} /stackable/kafka_${SCALA}-${PRODUCT}
-COPY --chown=${STACKABLE_USER_UID}:0 --from=kafka-builder /stackable/kafka_${SCALA}-${PRODUCT}.cdx.json /stackable/kafka_${SCALA}-${PRODUCT}/kafka_${SCALA}-${PRODUCT}.cdx.json
-COPY --chown=${STACKABLE_USER_UID}:0 --from=kafka-builder /stackable/kafka-${PRODUCT}-src.tar.gz /stackable
+COPY --chown=${STACKABLE_USER_UID}:0 --from=kafka-builder /stackable/kafka_${SCALA}-${PRODUCT}-stackable${RELEASE} /stackable/kafka_${SCALA}-${PRODUCT}-stackable${RELEASE}
+COPY --chown=${STACKABLE_USER_UID}:0 --from=kafka-builder /stackable/kafka_${SCALA}-${PRODUCT}-stackable${RELEASE}.cdx.json /stackable/kafka_${SCALA}-${PRODUCT}-stackable${RELEASE}/kafka_${SCALA}-${PRODUCT}-stackable${RELEASE}.cdx.json
+COPY --chown=${STACKABLE_USER_UID}:0 --from=kafka-builder /stackable/kafka-${PRODUCT}-stackable${RELEASE}-src.tar.gz /stackable
COPY --chown=${STACKABLE_USER_UID}:0 --from=kafka-builder /stackable/jmx/ /stackable/jmx/
COPY --chown=${STACKABLE_USER_UID}:0 --from=kcat /stackable/kcat /stackable/bin/kcat-${KAFKA_KCAT}
COPY --chown=${STACKABLE_USER_UID}:0 --from=kcat /stackable/kcat-${KAFKA_KCAT}-src.tar.gz /stackable
@@ -94,13 +107,13 @@ chown -h ${STACKABLE_USER_UID}:0 /stackable/bin/kcat
# kcat was located in /stackable/kcat - legacy
ln -s /stackable/bin/kcat /stackable/kcat
chown -h ${STACKABLE_USER_UID}:0 /stackable/kcat
-ln -s /stackable/kafka_${SCALA}-${PRODUCT} /stackable/kafka
+ln -s /stackable/kafka_${SCALA}-${PRODUCT}-stackable${RELEASE} /stackable/kafka
chown -h ${STACKABLE_USER_UID}:0 /stackable/kafka
# fix missing permissions
chmod g=u /stackable/bin
chmod g=u /stackable/jmx
-chmod g=u /stackable/kafka_${SCALA}-${PRODUCT}
+chmod g=u /stackable/kafka_${SCALA}-${PRODUCT}-stackable${RELEASE}
chmod g=u /stackable/*-src.tar.gz
EOF
From 589ff1c04f0e9a3e225ec22f67cf14ac7788b476 Mon Sep 17 00:00:00 2001
From: dervoeti
Date: Fri, 13 Jun 2025 15:24:16 +0200
Subject: [PATCH 2/4] chore: changelog
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 37ecd583b..99b78c649 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -125,6 +125,7 @@ All notable changes to this project will be documented in this file.
- spark-connect-client: Remove `3.5.5` ([#1142]).
- spark-k8s: Remove the JMX exporter jar ([#1157]).
- zookeeper: Remove jmx exporter ([#1161]).
+- kafka: Enable custom versions ([#1171]).
[nifi-iceberg-bundle]: https://github.com/stackabletech/nifi-iceberg-bundle
[#1025]: https://github.com/stackabletech/docker-images/pull/1025
@@ -190,6 +191,7 @@ All notable changes to this project will be documented in this file.
[#1163]: https://github.com/stackabletech/docker-images/pull/1163
[#1165]: https://github.com/stackabletech/docker-images/pull/1165
[#1161]: https://github.com/stackabletech/docker-images/pull/1161
+[#1171]: https://github.com/stackabletech/docker-images/pull/1171
## [25.3.0] - 2025-03-21
From 672de7061f41af1e8913cff95439d1dc244b54fb Mon Sep 17 00:00:00 2001
From: dervoeti
Date: Wed, 18 Jun 2025 13:16:34 +0200
Subject: [PATCH 3/4] feat: move version patched to separate patch files
---
kafka/Dockerfile | 9 +-
.../0003-Build-custom-Stackable-version.patch | 116 ++++++++++++++
.../0003-Build-custom-Stackable-version.patch | 137 ++++++++++++++++
.../0003-Build-custom-Stackable-version.patch | 116 ++++++++++++++
.../0003-Build-custom-Stackable-version.patch | 147 ++++++++++++++++++
5 files changed, 517 insertions(+), 8 deletions(-)
create mode 100644 kafka/stackable/patches/3.7.2/0003-Build-custom-Stackable-version.patch
create mode 100644 kafka/stackable/patches/3.9.0/0003-Build-custom-Stackable-version.patch
create mode 100644 kafka/stackable/patches/3.9.1/0003-Build-custom-Stackable-version.patch
create mode 100644 kafka/stackable/patches/4.0.0/0003-Build-custom-Stackable-version.patch
diff --git a/kafka/Dockerfile b/kafka/Dockerfile
index b819c276d..85b4f3203 100644
--- a/kafka/Dockerfile
+++ b/kafka/Dockerfile
@@ -22,17 +22,10 @@ COPY --chown=${STACKABLE_USER_UID}:0 kafka/stackable/patches/${PRODUCT} /stackab
RUN <${ORIGINAL_VERSION}<\/kafka.version>/${NEW_VERSION}<\/kafka.version>/g" streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
-sed -i "s/${ORIGINAL_VERSION}<\/version>/${NEW_VERSION}<\/version>/g" streams/quickstart/pom.xml
-sed -i "s/${ORIGINAL_VERSION}<\/version>/${NEW_VERSION}<\/version>/g" streams/quickstart/java/pom.xml
+find . -type f -print0 | xargs -0 sed -i "s/\-stackable0\.0\.0\-dev/-stackable${RELEASE}/g"
# Create snapshot of the source code including custom patches
tar -czf /stackable/kafka-${NEW_VERSION}-src.tar.gz .
diff --git a/kafka/stackable/patches/3.7.2/0003-Build-custom-Stackable-version.patch b/kafka/stackable/patches/3.7.2/0003-Build-custom-Stackable-version.patch
new file mode 100644
index 000000000..d1b2e8241
--- /dev/null
+++ b/kafka/stackable/patches/3.7.2/0003-Build-custom-Stackable-version.patch
@@ -0,0 +1,116 @@
+From 508c8053273b091b599c5ab9804cee877483703f Mon Sep 17 00:00:00 2001
+From: dervoeti
+Date: Wed, 18 Jun 2025 12:15:17 +0200
+Subject: Build custom Stackable version
+
+---
+ docs/js/templateData.js | 2 +-
+ gradle.properties | 2 +-
+ kafka-merge-pr.py | 2 +-
+ streams/quickstart/java/pom.xml | 2 +-
+ .../java/src/main/resources/archetype-resources/pom.xml | 2 +-
+ streams/quickstart/pom.xml | 2 +-
+ tests/kafkatest/__init__.py | 2 +-
+ tests/kafkatest/version.py | 2 +-
+ 8 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/docs/js/templateData.js b/docs/js/templateData.js
+index 7700e24003..8affa51e55 100644
+--- a/docs/js/templateData.js
++++ b/docs/js/templateData.js
+@@ -19,6 +19,6 @@ limitations under the License.
+ var context={
+ "version": "37",
+ "dotVersion": "3.7",
+- "fullDotVersion": "3.7.2",
++ "fullDotVersion": "3.7.2-stackable0.0.0-dev",
+ "scalaVersion": "2.13"
+ };
+diff --git a/gradle.properties b/gradle.properties
+index 08ae0ded1e..779dcfb829 100644
+--- a/gradle.properties
++++ b/gradle.properties
+@@ -23,7 +23,7 @@ group=org.apache.kafka
+ # - streams/quickstart/pom.xml
+ # - streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+ # - streams/quickstart/java/pom.xml
+-version=3.7.2
++version=3.7.2-stackable0.0.0-dev
+ scalaVersion=2.13.12
+ # Adding swaggerVersion in gradle.properties to have a single version in place for swagger
+ # New version of Swagger 2.2.14 requires minimum JDK 11.
+diff --git a/kafka-merge-pr.py b/kafka-merge-pr.py
+index c16c811178..41b6794b8c 100755
+--- a/kafka-merge-pr.py
++++ b/kafka-merge-pr.py
+@@ -70,7 +70,7 @@ TEMP_BRANCH_PREFIX = "PR_TOOL"
+
+ DEV_BRANCH_NAME = "trunk"
+
+-DEFAULT_FIX_VERSION = os.environ.get("DEFAULT_FIX_VERSION", "3.7.2-SNAPSHOT")
++DEFAULT_FIX_VERSION = os.environ.get("DEFAULT_FIX_VERSION", "3.7.2-stackable0.0.0-dev-SNAPSHOT")
+
+ ORIGINAL_HEAD = ""
+
+diff --git a/streams/quickstart/java/pom.xml b/streams/quickstart/java/pom.xml
+index 1335f0d58b..e9e8cfe1ec 100644
+--- a/streams/quickstart/java/pom.xml
++++ b/streams/quickstart/java/pom.xml
+@@ -26,7 +26,7 @@
+
+ org.apache.kafka
+ streams-quickstart
+- 3.7.2
++ 3.7.2-stackable0.0.0-dev
+ ..
+
+
+diff --git a/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml b/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+index 445fab4b83..21cb230fc4 100644
+--- a/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
++++ b/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+@@ -29,7 +29,7 @@
+
+
+ UTF-8
+- 3.7.2
++ 3.7.2-stackable0.0.0-dev
+ 1.7.36
+
+
+diff --git a/streams/quickstart/pom.xml b/streams/quickstart/pom.xml
+index 94ac32fcac..2cc1fcd600 100644
+--- a/streams/quickstart/pom.xml
++++ b/streams/quickstart/pom.xml
+@@ -22,7 +22,7 @@
+ org.apache.kafka
+ streams-quickstart
+ pom
+- 3.7.2
++ 3.7.2-stackable0.0.0-dev
+
+ Kafka Streams :: Quickstart
+
+diff --git a/tests/kafkatest/__init__.py b/tests/kafkatest/__init__.py
+index 1c66c2bcfd..9274ce1fd0 100644
+--- a/tests/kafkatest/__init__.py
++++ b/tests/kafkatest/__init__.py
+@@ -22,4 +22,4 @@
+ # Instead, in development branches, the version should have a suffix of the form ".devN"
+ #
+ # For example, when Kafka is at version 1.0.0-SNAPSHOT, this should be something like "1.0.0.dev0"
+-__version__ = '3.7.2'
++__version__ = '3.7.2-stackable0.0.0-dev'
+diff --git a/tests/kafkatest/version.py b/tests/kafkatest/version.py
+index bed7cffac2..55dc3cbc7d 100644
+--- a/tests/kafkatest/version.py
++++ b/tests/kafkatest/version.py
+@@ -122,7 +122,7 @@ def get_version(node=None):
+ return DEV_BRANCH
+
+ DEV_BRANCH = KafkaVersion("dev")
+-DEV_VERSION = KafkaVersion("3.7.2-SNAPSHOT")
++DEV_VERSION = KafkaVersion("3.7.2-stackable0.0.0-dev")
+
+ LATEST_METADATA_VERSION = "3.7"
+
diff --git a/kafka/stackable/patches/3.9.0/0003-Build-custom-Stackable-version.patch b/kafka/stackable/patches/3.9.0/0003-Build-custom-Stackable-version.patch
new file mode 100644
index 000000000..d171307a6
--- /dev/null
+++ b/kafka/stackable/patches/3.9.0/0003-Build-custom-Stackable-version.patch
@@ -0,0 +1,137 @@
+From de4d98f9cd65d93bb4bb061c233f6647efc951f4 Mon Sep 17 00:00:00 2001
+From: dervoeti
+Date: Wed, 18 Jun 2025 12:16:46 +0200
+Subject: Build custom Stackable version
+
+---
+ docs/js/templateData.js | 2 +-
+ docs/streams/upgrade-guide.html | 2 +-
+ gradle.properties | 2 +-
+ kafka-merge-pr.py | 2 +-
+ streams/quickstart/java/pom.xml | 2 +-
+ .../java/src/main/resources/archetype-resources/pom.xml | 2 +-
+ streams/quickstart/pom.xml | 2 +-
+ tests/kafkatest/__init__.py | 2 +-
+ tests/kafkatest/version.py | 4 ++--
+ 9 files changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/docs/js/templateData.js b/docs/js/templateData.js
+index 13d352fc70..42d3549382 100644
+--- a/docs/js/templateData.js
++++ b/docs/js/templateData.js
+@@ -19,6 +19,6 @@ limitations under the License.
+ var context={
+ "version": "39",
+ "dotVersion": "3.9",
+- "fullDotVersion": "3.9.0",
++ "fullDotVersion": "3.9.0-stackable0.0.0-dev",
+ "scalaVersion": "2.13"
+ };
+diff --git a/docs/streams/upgrade-guide.html b/docs/streams/upgrade-guide.html
+index 6a30e6671b..6d2ecb81aa 100644
+--- a/docs/streams/upgrade-guide.html
++++ b/docs/streams/upgrade-guide.html
+@@ -133,7 +133,7 @@
+ More details about the new config StreamsConfig#TOPOLOGY_OPTIMIZATION
can be found in KIP-295.
+
+
+-
++
+
+
+ The introduction of KIP-1033
+diff --git a/gradle.properties b/gradle.properties
+index 0c14658608..b79ee9f0cf 100644
+--- a/gradle.properties
++++ b/gradle.properties
+@@ -23,7 +23,7 @@ group=org.apache.kafka
+ # - streams/quickstart/pom.xml
+ # - streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+ # - streams/quickstart/java/pom.xml
+-version=3.9.0
++version=3.9.0-stackable0.0.0-dev
+ scalaVersion=2.13.14
+ # Adding swaggerVersion in gradle.properties to have a single version in place for swagger
+ # New version of Swagger 2.2.14 requires minimum JDK 11.
+diff --git a/kafka-merge-pr.py b/kafka-merge-pr.py
+index a775a38435..4a7fbac34e 100755
+--- a/kafka-merge-pr.py
++++ b/kafka-merge-pr.py
+@@ -70,7 +70,7 @@ TEMP_BRANCH_PREFIX = "PR_TOOL"
+
+ DEV_BRANCH_NAME = "trunk"
+
+-DEFAULT_FIX_VERSION = os.environ.get("DEFAULT_FIX_VERSION", "3.9.0")
++DEFAULT_FIX_VERSION = os.environ.get("DEFAULT_FIX_VERSION", "3.9.0-stackable0.0.0-dev")
+
+ ORIGINAL_HEAD = ""
+
+diff --git a/streams/quickstart/java/pom.xml b/streams/quickstart/java/pom.xml
+index 78e1a70fa7..8698b4eb35 100644
+--- a/streams/quickstart/java/pom.xml
++++ b/streams/quickstart/java/pom.xml
+@@ -26,7 +26,7 @@
+
+ org.apache.kafka
+ streams-quickstart
+- 3.9.0
++ 3.9.0-stackable0.0.0-dev
+ ..
+
+
+diff --git a/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml b/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+index 2bc235eb16..90d566d1a0 100644
+--- a/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
++++ b/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+@@ -29,7 +29,7 @@
+
+
+ UTF-8
+- 3.9.0
++ 3.9.0-stackable0.0.0-dev
+ 1.7.36
+
+
+diff --git a/streams/quickstart/pom.xml b/streams/quickstart/pom.xml
+index b5101583ee..3c08985e2a 100644
+--- a/streams/quickstart/pom.xml
++++ b/streams/quickstart/pom.xml
+@@ -22,7 +22,7 @@
+ org.apache.kafka
+ streams-quickstart
+ pom
+- 3.9.0
++ 3.9.0-stackable0.0.0-dev
+
+ Kafka Streams :: Quickstart
+
+diff --git a/tests/kafkatest/__init__.py b/tests/kafkatest/__init__.py
+index a190e05067..0aa8fa7095 100644
+--- a/tests/kafkatest/__init__.py
++++ b/tests/kafkatest/__init__.py
+@@ -22,4 +22,4 @@
+ # Instead, in development branches, the version should have a suffix of the form ".devN"
+ #
+ # For example, when Kafka is at version 1.0.0-SNAPSHOT, this should be something like "1.0.0.dev0"
+-__version__ = '3.9.0'
++__version__ = '3.9.0-stackable0.0.0-dev'
+diff --git a/tests/kafkatest/version.py b/tests/kafkatest/version.py
+index 4825a46039..06fd3029f9 100644
+--- a/tests/kafkatest/version.py
++++ b/tests/kafkatest/version.py
+@@ -122,7 +122,7 @@ def get_version(node=None):
+ return DEV_BRANCH
+
+ DEV_BRANCH = KafkaVersion("dev")
+-DEV_VERSION = KafkaVersion("3.9.0-SNAPSHOT")
++DEV_VERSION = KafkaVersion("3.9.0-stackable0.0.0-dev")
+
+ # This should match the LATEST_PRODUCTION version defined in MetadataVersion.java
+ LATEST_STABLE_METADATA_VERSION = "3.9-IV0"
+@@ -276,5 +276,5 @@ V_3_8_0 = KafkaVersion("3.8.0")
+ LATEST_3_8 = V_3_8_0
+
+ # 3.9.x version
+-V_3_9_0 = KafkaVersion("3.9.0")
++V_3_9_0 = KafkaVersion("3.9.0-stackable0.0.0-dev")
+ LATEST_3_9 = V_3_9_0
diff --git a/kafka/stackable/patches/3.9.1/0003-Build-custom-Stackable-version.patch b/kafka/stackable/patches/3.9.1/0003-Build-custom-Stackable-version.patch
new file mode 100644
index 000000000..6f82eb285
--- /dev/null
+++ b/kafka/stackable/patches/3.9.1/0003-Build-custom-Stackable-version.patch
@@ -0,0 +1,116 @@
+From 89fe680ede7726e0df32f0ba1fb90a4216af7c69 Mon Sep 17 00:00:00 2001
+From: dervoeti
+Date: Wed, 18 Jun 2025 12:17:53 +0200
+Subject: Build custom Stackable version
+
+---
+ docs/configuration.html | 2 +-
+ docs/js/templateData.js | 2 +-
+ gradle.properties | 2 +-
+ streams/quickstart/java/pom.xml | 2 +-
+ .../java/src/main/resources/archetype-resources/pom.xml | 2 +-
+ streams/quickstart/pom.xml | 2 +-
+ tests/kafkatest/__init__.py | 2 +-
+ tests/kafkatest/version.py | 2 +-
+ 8 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/docs/configuration.html b/docs/configuration.html
+index f7c99623de..266236b54a 100644
+--- a/docs/configuration.html
++++ b/docs/configuration.html
+@@ -296,7 +296,7 @@
+ If users want to only enable some URLs, users need to explicitly set the system property like below.
+
-Dorg.apache.kafka.sasl.oauthbearer.allowed.urls=https://www.example.com,file:///tmp/token
+
+- Since: | 3.9.1 |
++ Since: | 3.9.1-stackable0.0.0-dev |
+ Default Value: | All URLs are allowed |
+
+
+diff --git a/docs/js/templateData.js b/docs/js/templateData.js
+index a1ed4601c7..57c854db36 100644
+--- a/docs/js/templateData.js
++++ b/docs/js/templateData.js
+@@ -19,6 +19,6 @@ limitations under the License.
+ var context={
+ "version": "39",
+ "dotVersion": "3.9",
+- "fullDotVersion": "3.9.1",
++ "fullDotVersion": "3.9.1-stackable0.0.0-dev",
+ "scalaVersion": "2.13"
+ };
+diff --git a/gradle.properties b/gradle.properties
+index 05598137fd..3f660d4ee5 100644
+--- a/gradle.properties
++++ b/gradle.properties
+@@ -23,7 +23,7 @@ group=org.apache.kafka
+ # - streams/quickstart/pom.xml
+ # - streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+ # - streams/quickstart/java/pom.xml
+-version=3.9.1
++version=3.9.1-stackable0.0.0-dev
+ scalaVersion=2.13.15
+ # Adding swaggerVersion in gradle.properties to have a single version in place for swagger
+ # New version of Swagger 2.2.14 requires minimum JDK 11.
+diff --git a/streams/quickstart/java/pom.xml b/streams/quickstart/java/pom.xml
+index 3d404de9c3..92735dffbc 100644
+--- a/streams/quickstart/java/pom.xml
++++ b/streams/quickstart/java/pom.xml
+@@ -26,7 +26,7 @@
+
+ org.apache.kafka
+ streams-quickstart
+- 3.9.1
++ 3.9.1-stackable0.0.0-dev
+ ..
+
+
+diff --git a/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml b/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+index 26af0e1dc3..b55640c1f0 100644
+--- a/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
++++ b/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+@@ -29,7 +29,7 @@
+
+
+ UTF-8
+- 3.9.1
++ 3.9.1-stackable0.0.0-dev
+ 1.7.36
+
+
+diff --git a/streams/quickstart/pom.xml b/streams/quickstart/pom.xml
+index f524e00445..05e8eee91a 100644
+--- a/streams/quickstart/pom.xml
++++ b/streams/quickstart/pom.xml
+@@ -22,7 +22,7 @@
+ org.apache.kafka
+ streams-quickstart
+ pom
+- 3.9.1
++ 3.9.1-stackable0.0.0-dev
+
+ Kafka Streams :: Quickstart
+
+diff --git a/tests/kafkatest/__init__.py b/tests/kafkatest/__init__.py
+index a8e4d4515c..36068eeb1a 100644
+--- a/tests/kafkatest/__init__.py
++++ b/tests/kafkatest/__init__.py
+@@ -22,4 +22,4 @@
+ # Instead, in development branches, the version should have a suffix of the form ".devN"
+ #
+ # For example, when Kafka is at version 1.0.0-SNAPSHOT, this should be something like "1.0.0.dev0"
+-__version__ = '3.9.1'
++__version__ = '3.9.1-stackable0.0.0-dev'
+diff --git a/tests/kafkatest/version.py b/tests/kafkatest/version.py
+index 99cb278226..cd8bcfab4b 100644
+--- a/tests/kafkatest/version.py
++++ b/tests/kafkatest/version.py
+@@ -122,7 +122,7 @@ def get_version(node=None):
+ return DEV_BRANCH
+
+ DEV_BRANCH = KafkaVersion("dev")
+-DEV_VERSION = KafkaVersion("3.9.1-SNAPSHOT")
++DEV_VERSION = KafkaVersion("3.9.1-stackable0.0.0-dev")
+
+ # This should match the LATEST_PRODUCTION version defined in MetadataVersion.java
+ LATEST_STABLE_METADATA_VERSION = "3.9-IV0"
diff --git a/kafka/stackable/patches/4.0.0/0003-Build-custom-Stackable-version.patch b/kafka/stackable/patches/4.0.0/0003-Build-custom-Stackable-version.patch
new file mode 100644
index 000000000..7bd7a54d9
--- /dev/null
+++ b/kafka/stackable/patches/4.0.0/0003-Build-custom-Stackable-version.patch
@@ -0,0 +1,147 @@
+From c10f92d49bb0d62047bd9b30d8345f0d305ce2d9 Mon Sep 17 00:00:00 2001
+From: dervoeti
+Date: Wed, 18 Jun 2025 12:27:48 +0200
+Subject: Build custom Stackable version
+
+---
+ committer-tools/kafka-merge-pr.py | 2 +-
+ docs/js/templateData.js | 2 +-
+ gradle.properties | 2 +-
+ streams/quickstart/java/pom.xml | 4 ++--
+ .../java/src/main/resources/archetype-resources/pom.xml | 4 ++--
+ streams/quickstart/pom.xml | 4 ++--
+ tests/kafkatest/__init__.py | 2 +-
+ tests/kafkatest/version.py | 4 ++--
+ 8 files changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/committer-tools/kafka-merge-pr.py b/committer-tools/kafka-merge-pr.py
+index 63439f3e0e..37ea789d97 100755
+--- a/committer-tools/kafka-merge-pr.py
++++ b/committer-tools/kafka-merge-pr.py
+@@ -70,7 +70,7 @@ TEMP_BRANCH_PREFIX = "PR_TOOL"
+
+ DEV_BRANCH_NAME = "trunk"
+
+-DEFAULT_FIX_VERSION = os.environ.get("DEFAULT_FIX_VERSION", "4.0.0")
++DEFAULT_FIX_VERSION = os.environ.get("DEFAULT_FIX_VERSION", "4.0.0-stackable0.0.0-dev")
+
+ ORIGINAL_HEAD = ""
+
+diff --git a/docs/js/templateData.js b/docs/js/templateData.js
+index 34c8a96b7c..b290225ff2 100644
+--- a/docs/js/templateData.js
++++ b/docs/js/templateData.js
+@@ -19,6 +19,6 @@ limitations under the License.
+ var context={
+ "version": "40",
+ "dotVersion": "4.0",
+- "fullDotVersion": "4.0.0",
++ "fullDotVersion": "4.0.0-stackable0.0.0-dev",
+ "scalaVersion": "2.13"
+ };
+diff --git a/gradle.properties b/gradle.properties
+index 76123e2ddb..9df17fe7df 100644
+--- a/gradle.properties
++++ b/gradle.properties
+@@ -23,7 +23,7 @@ group=org.apache.kafka
+ # - streams/quickstart/pom.xml
+ # - streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+ # - streams/quickstart/java/pom.xml
+-version=4.0.0
++version=4.0.0-stackable0.0.0-dev
+ scalaVersion=2.13.15
+ # Adding swaggerVersion in gradle.properties to have a single version in place for swagger
+ swaggerVersion=2.2.25
+diff --git a/streams/quickstart/java/pom.xml b/streams/quickstart/java/pom.xml
+index 4be34da1e5..7062b6b304 100644
+--- a/streams/quickstart/java/pom.xml
++++ b/streams/quickstart/java/pom.xml
+@@ -17,7 +17,7 @@
+
+
+- 4.0.0
++ 4.0.0-stackable0.0.0-dev
+
+
+ UTF-8
+@@ -26,7 +26,7 @@
+
+ org.apache.kafka
+ streams-quickstart
+- 4.0.0
++ 4.0.0-stackable0.0.0-dev
+ ..
+
+
+diff --git a/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml b/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+index 88faaf684d..f66ae44f6d 100644
+--- a/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
++++ b/streams/quickstart/java/src/main/resources/archetype-resources/pom.xml
+@@ -18,7 +18,7 @@
+
+- 4.0.0
++ 4.0.0-stackable0.0.0-dev
+
+ ${groupId}
+ ${artifactId}
+@@ -29,7 +29,7 @@
+
+
+ UTF-8
+- 4.0.0
++ 4.0.0-stackable0.0.0-dev
+ 2.0.16
+
+
+diff --git a/streams/quickstart/pom.xml b/streams/quickstart/pom.xml
+index c505105c5c..9d0a0b6698 100644
+--- a/streams/quickstart/pom.xml
++++ b/streams/quickstart/pom.xml
+@@ -17,12 +17,12 @@
+
+
+- 4.0.0
++ 4.0.0-stackable0.0.0-dev
+
+ org.apache.kafka
+ streams-quickstart
+ pom
+- 4.0.0
++ 4.0.0-stackable0.0.0-dev
+
+ Kafka Streams :: Quickstart
+
+diff --git a/tests/kafkatest/__init__.py b/tests/kafkatest/__init__.py
+index cf0b298a5d..9829aef366 100644
+--- a/tests/kafkatest/__init__.py
++++ b/tests/kafkatest/__init__.py
+@@ -22,4 +22,4 @@
+ # Instead, in development branches, the version should have a suffix of the form ".devN"
+ #
+ # For example, when Kafka is at version 1.0.0-SNAPSHOT, this should be something like "1.0.0.dev0"
+-__version__ = '4.0.0'
++__version__ = '4.0.0-stackable0.0.0-dev'
+diff --git a/tests/kafkatest/version.py b/tests/kafkatest/version.py
+index 38d6cb443c..6c49b6fb50 100644
+--- a/tests/kafkatest/version.py
++++ b/tests/kafkatest/version.py
+@@ -110,7 +110,7 @@ def get_version(node=None):
+ return DEV_BRANCH
+
+ DEV_BRANCH = KafkaVersion("dev")
+-DEV_VERSION = KafkaVersion("4.0.0-SNAPSHOT")
++DEV_VERSION = KafkaVersion("4.0.0-stackable0.0.0-dev")
+
+ LATEST_STABLE_TRANSACTION_VERSION = 2
+ # This should match the LATEST_PRODUCTION version defined in MetadataVersion.java
+@@ -235,5 +235,5 @@ V_3_9_0 = KafkaVersion("3.9.0")
+ LATEST_3_9 = V_3_9_0
+
+ # 4.0.x version
+-V_4_0_0 = KafkaVersion("4.0.0")
++V_4_0_0 = KafkaVersion("4.0.0-stackable0.0.0-dev")
+ LATEST_4_0 = V_4_0_0
From b06732c3d19c9981cc0da0a392a410c89ffc50e0 Mon Sep 17 00:00:00 2001
From: Lukas Krug
Date: Wed, 18 Jun 2025 12:33:53 +0200
Subject: [PATCH 4/4] fix: Hive 4.0.0 build (#1182)
---
hive/Dockerfile | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hive/Dockerfile b/hive/Dockerfile
index dc5bbc0c1..25a863892 100644
--- a/hive/Dockerfile
+++ b/hive/Dockerfile
@@ -47,7 +47,8 @@ cp -r /stackable/patched-libs/maven/* /stackable/.m2/repository
NEW_VERSION="${PRODUCT}-stackable${RELEASE}"
-mvn versions:set -DnewVersion=$NEW_VERSION -DartifactId=* -DgroupId=*
+# generateBackupPoms=false is needed for the Hive 4.0.0 build to succeed, otherwise it fails with the obscure reason: `Too many files with unapproved license`
+mvn versions:set -DnewVersion=$NEW_VERSION -DartifactId=* -DgroupId=* -DgenerateBackupPoms=false
# Create snapshot of the source code including custom patches
tar -czf /stackable/hive-${NEW_VERSION}-src.tar.gz .