From 409a7ba66f4ae860f3aabfdb916a9ba7c776624f Mon Sep 17 00:00:00 2001 From: Weimin Yu Date: Wed, 15 Apr 2026 16:34:52 +0000 Subject: [PATCH] Change language and bytecode levels to Java 25 (#3009) Release/Build tested in alpha. Deployed in crash. --- .github/workflows/dependency-submission.yml | 2 +- build.gradle | 10 ++++++---- core/build.gradle | 6 +++++- java_common.gradle | 1 + jetty/Dockerfile | 9 +++++++-- jetty/build.gradle | 1 + release/cloudbuild-release.yaml | 18 +++++++++--------- 7 files changed, 30 insertions(+), 17 deletions(-) diff --git a/.github/workflows/dependency-submission.yml b/.github/workflows/dependency-submission.yml index e6e41a7e6..64057940e 100644 --- a/.github/workflows/dependency-submission.yml +++ b/.github/workflows/dependency-submission.yml @@ -20,6 +20,6 @@ jobs: uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '21' + java-version: '25' - name: Generate and submit dependency graph uses: gradle/actions/dependency-submission@v3 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 8910a6dce..d066f7873 100644 --- a/build.gradle +++ b/build.gradle @@ -359,11 +359,13 @@ subprojects { // search for `flex-template-base-image` and update the parameter value. // There are at least two instances, one in core/build.gradle, one in // release/stage_beam_pipeline.sh + // Also need to change: + // - base images in Dockerfiles under core, jetty, and proxy. + // - Java installation command in the builder image under release. + // - cloudbuild-release.yaml under release. java { - // TODO(b/457758757): change to V_25 once Java in all environments are - // upgraded. - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 } project.tasks.test.dependsOn runPresubmits diff --git a/core/build.gradle b/core/build.gradle index d0cb12bbd..dc281b761 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -383,6 +383,7 @@ task soyToJava { project.services.get(ExecOperations).javaexec { mainClass = "com.google.template.soy.SoyParseInfoGenerator" classpath = configurations.soy + jvmArgs = ["--sun-misc-unsafe-memory-access=allow", "--enable-native-access=ALL-UNNAMED"] args = ["--javaPackage", "${javaPackage}", "--outputDirectory", "${outputDirectory}", "--javaClassNameSource", "filename", @@ -438,7 +439,7 @@ artifacts { task findGoldenImages(type: JavaExec) { classpath = sourceSets.test.runtimeClasspath mainClass = 'google.registry.webdriver.GoldenImageFinder' - + jvmArgs "--sun-misc-unsafe-memory-access=allow" def arguments = [] arguments << "--screenshots_for_goldens_dir=${screenshotsForGoldensDir}" arguments << "--new_goldens_dir=${newGoldensDir}" @@ -489,6 +490,7 @@ ext.createToolTask = { project.tasks.create(taskName, JavaExec) { classpath = sourceSet.runtimeClasspath mainClass = mainClassName + jvmArgs "--sun-misc-unsafe-memory-access=allow", "--enable-native-access=ALL-UNNAMED" doFirst { getToolArgsList().ifPresent { @@ -506,6 +508,7 @@ createToolTask( project.tasks.create('generateSqlSchema', JavaExec) { classpath = sourceSets.nonprod.runtimeClasspath mainClass = 'google.registry.tools.DevTool' + jvmArgs "--sun-misc-unsafe-memory-access=allow" args = [ '-e', 'alpha', 'generate_sql_schema', '--start_postgresql', '-o', @@ -664,6 +667,7 @@ artifacts { task runTestServer(type: JavaExec) { mainClass = 'google.registry.server.RegistryTestServerMain' classpath = sourceSets.test.runtimeClasspath + jvmArgs "--sun-misc-unsafe-memory-access=allow" dependsOn(rootProject.project('console-webapp').tasks.named('buildConsoleWebapp')) } diff --git a/java_common.gradle b/java_common.gradle index ea2779fa3..5290c2894 100644 --- a/java_common.gradle +++ b/java_common.gradle @@ -88,6 +88,7 @@ test { // A typical use case is to run tests from desktop that accesses Cloud resources. tasks.withType(Test).configureEach { maxHeapSize = "4096m" + jvmArgs "--sun-misc-unsafe-memory-access=allow", "--enable-native-access=ALL-UNNAMED" def gcp_integration_env_property = 'test.gcp_integration.env' if (project.hasProperty(gcp_integration_env_property)) { diff --git a/jetty/Dockerfile b/jetty/Dockerfile index fc3e50d05..b65f90bcd 100644 --- a/jetty/Dockerfile +++ b/jetty/Dockerfile @@ -1,10 +1,15 @@ -FROM jetty:12-jdk21 +FROM jetty:12-jdk25 ADD --chown=jetty:jetty build/jetty-base /jetty-base ADD --chown=jetty:jetty start.sh / ADD --chown=jetty:jetty logging.properties / USER root +# wget is not installed by default in :12-jdk25 +RUN apt-get update && \ + apt-get install -y wget && \ + rm -rf /var/lib/apt/lists/* + # Create a directory, download and extract the Cloud Profiler agent, version locked to "cloud-profiler-java-agent_20241028_RC00.tar.gz". RUN mkdir -p /opt/cprof && \ wget -q -O- https://storage.googleapis.com/cloud-profiler/java/cloud-profiler-java-agent_20241028_RC00.tar.gz\ @@ -14,6 +19,6 @@ RUN mkdir -p /opt/cprof && \ USER jetty EXPOSE 8080 -# jetty:12-jdk21 has bash. We can afford the extra 200M in image size over +# jetty:12-jdk25 has bash. We can afford the extra 200M in image size over # the -alpine flavor. ENTRYPOINT ["/bin/bash", "/start.sh"] diff --git a/jetty/build.gradle b/jetty/build.gradle index b6c60d4e0..596690f46 100644 --- a/jetty/build.gradle +++ b/jetty/build.gradle @@ -85,6 +85,7 @@ tasks.register('run', JavaExec) { } def jetty_home = System.getenv('JETTY_HOME') def environment = rootProject.environment + jvmArgs "--sun-misc-unsafe-memory-access=allow", "--enable-native-access=ALL-UNNAMED" workingDir(layout.buildDirectory.dir('jetty-base')) classpath = files(jetty_home + '/start.jar') systemProperty('google.registry.environment', environment) diff --git a/release/cloudbuild-release.yaml b/release/cloudbuild-release.yaml index e1f9a7592..f02555fdd 100644 --- a/release/cloudbuild-release.yaml +++ b/release/cloudbuild-release.yaml @@ -67,14 +67,14 @@ steps: docker tag gcr.io/${PROJECT_ID}/builder:${TAG_NAME} gcr.io/${PROJECT_ID}/builder:latest docker push gcr.io/${PROJECT_ID}/builder:${TAG_NAME} docker push gcr.io/${PROJECT_ID}/builder:latest - docker pull jetty:12-jdk21 - docker tag jetty:12-jdk21 gcr.io/${PROJECT_ID}/jetty:${TAG_NAME} - docker tag jetty:12-jdk21 gcr.io/${PROJECT_ID}/jetty:latest + docker pull jetty:12-jdk25 + docker tag jetty:12-jdk25 gcr.io/${PROJECT_ID}/jetty:${TAG_NAME} + docker tag jetty:12-jdk25 gcr.io/${PROJECT_ID}/jetty:latest docker push gcr.io/${PROJECT_ID}/jetty:${TAG_NAME} docker push gcr.io/${PROJECT_ID}/jetty:latest - docker pull eclipse-temurin:21 - docker tag eclipse-temurin:21 gcr.io/${PROJECT_ID}/temurin:${TAG_NAME} - docker tag eclipse-temurin:21 gcr.io/${PROJECT_ID}/temurin:latest + docker pull eclipse-temurin:25 + docker tag eclipse-temurin:25 gcr.io/${PROJECT_ID}/temurin:${TAG_NAME} + docker tag eclipse-temurin:25 gcr.io/${PROJECT_ID}/temurin:latest docker push gcr.io/${PROJECT_ID}/temurin:${TAG_NAME} docker push gcr.io/${PROJECT_ID}/temurin:latest dir: 'release/builder/' @@ -91,9 +91,9 @@ steps: --format='get(digest)' --filter='tags = ${TAG_NAME}') temurin_digest=$(gcloud container images list-tags gcr.io/${PROJECT_ID}/temurin \ --format='get(digest)' --filter='tags = ${TAG_NAME}') - sed -i s%eclipse-temurin:21%gcr.io/${PROJECT_ID}/temurin@$temurin_digest%g proxy/Dockerfile - sed -i s%eclipse-temurin:21%gcr.io/${PROJECT_ID}/temurin@$temurin_digest%g core/Dockerfile - sed -i s%jetty:12-jdk21%gcr.io/${PROJECT_ID}/jetty@$jetty_digest%g jetty/Dockerfile + sed -i s%eclipse-temurin:25%gcr.io/${PROJECT_ID}/temurin@$temurin_digest%g proxy/Dockerfile + sed -i s%eclipse-temurin:25%gcr.io/${PROJECT_ID}/temurin@$temurin_digest%g core/Dockerfile + sed -i s%jetty:12-jdk25%gcr.io/${PROJECT_ID}/jetty@$jetty_digest%g jetty/Dockerfile sed -i s/builder:latest/builder@$builder_digest/g release/cloudbuild-proxy.yaml sed -i s/builder:latest/builder@$builder_digest/g release/cloudbuild-nomulus.yaml sed -i s/builder:latest/builder@$builder_digest/g release/cloudbuild-deploy-gke.yaml