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 aeb50913d8..361a016368 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 @@ -21,6 +21,7 @@ import com.google.common.annotations.VisibleForTesting; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; /** The container built by Jib. */ public class JibContainer { @@ -99,6 +100,29 @@ public Set getTags() { return tags; } + /** + * Get the image tags with digest. + * + * @return the image tags with digest + */ + public Set getImageTagsWithDigest() { + return tags.stream() + .map( + tag -> { + StringBuilder imageTagWithDigest = + new StringBuilder() + .append(targetImage.getRegistry()) + .append("/") + .append(targetImage.getRepository()) + .append(":") + .append(tag) + .append("@") + .append(imageDigest); + return imageTagWithDigest.toString(); + }) + .collect(Collectors.toSet()); + } + @Override public int hashCode() { return Objects.hash(targetImage, imageDigest, imageId, tags, imagePushed); 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 cb0e4ec3a8..e605069c0a 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 @@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableSet; import java.security.DigestException; import java.util.Set; +import java.util.stream.Collectors; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -142,4 +143,30 @@ public void testCreation_withBuildContextAndBuildResult() { Assert.assertEquals(tags1, container.getTags()); Assert.assertTrue(container.isImagePushed()); } + + @Test + public void testGetImageTagsWithDigest_constructsCorrectImageTagsWithDigest() { + JibContainer container = new JibContainer(targetImage1, digest1, digest2, tags1, true); + + Set expectedImageTagsWithDigest = + tags1.stream() + .map( + tag -> { + StringBuilder imageTagWithDigest = + new StringBuilder() + .append(targetImage1.getRegistry()) + .append("/") + .append(targetImage1.getRepository()) + .append(":") + .append(tag) + .append("@") + .append(digest1); + return imageTagWithDigest.toString(); + }) + .collect(Collectors.toSet()); + + Set imageTagsWithDigest = container.getImageTagsWithDigest(); + + Assert.assertEquals(expectedImageTagsWithDigest, imageTagsWithDigest); + } } diff --git a/jib-gradle-plugin/README.md b/jib-gradle-plugin/README.md index 7ae6237045..e95c23f325 100644 --- a/jib-gradle-plugin/README.md +++ b/jib-gradle-plugin/README.md @@ -286,6 +286,7 @@ Property | Type | Default | Description `tar` | `File` | `(project-dir)/build/jib-image.tar` | The path of the tarball generated by `jibBuildTar`. Relative paths are resolved relative to the project root. `digest` | `File` | `(project-dir)/build/jib-image.digest` | The path of the image digest written out during the build. Relative paths are resolved relative to the project root. `imageId` | `File` | `(project-dir)/build/jib-image.id` | The path of the image ID written out during the build. Relative paths are resolved relative to the project root. +`imageTagDigest` | string | `(project-dir)/build/jib-image-tag.digest` | The path of the image tags with digest written out during the build. Relative paths are resolved relative to the project root. `dockerClient` is an object used to configure Docker when building to/from the Docker daemon. It has the following properties: diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java index 10195cc756..7c79a8a650 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleRawConfiguration.java @@ -203,6 +203,11 @@ public Path getDigestOutputPath() { return jibExtension.getOutputPaths().getDigestPath(); } + @Override + public Path getImageTagDigestOutputPath() { + return jibExtension.getOutputPaths().getImageTagDigestPath(); + } + @Override public Path getImageIdOutputPath() { return jibExtension.getOutputPaths().getImageIdPath(); diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/OutputPathsParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/OutputPathsParameters.java index 46b4b6e608..76ace959bf 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/OutputPathsParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/OutputPathsParameters.java @@ -30,6 +30,7 @@ public class OutputPathsParameters { private final Project project; private Path digest; + private Path imageTagDigest; private Path tar; private Path imageId; private Path imageJson; @@ -38,6 +39,7 @@ public class OutputPathsParameters { public OutputPathsParameters(Project project) { this.project = project; digest = project.getBuildDir().toPath().resolve("jib-image.digest"); + imageTagDigest = project.getBuildDir().toPath().resolve("jib-image-tag.digest"); imageId = project.getBuildDir().toPath().resolve("jib-image.id"); imageJson = project.getBuildDir().toPath().resolve("jib-image.json"); tar = project.getBuildDir().toPath().resolve("jib-image.tar"); @@ -57,6 +59,21 @@ public void setDigest(String digest) { this.digest = Paths.get(digest); } + @Input + public String getImageTagDigest() { + return getRelativeToProjectRoot(imageTagDigest, PropertyNames.OUTPUT_PATHS_IMAGE_TAG_DIGEST) + .toString(); + } + + @Internal + public Path getImageTagDigestPath() { + return getRelativeToProjectRoot(imageTagDigest, PropertyNames.OUTPUT_PATHS_IMAGE_TAG_DIGEST); + } + + public void setImageTagDigest(String imageTagDigest) { + this.imageTagDigest = Paths.get(imageTagDigest); + } + @Input public String getImageId() { return getRelativeToProjectRoot(imageId, PropertyNames.OUTPUT_PATHS_IMAGE_ID).toString(); diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleRawConfigurationTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleRawConfigurationTest.java index 8655241553..e48ff59695 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleRawConfigurationTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleRawConfigurationTest.java @@ -103,6 +103,8 @@ public void testGetters() { .thenReturn(new HashMap<>(ImmutableMap.of("docker", "client"))); Mockito.when(outputPathsParameters.getDigestPath()).thenReturn(Paths.get("digest/path")); + Mockito.when(outputPathsParameters.getImageTagDigestPath()) + .thenReturn(Paths.get("image-tag-digest/path")); Mockito.when(outputPathsParameters.getImageIdPath()).thenReturn(Paths.get("id/path")); Mockito.when(outputPathsParameters.getImageJsonPath()).thenReturn(Paths.get("json/path")); Mockito.when(outputPathsParameters.getTarPath()).thenReturn(Paths.get("tar/path")); @@ -147,6 +149,8 @@ public void testGetters() { new HashMap<>(ImmutableMap.of("docker", "client")), rawConfiguration.getDockerEnvironment()); Assert.assertEquals(Paths.get("digest/path"), rawConfiguration.getDigestOutputPath()); + Assert.assertEquals( + Paths.get("image-tag-digest/path"), rawConfiguration.getImageTagDigestOutputPath()); Assert.assertEquals(Paths.get("id/path"), rawConfiguration.getImageIdOutputPath()); Assert.assertEquals(Paths.get("json/path"), rawConfiguration.getImageJsonOutputPath()); Assert.assertEquals(Paths.get("tar/path"), rawConfiguration.getTarOutputPath()); diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibExtensionTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibExtensionTest.java index 440ae17779..42279d89cb 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibExtensionTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibExtensionTest.java @@ -393,12 +393,15 @@ public void testOutputFiles() { testJibExtension.outputPaths( outputFiles -> { outputFiles.setDigest("/path/to/digest"); + outputFiles.setImageTagDigest("/path/to/image-tag-digest"); outputFiles.setImageId("/path/to/id"); outputFiles.setTar("path/to/tar"); }); assertThat(testJibExtension.getOutputPaths().getDigestPath()) .isEqualTo(Paths.get("/path/to/digest").toAbsolutePath()); + assertThat(testJibExtension.getOutputPaths().getImageTagDigestPath()) + .isEqualTo(Paths.get("/path/to/image-tag-digest").toAbsolutePath()); assertThat(testJibExtension.getOutputPaths().getImageIdPath()) .isEqualTo(Paths.get("/path/to/id").toAbsolutePath()); assertThat(testJibExtension.getOutputPaths().getTarPath()) @@ -555,6 +558,9 @@ public void testPropertiesOutputPaths() { System.setProperty("jib.outputPaths.digest", "/digest/path"); assertThat(testJibExtension.getOutputPaths().getDigestPath()) .isEqualTo(Paths.get("/digest/path").toAbsolutePath()); + System.setProperty("jib.outputPaths.imageTagDigest", "/image-tag-digest/path"); + assertThat(testJibExtension.getOutputPaths().getImageTagDigestPath()) + .isEqualTo(Paths.get("/image-tag-digest/path").toAbsolutePath()); System.setProperty("jib.outputPaths.imageId", "/id/path"); assertThat(testJibExtension.getOutputPaths().getImageIdPath()) .isEqualTo(Paths.get("/id/path").toAbsolutePath()); @@ -565,6 +571,9 @@ public void testPropertiesOutputPaths() { System.setProperty("jib.outputPaths.digest", "digest/path"); assertThat(testJibExtension.getOutputPaths().getDigestPath()) .isEqualTo(fakeProject.getProjectDir().toPath().resolve("digest/path")); + System.setProperty("jib.outputPaths.imageTagDigest", "image-tag-digest/path"); + assertThat(testJibExtension.getOutputPaths().getImageTagDigestPath()) + .isEqualTo(fakeProject.getProjectDir().toPath().resolve("image-tag-digest/path")); System.setProperty("jib.outputPaths.imageId", "id/path"); assertThat(testJibExtension.getOutputPaths().getImageIdPath()) .isEqualTo(fakeProject.getProjectDir().toPath().resolve("id/path")); diff --git a/jib-maven-plugin/README.md b/jib-maven-plugin/README.md index f489befef5..7ca57e771d 100644 --- a/jib-maven-plugin/README.md +++ b/jib-maven-plugin/README.md @@ -336,6 +336,7 @@ Property | Type | Default | Description `digest` | string | `(project-dir)/target/jib-image.digest` | The path of the image digest written out during the build. Relative paths are resolved relative to the project root. `imageId` | string | `(project-dir)/target/jib-image.id` | The path of the image ID written out during the build. Relative paths are resolved relative to the project root. `imageJson` | string | `(project-dir)/target/jib-image.json` | The path of the image metadata json file written out during the build. Relative paths are resolved relative to the project root. +`imageTagDigest` | string | `(project-dir)/target/jib-image-tag.digest` | The path of the image tags with digest written out during the build. Relative paths are resolved relative to the project root. `dockerClient` is an object used to configure Docker when building to/from the Docker daemon. It has the following properties: diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java index 0e897cdaa9..c349dcd3bf 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java @@ -322,6 +322,7 @@ public static class OutputPathsParameters { @Nullable @Parameter private File tar; @Nullable @Parameter private File digest; + @Nullable @Parameter private File imageTagDigest; @Nullable @Parameter private File imageId; @Nullable @Parameter private File imageJson; } @@ -776,6 +777,14 @@ Path getDigestOutputPath() { return getRelativeToProjectRoot(configuredPath, PropertyNames.OUTPUT_PATHS_DIGEST); } + Path getImageTagDigestOutputPath() { + Path configuredPath = + outputPaths.imageTagDigest == null + ? Paths.get(getProject().getBuild().getDirectory()).resolve("jib-image-tag.digest") + : outputPaths.imageTagDigest.toPath(); + return getRelativeToProjectRoot(configuredPath, PropertyNames.OUTPUT_PATHS_IMAGE_TAG_DIGEST); + } + Path getImageIdOutputPath() { Path configuredPath = outputPaths.imageId == null diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java index 0d11c86f6f..8aa0793ec8 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MavenRawConfiguration.java @@ -200,6 +200,11 @@ public Path getDigestOutputPath() { return jibPluginConfiguration.getDigestOutputPath(); } + @Override + public Path getImageTagDigestOutputPath() { + return jibPluginConfiguration.getImageTagDigestOutputPath(); + } + @Override public Path getImageIdOutputPath() { return jibPluginConfiguration.getImageIdOutputPath(); diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java index b518fbc321..ea3ffa94ef 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java @@ -205,6 +205,9 @@ public void testSystemPropertiesOutputPaths() { // Absolute paths sessionSystemProperties.put("jib.outputPaths.digest", "/digest/path"); assertThat(testPluginConfiguration.getDigestOutputPath()).isEqualTo(Paths.get("/digest/path")); + sessionSystemProperties.put("jib.outputPaths.imageTagDigest", "/image-tag-digest/path"); + assertThat(testPluginConfiguration.getImageTagDigestOutputPath()) + .isEqualTo(Paths.get("/image-tag-digest/path")); sessionSystemProperties.put("jib.outputPaths.imageId", "/id/path"); assertThat(testPluginConfiguration.getImageIdOutputPath()).isEqualTo(Paths.get("/id/path")); sessionSystemProperties.put("jib.outputPaths.tar", "/tar/path"); @@ -213,6 +216,9 @@ public void testSystemPropertiesOutputPaths() { sessionSystemProperties.put("jib.outputPaths.digest", "digest/path"); assertThat(testPluginConfiguration.getDigestOutputPath()) .isEqualTo(Paths.get("/repository/project/digest/path")); + sessionSystemProperties.put("jib.outputPaths.imageTagDigest", "image-tag-digest/path"); + assertThat(testPluginConfiguration.getImageTagDigestOutputPath()) + .isEqualTo(Paths.get("/repository/project/image-tag-digest/path")); sessionSystemProperties.put("jib.outputPaths.imageId", "id/path"); assertThat(testPluginConfiguration.getImageIdOutputPath()) .isEqualTo(Paths.get("/repository/project/id/path")); @@ -323,6 +329,9 @@ public void testPomPropertiesExtraDirectories() { public void testPomPropertiesOutputPaths() { project.getProperties().setProperty("jib.outputPaths.digest", "/digest/path"); assertThat(testPluginConfiguration.getDigestOutputPath()).isEqualTo(Paths.get("/digest/path")); + project.getProperties().setProperty("jib.outputPaths.imageTagDigest", "/image-tag-digest/path"); + assertThat(testPluginConfiguration.getImageTagDigestOutputPath()) + .isEqualTo(Paths.get("/image-tag-digest/path")); project.getProperties().setProperty("jib.outputPaths.imageId", "/id/path"); assertThat(testPluginConfiguration.getImageIdOutputPath()).isEqualTo(Paths.get("/id/path")); project.getProperties().setProperty("jib.outputPaths.imageJson", "/json/path"); diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenRawConfigurationTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenRawConfigurationTest.java index 44798046e6..af23b8346a 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenRawConfigurationTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/MavenRawConfigurationTest.java @@ -100,6 +100,8 @@ public void testGetters() { Mockito.when(jibPluginConfiguration.getDockerClientEnvironment()) .thenReturn(new HashMap<>(ImmutableMap.of("docker", "client"))); Mockito.when(jibPluginConfiguration.getDigestOutputPath()).thenReturn(Paths.get("digest/path")); + Mockito.when(jibPluginConfiguration.getImageTagDigestOutputPath()) + .thenReturn(Paths.get("image-tag-digest/path")); Mockito.when(jibPluginConfiguration.getImageIdOutputPath()).thenReturn(Paths.get("id/path")); Mockito.when(jibPluginConfiguration.getImageJsonOutputPath()) .thenReturn(Paths.get("json/path")); @@ -144,6 +146,8 @@ public void testGetters() { new HashMap<>(ImmutableMap.of("docker", "client")), rawConfiguration.getDockerEnvironment()); Assert.assertEquals(Paths.get("digest/path"), jibPluginConfiguration.getDigestOutputPath()); + Assert.assertEquals( + Paths.get("image-tag-digest/path"), jibPluginConfiguration.getImageTagDigestOutputPath()); Assert.assertEquals(Paths.get("id/path"), jibPluginConfiguration.getImageIdOutputPath()); Assert.assertEquals(Paths.get("json/path"), jibPluginConfiguration.getImageJsonOutputPath()); Assert.assertEquals(Paths.get("tar/path"), jibPluginConfiguration.getTarOutputPath()); 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..7744c5b4e2 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 @@ -193,6 +193,7 @@ private static void handleRegistryUnauthorizedException( private final Consumer logger; private final HelpfulSuggestions helpfulSuggestions; @Nullable private Path imageDigestOutputPath; + @Nullable private Path imageTagDigestOutputPath; @Nullable private Path imageIdOutputPath; @Nullable private Path imageJsonOutputPath; @@ -236,6 +237,10 @@ public JibContainer runBuild() String imageDigest = jibContainer.getDigest().toString(); Files.write(imageDigestOutputPath, imageDigest.getBytes(StandardCharsets.UTF_8)); } + if (imageTagDigestOutputPath != null) { + Set imageTagsWithDigest = jibContainer.getImageTagsWithDigest(); + Files.write(imageTagDigestOutputPath, imageTagsWithDigest); + } if (imageIdOutputPath != null) { String imageId = jibContainer.getImageId().toString(); Files.write(imageIdOutputPath, imageId.getBytes(StandardCharsets.UTF_8)); @@ -304,6 +309,11 @@ public JibBuildRunner writeImageDigest(@Nullable Path imageDigestOutputPath) { return this; } + public JibBuildRunner writeImageTagDigest(@Nullable Path imageTagDigestOutputPath) { + this.imageTagDigestOutputPath = imageTagDigestOutputPath; + return this; + } + /** * Set the location where the image id will be saved. If {@code null} then digest is not saved. * diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessor.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessor.java index 8ac4001db5..2117d99479 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessor.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessor.java @@ -167,6 +167,7 @@ public static JibBuildRunner createJibBuildRunnerForDockerDaemonImage( targetImageReference, rawConfiguration.getToTags()) .writeImageDigest(rawConfiguration.getDigestOutputPath()) + .writeImageTagDigest(rawConfiguration.getImageTagDigestOutputPath()) .writeImageId(rawConfiguration.getImageIdOutputPath()) .writeImageJson(rawConfiguration.getImageJsonOutputPath()); } @@ -235,6 +236,7 @@ public static JibBuildRunner createJibBuildRunnerForTarImage( helpfulSuggestions, rawConfiguration.getTarOutputPath()) .writeImageDigest(rawConfiguration.getDigestOutputPath()) + .writeImageTagDigest(rawConfiguration.getImageTagDigestOutputPath()) .writeImageId(rawConfiguration.getImageIdOutputPath()) .writeImageJson(rawConfiguration.getImageJsonOutputPath()); } @@ -320,6 +322,7 @@ public static JibBuildRunner createJibBuildRunnerForRegistryImage( targetImageReference, rawConfiguration.getToTags()) .writeImageDigest(rawConfiguration.getDigestOutputPath()) + .writeImageTagDigest(rawConfiguration.getImageTagDigestOutputPath()) .writeImageId(rawConfiguration.getImageIdOutputPath()) .writeImageJson(rawConfiguration.getImageJsonOutputPath()); } diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java index 14e27c2ed3..d2a3c33daa 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java @@ -54,6 +54,7 @@ public class PropertyNames { public static final String DOCKER_CLIENT_EXECUTABLE = "jib.dockerClient.executable"; public static final String DOCKER_CLIENT_ENVIRONMENT = "jib.dockerClient.environment"; public static final String OUTPUT_PATHS_DIGEST = "jib.outputPaths.digest"; + public static final String OUTPUT_PATHS_IMAGE_TAG_DIGEST = "jib.outputPaths.imageTagDigest"; public static final String OUTPUT_PATHS_IMAGE_ID = "jib.outputPaths.imageId"; public static final String OUTPUT_PATHS_IMAGE_JSON = "jib.outputPaths.imageJson"; public static final String OUTPUT_PATHS_TAR = "jib.outputPaths.tar"; diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java index b31cf326ec..56a4ee36b8 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/RawConfiguration.java @@ -129,6 +129,8 @@ interface CredHelperConfiguration { Path getDigestOutputPath(); + Path getImageTagDigestOutputPath(); + Path getImageIdOutputPath(); Path getImageJsonOutputPath(); 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..e90fb2a815 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 @@ -253,4 +253,29 @@ public void testBuildImage_writesImageJson() throws Exception { Assert.assertEquals(tags, ImmutableSet.copyOf(metadataOutput.getTags())); Assert.assertTrue(metadataOutput.isImagePushed()); } + + @Test + public void testBuildImage_writeImageTagDigest() throws Exception { + Set imageTagsDigest = + ImmutableSet.of( + "gcr.io/project/image:latest@sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789", + "gcr.io/project/image:custom-tag@sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"); + + String expectedImageTagsDigestOutput = + "gcr.io/project/image:latest@sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789\n" + + "gcr.io/project/image:custom-tag@sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789\n"; + + final Path outputPath = temporaryFolder.newFile("jib-image-tag.digest").toPath(); + + Mockito.when(mockJibContainer.getImageTagsWithDigest()).thenReturn(imageTagsDigest); + Mockito.when(mockJibContainerBuilder.containerize(mockContainerizer)) + .thenReturn(mockJibContainer); + + testJibBuildRunner.writeImageTagDigest(outputPath).runBuild(); + + final String imageTagDigestOutput = + new String(Files.readAllBytes(outputPath), StandardCharsets.UTF_8); + + Assert.assertEquals(expectedImageTagsDigestOutput, imageTagDigestOutput); + } }