From 93e1e5ad5169d763a6484d36ac8c03e8293d798b Mon Sep 17 00:00:00 2001 From: Aman Poonia Date: Mon, 5 Oct 2026 21:53:50 +0530 Subject: [PATCH] HBASE-30458 Allow selecting the JDK version in dev-support/hbase_docker build Add a --jdk 8|17|21 option to build-hbase.sh, passed to the Dockerfiles as the JDK_VERSION build arg. DEFAULT_JDK is 17 on master (8 on branch-2). Co-Authored-By: Claude Sonnet 5.5 --- dev-support/hbase_docker/Dockerfile | 34 ++++++++++++------ dev-support/hbase_docker/README.md | 2 +- dev-support/hbase_docker/build-hbase.sh | 47 ++++++++++++++++++++++++- dev-support/hbase_docker/m1/Dockerfile | 34 ++++++++++++------ 4 files changed, 93 insertions(+), 24 deletions(-) diff --git a/dev-support/hbase_docker/Dockerfile b/dev-support/hbase_docker/Dockerfile index 07391f6f9583..4b7b15349402 100644 --- a/dev-support/hbase_docker/Dockerfile +++ b/dev-support/hbase_docker/Dockerfile @@ -38,12 +38,24 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] RUN curl --location --fail --silent --show-error --output /tmp/maven.tar.gz "${MAVEN_URL}" && \ echo "${MAVEN_SHA512} */tmp/maven.tar.gz" | sha512sum -c - -FROM base_image AS openjdk8_download_image -ENV OPENJDK8_URL 'https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u352-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u352b08.tar.gz' -ENV OPENJDK8_SHA256 '1633bd7590cb1cd72f5a1378ae8294451028b274d798e2a4ac672059a2f00fee' +# JDK pins mirror dev-support/docker/Dockerfile; keep them in sync. +FROM base_image AS jdk_download_image +ARG JDK_VERSION=17 SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN curl --location --fail --silent --show-error --output /tmp/adoptopenjdk8.tar.gz "${OPENJDK8_URL}" && \ - echo "${OPENJDK8_SHA256} */tmp/adoptopenjdk8.tar.gz" | sha256sum -c - +RUN case "${JDK_VERSION}" in \ + 8) \ + JDK_URL='https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u412-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u412b08.tar.gz'; \ + JDK_SHA256='b9884a96f78543276a6399c3eb8c2fd8a80e6b432ea50e87d3d12d495d1d2808' ;; \ + 17) \ + JDK_URL='https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.11%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.11_9.tar.gz'; \ + JDK_SHA256='aa7fb6bb342319d227a838af5c363bfa1b4a670c209372f9e6585bd79da6220c' ;; \ + 21) \ + JDK_URL='https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.12.1%2B1/OpenJDK21U-jdk_x64_linux_hotspot_21.0.12.1_1.tar.gz'; \ + JDK_SHA256='ce79869e1307ed8ee1e2baa86a412b1eb5b75d10a01006d788a6f968bcfaee94' ;; \ + *) echo "Unsupported JDK_VERSION: ${JDK_VERSION} (supported: 8, 17, 21)" >&2; exit 1 ;; \ + esac && \ + curl --location --fail --silent --show-error --output /tmp/jdk.tar.gz "${JDK_URL}" && \ + echo "${JDK_SHA256} */tmp/jdk.tar.gz" | sha256sum -c - FROM base_image SHELL ["/bin/bash", "-o", "pipefail", "-c"] @@ -60,15 +72,15 @@ RUN tar xzf /tmp/maven.tar.gz -C /opt && \ rm /tmp/maven.tar.gz # hadolint ignore=DL3010 -COPY --from=openjdk8_download_image /tmp/adoptopenjdk8.tar.gz /tmp/adoptopenjdk8.tar.gz +COPY --from=jdk_download_image /tmp/jdk.tar.gz /tmp/jdk.tar.gz +ARG JDK_VERSION=17 RUN mkdir -p /usr/lib/jvm && \ - tar xzf /tmp/adoptopenjdk8.tar.gz -C /usr/lib/jvm && \ - ln -s "/usr/lib/jvm/$(basename "$(tar -tf /tmp/adoptopenjdk8.tar.gz | head -n1)")" /usr/lib/jvm/java-8-adoptopenjdk && \ - ln -s /usr/lib/jvm/java-8-adoptopenjdk /usr/lib/jvm/java-8 && \ - rm /tmp/adoptopenjdk8.tar.gz + tar xzf /tmp/jdk.tar.gz -C /usr/lib/jvm && \ + ln -s "/usr/lib/jvm/$(basename "$(tar -tf /tmp/jdk.tar.gz | head -n1)")" "/usr/lib/jvm/java-${JDK_VERSION}" && \ + rm /tmp/jdk.tar.gz ENV MAVEN_HOME '/opt/maven' -ENV JAVA_HOME '/usr/lib/jvm/java-8' +ENV JAVA_HOME="/usr/lib/jvm/java-${JDK_VERSION}" ENV PATH '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' ENV PATH "${JAVA_HOME}/bin:${MAVEN_HOME}/bin:${PATH}" diff --git a/dev-support/hbase_docker/README.md b/dev-support/hbase_docker/README.md index 0890b9b02254..10bb4ea5df82 100644 --- a/dev-support/hbase_docker/README.md +++ b/dev-support/hbase_docker/README.md @@ -332,7 +332,7 @@ After build: - HBase source code at `/root/hbase/` - Built HBase binaries at `/root/hbase-bin/` - Maven 3.8.6 at `/opt/maven/` -- Java 8 (Temurin JDK) +- Temurin JDK 8, 17 or 21 (selected with `--jdk`; default set per branch) - All Maven dependencies cached ### Build Context Control diff --git a/dev-support/hbase_docker/build-hbase.sh b/dev-support/hbase_docker/build-hbase.sh index 2f9f058bdbbb..1343be72aff0 100755 --- a/dev-support/hbase_docker/build-hbase.sh +++ b/dev-support/hbase_docker/build-hbase.sh @@ -26,11 +26,16 @@ set -e # ./build-hbase.sh --tarball hbase-2.6.7.tar.gz # Build from tarball # ./build-hbase.sh --source /path/to/hbase # Build from local dir # ./build-hbase.sh --source . # Build from current repo +# ./build-hbase.sh --tag branch-2.6 --jdk 8 # Choose the JDK (8, 17 or 21) # ./build-hbase.sh --help # Show help SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" LOG_FILE="${LOG_FILE:-/tmp/hbase-docker-build.log}" DEFAULT_IMAGE_NAME="hbase_local" +# JDK used when --jdk is not given. Set per branch: 17 on master, 8 on branch-2. +DEFAULT_JDK="17" +SUPPORTED_JDKS="8 17 21" +JDK_VERSION="$DEFAULT_JDK" # On Apple Silicon (arm64), use m1/Dockerfile which is tuned for Rosetta emulation. # Both cases build linux/amd64 images; m1/Dockerfile just handles arm64 host quirks. @@ -96,7 +101,7 @@ check_prerequisites() { # Help #============================================================================= show_help() { - cat <<'EOF' + cat <&1 | tee "$LOG_FILE" @@ -179,6 +191,7 @@ build_from_tarball() { echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "Tarball: $tarball_path" echo "Image name: $image_name" + echo "JDK: $JDK_VERSION" echo "Log file: $LOG_FILE" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo @@ -203,6 +216,7 @@ build_from_tarball() { docker build --platform "$PLATFORM" \ -f "$DOCKERFILE" \ --build-arg INPUT_MODE=tarball \ + --build-arg JDK_VERSION="$JDK_VERSION" \ -t "$image_name" \ "$SCRIPT_DIR" 2>&1 | tee "$LOG_FILE" @@ -230,6 +244,7 @@ build_from_source() { echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "Source: $source_path" echo "Image name: $image_name" + echo "JDK: $JDK_VERSION" echo "Log file: $LOG_FILE" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo @@ -268,6 +283,7 @@ DOCKERIGNORE docker build --platform "$PLATFORM" \ --build-arg INPUT_MODE=source-dir \ + --build-arg JDK_VERSION="$JDK_VERSION" \ -f "$temp_dockerfile/Dockerfile" \ -t "$image_name" \ "$source_path" 2>&1 | tee "$LOG_FILE" @@ -336,6 +352,35 @@ main() { local value="" local image_name="$DEFAULT_IMAGE_NAME" + # Extract --jdk (position-independent); the rest stays positional + local args=() + while [ $# -gt 0 ]; do + case "$1" in + --jdk) + if [ $# -lt 2 ] || [ -z "$2" ]; then + echo "❌ ERROR: --jdk requires a value (supported: $SUPPORTED_JDKS)" + exit 1 + fi + JDK_VERSION="$2" + shift 2 + ;; + --jdk=*) + JDK_VERSION="${1#--jdk=}" + shift + ;; + *) + args+=("$1") + shift + ;; + esac + done + set -- "${args[@]+"${args[@]}"}" + + if [[ " $SUPPORTED_JDKS " != *" $JDK_VERSION "* ]]; then + echo "❌ ERROR: Unsupported JDK version: $JDK_VERSION (supported: $SUPPORTED_JDKS)" + exit 1 + fi + # Parse arguments case "${1:-}" in --help|-h) diff --git a/dev-support/hbase_docker/m1/Dockerfile b/dev-support/hbase_docker/m1/Dockerfile index 80f8a3b1c8cb..cff625691b64 100644 --- a/dev-support/hbase_docker/m1/Dockerfile +++ b/dev-support/hbase_docker/m1/Dockerfile @@ -38,12 +38,24 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] RUN curl --location --fail --silent --show-error --output /tmp/maven.tar.gz "${MAVEN_URL}" && \ echo "${MAVEN_SHA512} */tmp/maven.tar.gz" | sha512sum -c - -FROM base_image AS openjdk8_download_image -ENV OPENJDK8_URL 'https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u352-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u352b08.tar.gz' -ENV OPENJDK8_SHA256 '1633bd7590cb1cd72f5a1378ae8294451028b274d798e2a4ac672059a2f00fee' +# JDK pins mirror dev-support/docker/Dockerfile; keep them in sync. +FROM base_image AS jdk_download_image +ARG JDK_VERSION=17 SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN curl --location --fail --silent --show-error --output /tmp/adoptopenjdk8.tar.gz "${OPENJDK8_URL}" && \ - echo "${OPENJDK8_SHA256} */tmp/adoptopenjdk8.tar.gz" | sha256sum -c - +RUN case "${JDK_VERSION}" in \ + 8) \ + JDK_URL='https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u412-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u412b08.tar.gz'; \ + JDK_SHA256='b9884a96f78543276a6399c3eb8c2fd8a80e6b432ea50e87d3d12d495d1d2808' ;; \ + 17) \ + JDK_URL='https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.11%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.11_9.tar.gz'; \ + JDK_SHA256='aa7fb6bb342319d227a838af5c363bfa1b4a670c209372f9e6585bd79da6220c' ;; \ + 21) \ + JDK_URL='https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.12.1%2B1/OpenJDK21U-jdk_x64_linux_hotspot_21.0.12.1_1.tar.gz'; \ + JDK_SHA256='ce79869e1307ed8ee1e2baa86a412b1eb5b75d10a01006d788a6f968bcfaee94' ;; \ + *) echo "Unsupported JDK_VERSION: ${JDK_VERSION} (supported: 8, 17, 21)" >&2; exit 1 ;; \ + esac && \ + curl --location --fail --silent --show-error --output /tmp/jdk.tar.gz "${JDK_URL}" && \ + echo "${JDK_SHA256} */tmp/jdk.tar.gz" | sha256sum -c - FROM base_image SHELL ["/bin/bash", "-o", "pipefail", "-c"] @@ -60,15 +72,15 @@ RUN tar xzf /tmp/maven.tar.gz -C /opt && \ rm /tmp/maven.tar.gz # hadolint ignore=DL3010 -COPY --from=openjdk8_download_image /tmp/adoptopenjdk8.tar.gz /tmp/adoptopenjdk8.tar.gz +COPY --from=jdk_download_image /tmp/jdk.tar.gz /tmp/jdk.tar.gz +ARG JDK_VERSION=17 RUN mkdir -p /usr/lib/jvm && \ - tar xzf /tmp/adoptopenjdk8.tar.gz -C /usr/lib/jvm && \ - ln -s "/usr/lib/jvm/$(basename "$(tar -tf /tmp/adoptopenjdk8.tar.gz | head -n1)")" /usr/lib/jvm/java-8-adoptopenjdk && \ - ln -s /usr/lib/jvm/java-8-adoptopenjdk /usr/lib/jvm/java-8 && \ - rm /tmp/adoptopenjdk8.tar.gz + tar xzf /tmp/jdk.tar.gz -C /usr/lib/jvm && \ + ln -s "/usr/lib/jvm/$(basename "$(tar -tf /tmp/jdk.tar.gz | head -n1)")" "/usr/lib/jvm/java-${JDK_VERSION}" && \ + rm /tmp/jdk.tar.gz ENV MAVEN_HOME '/opt/maven' -ENV JAVA_HOME '/usr/lib/jvm/java-8' +ENV JAVA_HOME="/usr/lib/jvm/java-${JDK_VERSION}" ENV PATH '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' ENV PATH "${JAVA_HOME}/bin:${MAVEN_HOME}/bin:${PATH}"