Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ dependencies {
implementation("org.openrewrite:rewrite-json")
implementation("org.openrewrite:rewrite-maven")
implementation("org.openrewrite:rewrite-gradle")
implementation("org.openrewrite:rewrite-docker")
implementation("org.openrewrite.recipe:rewrite-github-actions:$rewriteVersion")
implementation("org.openrewrite.recipe:rewrite-java-dependencies:$rewriteVersion")
implementation("org.openrewrite.recipe:rewrite-static-analysis:$rewriteVersion")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/*
* Copyright 2024 the original author or authors.
* <p>
* Licensed under the Moderne Source Available License (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* https://docs.moderne.io/licensing/moderne-source-available-license
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openrewrite.java.migrate;

import lombok.EqualsAndHashCode;
import lombok.Value;
import org.openrewrite.Option;
import org.openrewrite.Recipe;
import org.openrewrite.docker.ChangeFrom;

import java.util.ArrayList;
import java.util.List;

@EqualsAndHashCode(callSuper = false)
@Value
public class UpgradeDockerImageVersion extends Recipe {

@Option(displayName = "Java version",
description = "The Java version to upgrade to.",
example = "11")
Integer version;

String displayName = "Upgrade Docker image Java version";
String description = "Upgrade Docker image tags to use the specified Java version. " +
"Updates common Java Docker images including eclipse-temurin, amazoncorretto, azul/zulu-openjdk, " +
"and others. Also migrates deprecated images (openjdk, adoptopenjdk) to eclipse-temurin.";

@Override
public List<Recipe> getRecipeList() {
List<Recipe> recipes = new ArrayList<>();
if (version == null) { // for uninitialized version
return recipes;
}
// Deprecated images -> migrate to eclipse-temurin
String[] deprecatedImages = {"openjdk", "adoptopenjdk"};
String[] currentImages = {
"eclipse-temurin", "amazoncorretto", "azul/zulu-openjdk",
"bellsoft/liberica-openjdk-debian", "bellsoft/liberica-openjdk-alpine",
"bellsoft/liberica-openjdk-centos", "ibm-semeru-runtimes", "sapmachine"
};
// Common tag suffixes to preserve when upgrading current images
// Longer suffixes must come before shorter ones to match correctly
String[] commonSuffixes = {
"-jdk-alpine", "-jre-alpine",
"-jdk-noble", "-jre-noble",
"-jdk-jammy", "-jre-jammy",
"-jdk-focal", "-jre-focal",
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we're missing quite a few common ones here.

"-jdk-centos7", "-jre-centos7",
"-jdk-ubi9-minimal", "-jre-ubi9-minimal",
"-jdk-nanoserver", "-jre-nanoserver",
"-jdk-windowsservercore", "-jre-windowsservercore",
"-alpine",
"-jdk", "-jre"
};
for (int oldVersion = 8; oldVersion < version; oldVersion++) {
// Deprecated images: match specific suffixes first to preserve them
for (String image : deprecatedImages) {
for (String suffix : commonSuffixes) {
recipes.add(new ChangeFrom(image, oldVersion + suffix, null, null, "eclipse-temurin", version + suffix, null, null));
}
}
// Deprecated images: fall back to wildcard for remaining patterns
for (String image : deprecatedImages) {
recipes.add(new ChangeFrom(image, oldVersion + "*", null, null, "eclipse-temurin", version.toString(), null, null));
}
// Current images: match specific suffixes first to preserve them
for (String image : currentImages) {
for (String suffix : commonSuffixes) {
recipes.add(new ChangeFrom(image, oldVersion + suffix, null, null, null, version + suffix, null, null));
}
}
// Current images: fall back to wildcard for remaining patterns
for (String image : currentImages) {
recipes.add(new ChangeFrom(image, oldVersion + "*", null, null, null, version.toString(), null, null));
}
}
return recipes;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ public class UpgradeJavaVersion extends Recipe {
String displayName = "Upgrade Java version";

String description = "Upgrade build plugin configuration to use the specified Java version. " +
"This recipe changes `java.toolchain.languageVersion` in `build.gradle(.kts)` of gradle projects, " +
"or maven-compiler-plugin target version and related settings. " +
"Will not downgrade if the version is newer than the specified version.";
"This recipe changes `java.toolchain.languageVersion` in `build.gradle(.kts)` of gradle projects, " +
"or maven-compiler-plugin target version and related settings. " +
"Will not downgrade if the version is newer than the specified version.";

@Override
public List<Recipe> getRecipeList() {
Expand All @@ -54,7 +54,8 @@ public List<Recipe> getRecipeList() {
new UpdateMavenProjectPropertyJavaVersion(version),
new org.openrewrite.jenkins.UpgradeJavaVersion(version, null),
new UpdateJavaCompatibility(version, null, null, false, null),
new UpdateSdkMan(String.valueOf(version), null)
new UpdateSdkMan(String.valueOf(version), null),
new UpgradeDockerImageVersion(version)
);
}

Expand All @@ -63,7 +64,7 @@ public List<Recipe> getRecipeList() {
*
* @return Zero estimated time.
*/
Duration estimatedEffortPerOccurrence = Duration.ofMinutes( 0 );
Duration estimatedEffortPerOccurrence = Duration.ofMinutes(0);

@Override
public TreeVisitor<?, ExecutionContext> getVisitor() {
Expand Down
Loading