Repository: DataDog/dd-trace-java-docker-build
Pull request #93: Add Temurin JDK 24
Author: login: sarahchen6
Created: 2025-04-30T17:24:11Z | Merged: 2025-05-20T13:21:10Z

Add Temurin JDK 24 to help with testing the latest version.


Diff:
diff --git a/Dockerfile b/Dockerfile
index 96397ea..6a6d8a7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,12 +1,17 @@
 # syntax=docker/dockerfile:1.6
 
+ARG LATEST_VERSION
+FROM eclipse-temurin:${LATEST_VERSION}-jdk-noble AS temurin-latest
+
 # Intermediate image used to prune cruft from JDKs and squash them all.
 FROM cimg/base:current-22.04 AS all-jdk
+ARG LATEST_VERSION
 
 COPY --from=eclipse-temurin:8-jdk-jammy /opt/java/openjdk /usr/lib/jvm/8
 COPY --from=eclipse-temurin:11-jdk-jammy /opt/java/openjdk /usr/lib/jvm/11
 COPY --from=eclipse-temurin:17-jdk-jammy /opt/java/openjdk /usr/lib/jvm/17
 COPY --from=eclipse-temurin:21-jdk-jammy /opt/java/openjdk /usr/lib/jvm/21
+COPY --from=temurin-latest /opt/java/openjdk /usr/lib/jvm/${LATEST_VERSION}
 
 COPY --from=azul/zulu-openjdk:7 /usr/lib/jvm/zulu7 /usr/lib/jvm/7
 COPY --from=azul/zulu-openjdk:8 /usr/lib/jvm/zulu8 /usr/lib/jvm/zulu8
@@ -51,20 +56,24 @@ RUN <<-EOT
 EOT
 
 FROM scratch AS default-jdk
+ARG LATEST_VERSION
 
 COPY --from=all-jdk /usr/lib/jvm/8 /usr/lib/jvm/8
 COPY --from=all-jdk /usr/lib/jvm/11 /usr/lib/jvm/11
 COPY --from=all-jdk /usr/lib/jvm/17 /usr/lib/jvm/17
 COPY --from=all-jdk /usr/lib/jvm/21 /usr/lib/jvm/21
+COPY --from=all-jdk /usr/lib/jvm/${LATEST_VERSION} /usr/lib/jvm/${LATEST_VERSION}
 
-# Base image with minimunm requirenents to build the project.
+# Base image with minimum requirements to build the project.
 # Based on CircleCI Base Image with Ubuntu 22.04.3 LTS, present in most runners.
 FROM cimg/base:current-22.04 AS base
+ARG LATEST_VERSION
+ENV LATEST_VERSION=${LATEST_VERSION}
 
 # https://docs.github.com/en/packages/learn-github-packages/connecting-a-repository-to-a-package
 LABEL org.opencontainers.image.source=https://github.com/DataDog/dd-trace-java-docker-build
 
-# Replace Docker Compose and yq versions by latest and remove docker-switch from CircleCI Base Image for security purposes
+# Replace Docker Compose and yq versions by latest and remove docker-switch from CircleCI Base Image for security purposes.
 RUN <<-EOT
 	set -eu
 	dockerPluginDir=/usr/local/lib/docker/cli-plugins
@@ -107,15 +116,16 @@ EOT
 # IBM specific env variables
 ENV IBM_JAVA_OPTIONS="-XX:+UseContainerSupport"
 
-#Set some odd looking variables, since their default values are wrong and it is unclear how they are used
+# Set some odd looking variables, since their default values are wrong and it is unclear how they are used.
 ENV JAVA_DEBIAN_VERSION=unused
 ENV JAVA_VERSION=unused
 
-# Setup environment variables to point to all jvms we have
+# Set up environment variables to point to all jvms we have.
 ENV JAVA_8_HOME=/usr/lib/jvm/8
 ENV JAVA_11_HOME=/usr/lib/jvm/11
 ENV JAVA_17_HOME=/usr/lib/jvm/17
 ENV JAVA_21_HOME=/usr/lib/jvm/21
