diff --git a/doc/changelog.md b/doc/changelog.md index 801215ced..15037619e 100644 --- a/doc/changelog.md +++ b/doc/changelog.md @@ -2,6 +2,7 @@ * **0.37-SNAPSHOT**: - Allow replacement in tags. Added a new replacement `%T` which always adds a timestamp. ([#1491](https://github.com/fabric8io/docker-maven-plugin/pull/1491)) + - Only push the `latest` tag if no other tags where specified in docker mode. This can break your build, if you rely on the automatic `latest` tag. ([#1496](https://github.com/fabric8io/docker-maven-plugin/pull/1496)) - Only push the `latest` tag if no other tags where specified in jib mode. This can break your build, if you rely on the automatic `latest` tag. ([#1498](https://github.com/fabric8io/docker-maven-plugin/pull/1498)) * **0.37.0** (2021-08-15) diff --git a/src/main/java/io/fabric8/maven/docker/service/RegistryService.java b/src/main/java/io/fabric8/maven/docker/service/RegistryService.java index 625dd7af4..7bd627fbf 100644 --- a/src/main/java/io/fabric8/maven/docker/service/RegistryService.java +++ b/src/main/java/io/fabric8/maven/docker/service/RegistryService.java @@ -59,16 +59,16 @@ public void pushImages(Collection imageConfigs, AuthConfig authConfig = createAuthConfig(true, new ImageName(name).getUser(), configuredRegistry, registryConfig); - long start = System.currentTimeMillis(); - docker.pushImage(name, authConfig, configuredRegistry, retries); - log.info("Pushed %s in %s", name, EnvUtil.formatDurationTill(start)); - - if (!skipTag) { - for (String tag : imageConfig.getBuildConfiguration().getTags()) { + if (!skipTag && !buildConfig.getTags().isEmpty()) { + for (String tag : buildConfig.getTags()) { if (tag != null) { docker.pushImage(new ImageName(name, tag).getFullName(), authConfig, configuredRegistry, retries); } } + } else { + long start = System.currentTimeMillis(); + docker.pushImage(name, authConfig, configuredRegistry, retries); + log.info("Pushed %s in %s", name, EnvUtil.formatDurationTill(start)); } } } diff --git a/src/test/java/io/fabric8/maven/docker/service/RegistryServiceTest.java b/src/test/java/io/fabric8/maven/docker/service/RegistryServiceTest.java index 6e7e5b102..818a427c4 100644 --- a/src/test/java/io/fabric8/maven/docker/service/RegistryServiceTest.java +++ b/src/test/java/io/fabric8/maven/docker/service/RegistryServiceTest.java @@ -2,8 +2,12 @@ import io.fabric8.maven.docker.config.BuildImageConfiguration; import io.fabric8.maven.docker.config.ImageConfiguration; + +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import io.fabric8.maven.docker.access.AuthConfig; @@ -14,11 +18,14 @@ import io.fabric8.maven.docker.util.AutoPullMode; import io.fabric8.maven.docker.util.ImageName; import io.fabric8.maven.docker.util.Logger; +import mockit.Expectations; import mockit.Mocked; import mockit.Verifications; +import org.apache.maven.plugin.MojoExecutionException; import org.junit.Before; import org.junit.Test; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -201,7 +208,7 @@ public void tagForCustomRegistry() throws DockerAccessException { public void pushImage() throws DockerAccessException { givenAnImageConfiguration("user/test:1.0.1"); - whenPushImage(); + whenPushImageTagSkipped(); thenImageHasBeenPushed(); thenNoExceptionThrown(); @@ -211,7 +218,7 @@ public void pushImage() throws DockerAccessException { public void pushImageWithoutBuildConfig() throws DockerAccessException { givenAnImageConfigurationWithoutBuildConfig("user/test:1.0.1"); - whenPushImage(); + whenPushImageTagSkipped(); thenImageHasNotBeenPushed(); thenNoExceptionThrown(); @@ -222,12 +229,38 @@ public void pushImageSkipped() throws DockerAccessException { givenAnImageConfiguration("user/test:1.0.1"); givenPushSkipped(true); - whenPushImage(); + whenPushImageTagSkipped(); thenImageHasNotBeenPushed(); thenNoExceptionThrown(); } + @Test + public void testPushedImageTags() throws MojoExecutionException, DockerAccessException { + + List imageNames = new ArrayList<>(); + new Expectations() {{ + docker.pushImage(withCapture(imageNames), (AuthConfig) withNotNull(), anyString, anyInt); + }}; + + + givenAnImageConfiguration("without-tags"); + whenPushImageTagSkipped(); + // latest tag is used, because no other tags are specified + assertEquals(imageConfiguration.getName(), imageNames.get(0)); + + + givenAnImageConfigurationWithTags("with-tags"); + whenPushImageTagSkipped(true); + whenPushImageTagSkipped(); + // latest tag is used, because skipTag = true + assertEquals(imageConfiguration.getName(), imageNames.get(1)); + + // skipTag = false => both specified tags have to be pushed + assertEquals(imageConfiguration.getName()+":foo", imageNames.get(2)); + assertEquals(imageConfiguration.getName()+":bar", imageNames.get(3)); + } + // ==================================================================================================== private void thenNoExceptionThrown() { @@ -296,13 +329,17 @@ private void whenAutoPullImage() { } } - private void whenPushImage() { + private void whenPushImageTagSkipped() { + whenPushImageTagSkipped(false); + } + + private void whenPushImageTagSkipped(boolean skipTag) { try { RegistryService.RegistryConfig.Builder registryConfigBuilder = new RegistryService.RegistryConfig.Builder() .authConfigFactory(authConfigFactory) .authConfig(authConfig); - registryService.pushImages(Collections.singleton(imageConfiguration), 1, registryConfigBuilder.build(), false); + registryService.pushImages(Collections.singleton(imageConfiguration), 1, registryConfigBuilder.build(), skipTag); } catch (Exception e) { this.actualException = e; } @@ -345,6 +382,11 @@ private void givenAnImageConfiguration(String imageName) { imageConfiguration = new ImageConfiguration.Builder().name(imageName).buildConfig(buildImageConfiguration).build(); } + private void givenAnImageConfigurationWithTags(String imageName) { + final BuildImageConfiguration buildImageConfiguration = new BuildImageConfiguration.Builder().tags(Arrays.asList("foo", "bar")).build(); + imageConfiguration = new ImageConfiguration.Builder().name(imageName).buildConfig(buildImageConfiguration).build(); + } + private void givenAnImageConfigurationWithoutBuildConfig(String imageName) { imageConfiguration = new ImageConfiguration.Builder().name(imageName).buildConfig(null).build(); }