diff --git a/jib-core/src/integration-test/java/com/google/cloud/tools/jib/api/ContainerizerIntegrationTest.java b/jib-core/src/integration-test/java/com/google/cloud/tools/jib/api/ContainerizerIntegrationTest.java index 48728492d6..87bc36e86c 100644 --- a/jib-core/src/integration-test/java/com/google/cloud/tools/jib/api/ContainerizerIntegrationTest.java +++ b/jib-core/src/integration-test/java/com/google/cloud/tools/jib/api/ContainerizerIntegrationTest.java @@ -270,6 +270,11 @@ public void testSteps_forBuildToDockerRegistry_skipExistingDigest() // Test that both images have the same properties. Assert.assertEquals(image1.getDigest(), image2.getDigest()); Assert.assertEquals(image1.getImageId(), image2.getImageId()); + + // Test that the first image was pushed... + Assert.assertTrue(image1.isImagePushed()); + // ...while the second one was skipped + Assert.assertFalse(image2.isImagePushed()); } @Test diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/api/JibContainer.java b/jib-core/src/main/java/com/google/cloud/tools/jib/api/JibContainer.java index bf41b2eb7e..fce6fece5a 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/api/JibContainer.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/api/JibContainer.java @@ -29,17 +29,20 @@ public class JibContainer { private final DescriptorDigest imageDigest; private final DescriptorDigest imageId; private final Set tags; + private final Boolean imagePushed; @VisibleForTesting JibContainer( ImageReference targetImage, DescriptorDigest imageDigest, DescriptorDigest imageId, - Set tags) { + Set tags, + Boolean imagePushed) { this.targetImage = targetImage; this.imageDigest = imageDigest; this.imageId = imageId; this.tags = tags; + this.imagePushed = imagePushed; } static JibContainer from(BuildContext buildContext, BuildResult buildResult) { @@ -47,7 +50,7 @@ static JibContainer from(BuildContext buildContext, BuildResult buildResult) { DescriptorDigest imageDigest = buildResult.getImageDigest(); DescriptorDigest imageId = buildResult.getImageId(); Set tags = buildContext.getAllTargetImageTags(); - return new JibContainer(targetImage, imageDigest, imageId, tags); + return new JibContainer(targetImage, imageDigest, imageId, tags, buildResult.isImagePushed()); } /** @@ -59,6 +62,15 @@ public ImageReference getTargetImage() { return targetImage; } + /** + * Returns true if we pushed this image all the way to a registry. + * + * @return true if pushed. + */ + public Boolean isImagePushed() { + return imagePushed; + } + /** * Gets the digest of the registry image manifest built by Jib. This digest can be used to fetch a * specific image from the registry in the form {@code myregistry/myimage@digest}. diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/steps/BuildResult.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/steps/BuildResult.java index ffc3f32232..570152f4e6 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/steps/BuildResult.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/steps/BuildResult.java @@ -46,15 +46,17 @@ static BuildResult fromImage(Image image, Class pushImage( return manifestPushResults.isEmpty() ? new BuildResult( results.manifestCheckResult.get().get().getDigest(), - Verify.verifyNotNull(containerConfigPushResult).get().getDigest()) + Verify.verifyNotNull(containerConfigPushResult).get().getDigest(), + !(JibSystemProperties.skipExistingImages() + && results.manifestCheckResult.get().isPresent())) // Manifest pushers return the same BuildResult. : manifestPushResults.get(0).get(); }); diff --git a/jib-core/src/test/java/com/google/cloud/tools/jib/api/JibContainerTest.java b/jib-core/src/test/java/com/google/cloud/tools/jib/api/JibContainerTest.java index 607a3e9e95..62a995bc1b 100644 --- a/jib-core/src/test/java/com/google/cloud/tools/jib/api/JibContainerTest.java +++ b/jib-core/src/test/java/com/google/cloud/tools/jib/api/JibContainerTest.java @@ -53,18 +53,19 @@ public void setUp() throws DigestException, InvalidImageReferenceException { @Test public void testCreation() { - JibContainer container = new JibContainer(targetImage1, digest1, digest2, tags1); + JibContainer container = new JibContainer(targetImage1, digest1, digest2, tags1, true); Assert.assertEquals(targetImage1, container.getTargetImage()); Assert.assertEquals(digest1, container.getDigest()); Assert.assertEquals(digest2, container.getImageId()); Assert.assertEquals(tags1, container.getTags()); + Assert.assertEquals(true, container.isImagePushed()); } @Test public void testEquality() { - JibContainer container1 = new JibContainer(targetImage1, digest1, digest2, tags1); - JibContainer container2 = new JibContainer(targetImage1, digest1, digest2, tags1); + JibContainer container1 = new JibContainer(targetImage1, digest1, digest2, tags1, true); + JibContainer container2 = new JibContainer(targetImage1, digest1, digest2, tags1, true); Assert.assertEquals(container1, container2); Assert.assertEquals(container1.hashCode(), container2.hashCode()); @@ -72,8 +73,8 @@ public void testEquality() { @Test public void testEquality_differentTargetImage() { - JibContainer container1 = new JibContainer(targetImage1, digest1, digest2, tags1); - JibContainer container2 = new JibContainer(targetImage2, digest1, digest2, tags1); + JibContainer container1 = new JibContainer(targetImage1, digest1, digest2, tags1, true); + JibContainer container2 = new JibContainer(targetImage2, digest1, digest2, tags1, true); Assert.assertNotEquals(container1, container2); Assert.assertNotEquals(container1.hashCode(), container2.hashCode()); @@ -81,8 +82,8 @@ public void testEquality_differentTargetImage() { @Test public void testEquality_differentImageDigest() { - JibContainer container1 = new JibContainer(targetImage1, digest1, digest2, tags1); - JibContainer container2 = new JibContainer(targetImage1, digest2, digest2, tags1); + JibContainer container1 = new JibContainer(targetImage1, digest1, digest2, tags1, true); + JibContainer container2 = new JibContainer(targetImage1, digest2, digest2, tags1, true); Assert.assertNotEquals(container1, container2); Assert.assertNotEquals(container1.hashCode(), container2.hashCode()); @@ -90,8 +91,8 @@ public void testEquality_differentImageDigest() { @Test public void testEquality_differentImageId() { - JibContainer container1 = new JibContainer(targetImage1, digest1, digest1, tags1); - JibContainer container2 = new JibContainer(targetImage1, digest1, digest2, tags1); + JibContainer container1 = new JibContainer(targetImage1, digest1, digest1, tags1, true); + JibContainer container2 = new JibContainer(targetImage1, digest1, digest2, tags1, true); Assert.assertNotEquals(container1, container2); Assert.assertNotEquals(container1.hashCode(), container2.hashCode()); @@ -99,8 +100,8 @@ public void testEquality_differentImageId() { @Test public void testEquality_differentTags() { - JibContainer container1 = new JibContainer(targetImage1, digest1, digest1, tags1); - JibContainer container2 = new JibContainer(targetImage1, digest1, digest1, tags2); + JibContainer container1 = new JibContainer(targetImage1, digest1, digest1, tags1, true); + JibContainer container2 = new JibContainer(targetImage1, digest1, digest1, tags2, true); Assert.assertNotEquals(container1, container2); Assert.assertNotEquals(container1.hashCode(), container2.hashCode()); diff --git a/jib-core/src/test/java/com/google/cloud/tools/jib/builder/steps/BuildResultTest.java b/jib-core/src/test/java/com/google/cloud/tools/jib/builder/steps/BuildResultTest.java index 5397c93787..185056d705 100644 --- a/jib-core/src/test/java/com/google/cloud/tools/jib/builder/steps/BuildResultTest.java +++ b/jib-core/src/test/java/com/google/cloud/tools/jib/builder/steps/BuildResultTest.java @@ -47,16 +47,17 @@ public void setUp() throws DigestException { @Test public void testCreated() { - BuildResult container = new BuildResult(digest1, id); + BuildResult container = new BuildResult(digest1, id, true); Assert.assertEquals(digest1, container.getImageDigest()); Assert.assertEquals(id, container.getImageId()); + Assert.assertTrue(container.isImagePushed()); } @Test public void testEquality() { - BuildResult container1 = new BuildResult(digest1, id); - BuildResult container2 = new BuildResult(digest1, id); - BuildResult container3 = new BuildResult(digest2, id); + BuildResult container1 = new BuildResult(digest1, id, true); + BuildResult container2 = new BuildResult(digest1, id, true); + BuildResult container3 = new BuildResult(digest2, id, true); Assert.assertEquals(container1, container2); Assert.assertEquals(container1.hashCode(), container2.hashCode()); diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ImageMetadataOutput.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ImageMetadataOutput.java index 026ebe1b06..17b3618558 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ImageMetadataOutput.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/ImageMetadataOutput.java @@ -46,17 +46,20 @@ public class ImageMetadataOutput implements JsonTemplate { private final String imageId; private final String imageDigest; private final List tags; + private final Boolean imagePushed; @JsonCreator ImageMetadataOutput( @JsonProperty(value = "image", required = true) String image, @JsonProperty(value = "imageId", required = true) String imageId, @JsonProperty(value = "imageDigest", required = true) String imageDigest, - @JsonProperty(value = "tags", required = true) List tags) { + @JsonProperty(value = "tags", required = true) List tags, + @JsonProperty(value = "imagePushed", required = true) Boolean imagePushed) { this.image = image; this.imageId = imageId; this.imageDigest = imageDigest; this.tags = tags; + this.imagePushed = imagePushed; } @VisibleForTesting @@ -74,11 +77,12 @@ public static ImageMetadataOutput fromJibContainer(JibContainer jibContainer) { String image = jibContainer.getTargetImage().toString(); String imageId = jibContainer.getImageId().toString(); String imageDigest = jibContainer.getDigest().toString(); + Boolean imagePushed = jibContainer.isImagePushed(); // Make sure tags always appear in a predictable way, by sorting them into a list List tags = ImmutableList.sortedCopyOf(jibContainer.getTags()); - return new ImageMetadataOutput(image, imageId, imageDigest, tags); + return new ImageMetadataOutput(image, imageId, imageDigest, tags, imagePushed); } public String getImage() { @@ -97,6 +101,10 @@ public List getTags() { return tags; } + public Boolean isImagePushed() { + return imagePushed; + } + public String toJson() throws IOException { return JsonTemplateMapper.toUtf8String(this); } diff --git a/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/ImageMetadataOutputTest.java b/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/ImageMetadataOutputTest.java index 156c4dd638..037a5b31b1 100644 --- a/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/ImageMetadataOutputTest.java +++ b/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/ImageMetadataOutputTest.java @@ -30,7 +30,8 @@ public class ImageMetadataOutputTest { + "\"sha256:61bb3ec31a47cb730eb58a38bbfa813761a51dca69d10e39c24c3d00a7b2c7a9\"," + "\"imageDigest\":" + "\"sha256:3f1be7e19129edb202c071a659a4db35280ab2bb1a16f223bfd5d1948657b6fc\"," - + "\"tags\":[\"latest\",\"tag\"]" + + "\"tags\":[\"latest\",\"tag\"]," + + "\"imagePushed\":true" + "}"; @Test @@ -43,6 +44,7 @@ public void testFromJson() throws IOException { Assert.assertEquals( "sha256:3f1be7e19129edb202c071a659a4db35280ab2bb1a16f223bfd5d1948657b6fc", output.getImageDigest()); + Assert.assertTrue(output.isImagePushed()); Assert.assertEquals(ImmutableList.of("latest", "tag"), output.getTags()); }