+ENV JAVA_${LATEST_VERSION}_HOME=/usr/lib/jvm/${LATEST_VERSION}
 
 ENV JAVA_HOME=${JAVA_8_HOME}
 ENV PATH=${JAVA_HOME}/bin:${PATH}
diff --git a/README.md b/README.md
index 80c737a..26942d7 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,3 @@
-
 # dd-trace-java-docker-build
 
 Docker images for continuous integration jobs at [dd-trace-java](https://github.com/datadog/dd-trace-java).
@@ -8,8 +7,8 @@ Docker images for continuous integration jobs at [dd-trace-java](https://github.
 Pre-built images are available in [GitHub Container Registry](https://github.com/DataDog/dd-trace-java-docker-build/pkgs/container/dd-trace-java-docker-build).
 
 Image variants are available on a per JDK basis:
-- The `base` variant, and its aliases `8`, `11`, `17` and `21`, contains the base Eclipse Temurin JDK 8, 11, 17 and 21 versions,
-- The `zulu8`, `zulu11`, `oracle8`, `ibm8`, `semeru8`, `semeru11`, `semeru17`, `graalvm17` and `graalvm21` variants all contain the base JDKs in addition to their specific JDK from their name,
+- The `base` variant, and its aliases `8`, `11`, `17`, `21`, and `stable`, contains the base Eclipse Temurin JDK 8, 11, 17, 21, and latest stable JDK versions,
+- The `zulu8`, `zulu11`, `oracle8`, `ibm8`, `semeru8`, `semeru11`, `semeru17`, `graalvm17` and `graalvm21` variants all contain the base JDKs in addition to the specific JDK from their name,
 - The `latest` variant contains the base JDKs and all the above specific JDKs.
 
 ## Development
diff --git a/build b/build
index 4284bbf..dbaf999 100755
--- a/build
+++ b/build
@@ -3,7 +3,7 @@ set -eu
 
 readonly IMAGE_NAME="ghcr.io/datadog/dd-trace-java-docker-build"
 
-readonly BASE_VARIANTS=(8 11 17 21)
+readonly BASE_VARIANTS=(8 11 17 21 stable) # add an ea variant once the early access build is available
 
 readonly VARIANTS=(
     7
@@ -45,6 +45,23 @@ function compute_metadata() {
     GIT_HEAD_REF="$(git show-ref --head --hash ^HEAD)"
 }
 
+function compute_latest_version() {
+    # Java versions are typically released towards the end of the month in March and September,
+    # so we use the version from the previous release cycle until the month after the release.
+    local base_year=2025
+    local base_version=23
+
+    version="$((base_version + ($(date +%Y) - base_year) * 2))"
+    if [ "$(date +%m)" -ge 4 ]; then
+        version="$((version + 1))"
+    fi
+    if [ "$(date +%m)" -ge 10 ]; then
+        version="$((version + 1))"
+    fi
+
+    export LATEST_VERSION="$version"
+}
+
 # docker build wrapper with common arguments
 # See https://github.com/opencontainers/image-spec/blob/main/annotations.md for common labels
 # See https://docs.github.com/en/packages/learn-github-packages/connecting-a-repository-to-a-package
@@ -54,6 +71,7 @@ function docker_build() {
     shift
     shift
     docker build \
+        --build-arg LATEST_VERSION=$LATEST_VERSION \
         --platform linux/amd64 \
         --label org.opencontainers.image.created="$BUILD_DATE" \
         --label org.opencontainers.image.source=https://github.com/DataDog/dd-trace-java-docker-build \
@@ -71,6 +89,7 @@ function image_name() {
 
 function do_build() {
     compute_metadata
+    compute_latest_version
     docker_build base "$(image_name base)"
     docker_build full "$(image_name latest)"
     if [ -n "${GITHUB_OUTPUT+unset}" ]; then
@@ -133,13 +152,19 @@ function do_inner_test() {
     local variant="${1}"
     variant_lower="${variant,,}"
     variant_upper="${variant^^}"
+    java_latest_home="JAVA_${LATEST_VERSION}_HOME"
     set -x
     "$JAVA_HOME/bin/java" -version
     "$JAVA_8_HOME/bin/java" -version
     "$JAVA_11_HOME/bin/java" -version
     "$JAVA_17_HOME/bin/java" -version
     "$JAVA_21_HOME/bin/java" -version
+    "${!java_latest_home}/bin/java" -version
     if [[ $variant != base && $variant != latest ]]; then
+        if [[ $variant == "stable" ]]; then
+            variant_lower="${LATEST_VERSION}"
+            variant_upper="${LATEST_VERSION}"
+        fi
         env_lower="JAVA_${variant_lower}_HOME"
         env_upper="JAVA_${variant_upper}_HOME"
         "${!env_lower}/bin/java" -version
@@ -148,8 +173,8 @@ function do_inner_test() {
 }
 
 function do_describe() {
-    local image
     compute_metadata
+    local image
     image="$(image_name latest)"
     docker run \
         --user "$(id -u):$(id -g)" \
@@ -179,7 +204,11 @@ function do_inner_describe() {
     echo "## JDKs"
     echo
     for variant in "${BASE_VARIANTS[@]}" "${VARIANTS[@]}"; do
-        variant_upper="${variant^^}"
+        if [[ $variant == "stable" ]]; then
+            variant_upper="${LATEST_VERSION}"
+        else
+            variant_upper="${variant^^}"
+        fi
         env_upper="JAVA_${variant_upper}_HOME"
         echo "* $env_upper"
         echo '```'


Reviews:
user: login: PerfectSlayer
body: General question: should we have it named `24` or `latest`? or both?

My point is we would have to update both CI (dd-trace-java and dd-trace-java-docker-build) every 6 months if we have a fixed name (ie 24) whereas we will only need to update the docker build if we name it latest.
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-02T05:09:29Z
user: login: PerfectSlayer
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-02T14:22:08Z
user: login: sarahchen6
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-02T14:54:20Z
user: login: sarahchen6
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-02T15:24:53Z
user: login: sarahchen6
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-02T19:57:29Z
user: login: PerfectSlayer
body: Looking good!
My main question is about `latest_stable` being compute at check time versus build time -- check my comment for context 😉 
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T13:01:06Z
user: login: sarahchen6
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T13:18:15Z
user: login: sarahchen6
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T14:28:05Z
user: login: sarahchen6
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T14:40:07Z
user: login: sarahchen6
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T20:01:52Z
user: login: PerfectSlayer
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T09:09:26Z
user: login: PerfectSlayer
body: Looking all good! Thanks for the improvements and iterations
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T09:12:28Z
user: login: smola
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-20T13:17:54Z

Review comments:
diff_hunk: @@ -7,6 +7,7 @@ COPY --from=eclipse-temurin:8-jdk-jammy /opt/java/openjdk /usr/lib/jvm/8
 COPY --from=eclipse-temurin:11-jdk-jammy /opt/java/openjdk /usr/lib/jvm/11
 COPY --from=eclipse-temurin:17-jdk-jammy /opt/java/openjdk /usr/lib/jvm/17
 COPY --from=eclipse-temurin:21-jdk-jammy /opt/java/openjdk /usr/lib/jvm/21
+COPY --from=openjdk:24-jdk /usr/java/openjdk-24 /usr/lib/jvm/24
path: Dockerfile
user: login: PerfectSlayer
body: `openjdk` is deprecated: https://hub.docker.com/_/openjdk
You would have to use `eclipse-temurin:24-jdk-noble` but the base image is Jammy. Not sure it will work. Have you tried already?

In addition, to keep the update automatic, would be nice for `24` being a parameter depending of the build date, ie the build will inject the right version to use so we won't need to update the docker build for the CI to be up-to-date.
created_at: 2025-05-02T14:19:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -107,15 +109,16 @@ EOT
 # IBM specific env variables
 ENV IBM_JAVA_OPTIONS="-XX:+UseContainerSupport"
 
-#Set some odd looking variables, since their default values are wrong and it is unclear how they are used
+# Set some odd looking variables, since their default values are wrong and it is unclear how they are used.
 ENV JAVA_DEBIAN_VERSION=unused
 ENV JAVA_VERSION=unused
 
-# Setup environment variables to point to all jvms we have
+# Set up environment variables to point to all jvms we have.
 ENV JAVA_8_HOME=/usr/lib/jvm/8
 ENV JAVA_11_HOME=/usr/lib/jvm/11
 ENV JAVA_17_HOME=/usr/lib/jvm/17
 ENV JAVA_21_HOME=/usr/lib/jvm/21
+ENV JAVA_24_HOME=/usr/lib/jvm/24
path: Dockerfile
user: login: PerfectSlayer
body: Is it still part of the base image as it was removed from the README?
created_at: 2025-05-02T14:21:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -107,15 +109,16 @@ EOT
 # IBM specific env variables
 ENV IBM_JAVA_OPTIONS="-XX:+UseContainerSupport"
 
-#Set some odd looking variables, since their default values are wrong and it is unclear how they are used
+# Set some odd looking variables, since their default values are wrong and it is unclear how they are used.
 ENV JAVA_DEBIAN_VERSION=unused
 ENV JAVA_VERSION=unused
 
-# Setup environment variables to point to all jvms we have
+# Set up environment variables to point to all jvms we have.
 ENV JAVA_8_HOME=/usr/lib/jvm/8
 ENV JAVA_11_HOME=/usr/lib/jvm/11
 ENV JAVA_17_HOME=/usr/lib/jvm/17
 ENV JAVA_21_HOME=/usr/lib/jvm/21
+ENV JAVA_24_HOME=/usr/lib/jvm/24
path: Dockerfile
user: login: sarahchen6
body: Yes let me clarify that there is also a `latest` tag of the `base` variant that is Java 24 right now!
created_at: 2025-05-02T14:54:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -7,6 +7,7 @@ COPY --from=eclipse-temurin:8-jdk-jammy /opt/java/openjdk /usr/lib/jvm/8
 COPY --from=eclipse-temurin:11-jdk-jammy /opt/java/openjdk /usr/lib/jvm/11
 COPY --from=eclipse-temurin:17-jdk-jammy /opt/java/openjdk /usr/lib/jvm/17
 COPY --from=eclipse-temurin:21-jdk-jammy /opt/java/openjdk /usr/lib/jvm/21
+COPY --from=openjdk:24-jdk /usr/java/openjdk-24 /usr/lib/jvm/24
path: Dockerfile
user: login: sarahchen6
body: > You would have to use eclipse-temurin:24-jdk-noble but the base image is Jammy. Not sure it will work. Have you tried already?

I had tried and saw that `eclipse-temurin:24-jdk-jammy` would not work, but `eclipse-temurin:24-jdk-noble` does!

> In addition, to keep the update automatic, would be nice for 24 being a parameter depending of the build date, ie the build will inject the right version to use so we won't need to update the docker build for the CI to be up-to-date.

Okay let me try this.
created_at: 2025-05-02T15:24:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -54,6 +71,7 @@ function docker_build() {
     shift
     shift
     docker build \
+        --build-arg LATEST_VERSION=$LATEST_VERSION \
path: build
user: login: sarahchen6
body: @PerfectSlayer Is this something along the lines of what you meant by having `24` be a parameter depending on the build date?
created_at: 2025-05-02T19:57:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,12 +1,17 @@
 # syntax=docker/dockerfile:1.6
 
+ARG LATEST_VERSION
+FROM eclipse-temurin:${LATEST_VERSION}-jdk-noble AS temurin-latest
+
 # Intermediate image used to prune cruft from JDKs and squash them all.
 FROM cimg/base:current-22.04 AS all-jdk
+ARG LATEST_VERSION
 
 COPY --from=eclipse-temurin:8-jdk-jammy /opt/java/openjdk /usr/lib/jvm/8
 COPY --from=eclipse-temurin:11-jdk-jammy /opt/java/openjdk /usr/lib/jvm/11
 COPY --from=eclipse-temurin:17-jdk-jammy /opt/java/openjdk /usr/lib/jvm/17
 COPY --from=eclipse-temurin:21-jdk-jammy /opt/java/openjdk /usr/lib/jvm/21
+COPY --from=temurin-latest /opt/java/openjdk /usr/lib/jvm/${LATEST_VERSION}
path: Dockerfile
user: login: PerfectSlayer
body: Dumb question: do you know why we have to set an indirection by creating a `temurin-latest` stage and not use
`COPY --from=eclipse-temurin:${LATEST_VERSION}-jdk-noble /opt/java/openjdk /usr/lib/jvm/${LATEST_VERSION}` instead?
created_at: 2025-05-14T12:20:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -45,6 +45,23 @@ function compute_metadata() {
     GIT_HEAD_REF="$(git show-ref --head --hash ^HEAD)"
 }
 
+function compute_latest_version() {
+    # Java versions are typically released towards the end of the month in March and September,
+    # so we use the version from the previous release cycle until the month after the release.
+    local base_year=2025
+    local base_version=23
+
+    version="$((base_version + ($(date +%Y) - base_year) * 2))"
+    if [ "$(date +%m)" -ge 4 ]; then
+        version="$((version + 1))"
+    fi
+    if [ "$(date +%m)" -ge 10 ]; then
+        version="$((version + 1))"
+    fi
+
+    export LATEST_VERSION="$version"
path: build
user: login: PerfectSlayer
body: You don't need to export (like `compute_metadata` does):
```suggestion
    LATEST_VERSION="$version"
```
created_at: 2025-05-14T12:37:36Z
author_association: CONTRIBUTOR
diff_hunk: @@ -54,6 +71,7 @@ function docker_build() {
     shift
     shift
     docker build \
+        --build-arg LATEST_VERSION=$LATEST_VERSION \
path: build
user: login: PerfectSlayer
body: Yes exactly! 🙌 
created_at: 2025-05-14T12:37:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -148,8 +175,10 @@ function do_inner_test() {
 }
 
 function do_describe() {
-    local image
     compute_metadata
+    compute_latest_version
+    docker_build full "$(image_name latest)"
path: build
user: login: PerfectSlayer
body: Why do you need a build within `do_describe`?
created_at: 2025-05-14T12:49:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -161,6 +190,7 @@ function do_describe() {
 }
 
 function do_inner_describe() {
+    compute_latest_version
path: build
user: login: PerfectSlayer
body: The new `LATEST_VERSION` will be computed with the actual time, and not the time used when the image was built. I think that might be an issue 🤔

What about using `ENV` in `Dockerfile` to capture the `ARG` value?
created_at: 2025-05-14T12:58:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -3,7 +3,7 @@ set -eu
 
 readonly IMAGE_NAME="ghcr.io/datadog/dd-trace-java-docker-build"
 
-readonly BASE_VARIANTS=(8 11 17 21)
+readonly BASE_VARIANTS=(8 11 17 21 latest_base)
path: build
user: login: PerfectSlayer
body: Nitpick: it feels like `latest_base` will be confusing and I guess you did not use `latest` as it would conflict with the docker latest tag.
What about "stable" and "ea" (that we will introduce later for "early access" OpenJDK builds)?
created_at: 2025-05-14T12:59:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,12 +1,17 @@
 # syntax=docker/dockerfile:1.6
 
+ARG LATEST_VERSION
+FROM eclipse-temurin:${LATEST_VERSION}-jdk-noble AS temurin-latest
+
 # Intermediate image used to prune cruft from JDKs and squash them all.
 FROM cimg/base:current-22.04 AS all-jdk
+ARG LATEST_VERSION
 
 COPY --from=eclipse-temurin:8-jdk-jammy /opt/java/openjdk /usr/lib/jvm/8
 COPY --from=eclipse-temurin:11-jdk-jammy /opt/java/openjdk /usr/lib/jvm/11
 COPY --from=eclipse-temurin:17-jdk-jammy /opt/java/openjdk /usr/lib/jvm/17
 COPY --from=eclipse-temurin:21-jdk-jammy /opt/java/openjdk /usr/lib/jvm/21
+COPY --from=temurin-latest /opt/java/openjdk /usr/lib/jvm/${LATEST_VERSION}
path: Dockerfile
user: login: sarahchen6
body: For some reason, `--from` does not allow variable interpolation ([docker docs](https://docs.docker.com/reference/dockerfile/#copy---from), [community forum discussion](https://forums.docker.com/t/how-can-i-expand-a-variable-within-a-copy-command-in-the-dockerfile/113538), [open moby issue](https://github.com/moby/moby/issues/34482)) :/
created_at: 2025-05-14T13:18:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -148,8 +175,10 @@ function do_inner_test() {
 }
 
 function do_describe() {
-    local image
     compute_metadata
+    compute_latest_version
+    docker_build full "$(image_name latest)"
path: build
user: login: sarahchen6
body: Good point... I thought I needed them when getting issues with `LATEST_VERSION` recognition, but these two lines are not needed here. Thanks!
created_at: 2025-05-14T14:28:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -161,6 +190,7 @@ function do_describe() {
 }
 
 function do_inner_describe() {
+    compute_latest_version
path: build
user: login: sarahchen6
body: Ah I see what you mean. After the image is built, we should store the then-calculated `LATEST_VERSION` into an `ENV` variable in the Dockerfile. Subsequently, we should use that `ENV` variable as the `LATEST_VERSION` value so that we do not risk `compute_latest_version` here returning a mis-matching value.

Done in [6078764](https://github.com/DataDog/dd-trace-java-docker-build/pull/93/commits/6078764f294c4efaef0a16332217f09514abcd1e)!
created_at: 2025-05-14T14:40:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -3,7 +3,7 @@ set -eu
 
 readonly IMAGE_NAME="ghcr.io/datadog/dd-trace-java-docker-build"
 
-readonly BASE_VARIANTS=(8 11 17 21)
+readonly BASE_VARIANTS=(8 11 17 21 latest_base)
path: build
user: login: sarahchen6
body: Good point - I changed the name to `stable`. I couldn't find a clean way to copy in an image only when it exists, so I'm thinking `ea` can be added after the early access build becomes available.
created_at: 2025-05-14T20:01:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,12 +1,17 @@
 # syntax=docker/dockerfile:1.6
 
+ARG LATEST_VERSION
+FROM eclipse-temurin:${LATEST_VERSION}-jdk-noble AS temurin-latest
+
 # Intermediate image used to prune cruft from JDKs and squash them all.
 FROM cimg/base:current-22.04 AS all-jdk
+ARG LATEST_VERSION
 
 COPY --from=eclipse-temurin:8-jdk-jammy /opt/java/openjdk /usr/lib/jvm/8
 COPY --from=eclipse-temurin:11-jdk-jammy /opt/java/openjdk /usr/lib/jvm/11
 COPY --from=eclipse-temurin:17-jdk-jammy /opt/java/openjdk /usr/lib/jvm/17
 COPY --from=eclipse-temurin:21-jdk-jammy /opt/java/openjdk /usr/lib/jvm/21
+COPY --from=temurin-latest /opt/java/openjdk /usr/lib/jvm/${LATEST_VERSION}
path: Dockerfile
user: login: PerfectSlayer
body: Yeah, that's what I tough. Thanks for the confirmation and the documentation references! ❤️ 
created_at: 2025-05-16T09:09:25Z
author_association: CONTRIBUTOR

PR comments:
user: login: sarahchen6
created_at: 2025-05-02T12:54:02Z
body: > General question: should we have it named `24` or `latest`? or both?
> 
> My point is we would have to update both CI (dd-trace-java and dd-trace-java-docker-build) every 6 months if we have a fixed name (ie 24) whereas we will only need to update the docker build if we name it latest.

Good point - I think it makes sense to name it `latest`, given that this isn't a LTS version.
author_association: CONTRIBUTOR
user: login: smola
created_at: 2025-05-20T13:18:59Z
body: @sarahchen6 The remaining job failure (`Keep repository alive...`) can be ignored. Good to merge.
author_association: MEMBER