diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/JibBuildRunner.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/JibBuildRunner.java index 867f0bd83a..ff18fbdd2f 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/JibBuildRunner.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/JibBuildRunner.java @@ -73,9 +73,13 @@ private static String buildMessageWithTargetImageReferences( String prefix, String suffix) { StringJoiner successMessageBuilder = new StringJoiner(", ", prefix, suffix); - successMessageBuilder.add(colorCyan(targetImageReference.toString())); + successMessageBuilder.add(colorCyan(targetImageReference.toStringWithQualifier())); for (String tag : additionalTags) { - successMessageBuilder.add(colorCyan(targetImageReference.withQualifier(tag).toString())); + if (targetImageReference.getQualifier().equals(tag)) { + continue; + } + successMessageBuilder.add( + colorCyan(targetImageReference.withQualifier(tag).toStringWithQualifier())); } return successMessageBuilder.toString(); } diff --git a/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/JibBuildRunnerTest.java b/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/JibBuildRunnerTest.java index 4b41447b55..020d23822f 100644 --- a/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/JibBuildRunnerTest.java +++ b/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/JibBuildRunnerTest.java @@ -25,6 +25,7 @@ import com.google.cloud.tools.jib.api.InsecureRegistryException; import com.google.cloud.tools.jib.api.JibContainer; import com.google.cloud.tools.jib.api.JibContainerBuilder; +import com.google.cloud.tools.jib.api.LogEvent; import com.google.cloud.tools.jib.api.RegistryException; import com.google.cloud.tools.jib.api.RegistryUnauthorizedException; import com.google.cloud.tools.jib.registry.RegistryCredentialsNotSentException; @@ -34,6 +35,8 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import java.util.concurrent.ExecutionException; import org.apache.http.conn.HttpHostConnectException; @@ -226,6 +229,40 @@ public void testBuildImage_other() } } + @Test + public void testForBuildImage_successMessageIncludesLatestAndNoDuplicateUntaggedEntry() + throws Exception { + ImageReference targetImageReference = ImageReference.parse("repo/container"); + Set additionalTags = ImmutableSet.of("latest", "1.0.0-SNAPSHOT", "branch"); + List loggedEvents = new ArrayList<>(); + JibBuildRunner runner = + JibBuildRunner.forBuildImage( + mockJibContainerBuilder, + mockContainerizer, + loggedEvents::add, + TEST_HELPFUL_SUGGESTIONS, + targetImageReference, + additionalTags); + + Mockito.when(mockJibContainerBuilder.containerize(mockContainerizer)) + .thenReturn(mockJibContainer); + + runner.runBuild(); + + String successMessage = + loggedEvents.stream() + .map(LogEvent::getMessage) + .filter(message -> message.contains("Built and pushed")) + .findFirst() + .orElseThrow(AssertionError::new); + + Assert.assertTrue(successMessage.contains("repo/container:latest")); + Assert.assertTrue(successMessage.contains("repo/container:1.0.0-SNAPSHOT")); + Assert.assertTrue(successMessage.contains("repo/container:branch")); + long occurrences = successMessage.split("repo/container", -1).length - 1L; + Assert.assertEquals(3, occurrences); + } + @Test public void testBuildImage_writesImageJson() throws Exception { final ImageReference targetImageReference = ImageReference.parse("gcr.io/distroless/java:11");