From a55e53a0584ba13148e5dd095952e35b5886465d Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Tue, 16 Aug 2022 10:51:36 -0400 Subject: [PATCH 01/24] Update permissions type from Map to MapProperty --- .../jib/gradle/ExtraDirectoriesParameters.java | 15 ++++++++------- .../tools/jib/gradle/GradleRawConfiguration.java | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java index ae65353580..c1150f8404 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java @@ -29,6 +29,7 @@ import org.gradle.api.Project; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ListProperty; +import org.gradle.api.provider.MapProperty; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; @@ -40,7 +41,7 @@ public class ExtraDirectoriesParameters { private ListProperty paths; private ExtraDirectoryParametersSpec spec; - private Map permissions = Collections.emptyMap(); + private MapProperty permissions; @Inject public ExtraDirectoriesParameters(ObjectFactory objects, Project project) { @@ -48,6 +49,7 @@ public ExtraDirectoriesParameters(ObjectFactory objects, Project project) { this.project = project; paths = objects.listProperty(ExtraDirectoryParameters.class).empty(); spec = objects.newInstance(ExtraDirectoryParametersSpec.class, project, paths); + permissions = objects.mapProperty(String.class, String.class).empty(); } public void paths(Action action) { @@ -106,15 +108,14 @@ public void setPaths(Object paths) { * @return the permissions map from path on container to file permissions */ @Input - public Map getPermissions() { + public MapProperty getPermissions() { String property = System.getProperty(PropertyNames.EXTRA_DIRECTORIES_PERMISSIONS); if (property != null) { - return ConfigurationPropertyValidator.parseMapProperty(property); + Map parsedPermissions = ConfigurationPropertyValidator.parseMapProperty(property); + if (!parsedPermissions.equals(permissions.get())) { + permissions.set(parsedPermissions); + } } return permissions; } - - public void setPermissions(Map permissions) { - this.permissions = permissions; - } } 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 1e8359bb37..fe55973dae 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 @@ -174,7 +174,7 @@ public List getExtraDirectories() { @Override public Map getExtraDirectoryPermissions() { - return TaskCommon.convertPermissionsMap(jibExtension.getExtraDirectories().getPermissions()); + return TaskCommon.convertPermissionsMap(jibExtension.getExtraDirectories().getPermissions().get()); } @Override From 019fd6541de2fdea211c17901505a0a8b745f8bf Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Tue, 16 Aug 2022 14:53:00 -0400 Subject: [PATCH 02/24] Convert path.from and path.into to property types --- .../jib/gradle/ExtraDirectoryParameters.java | 46 ++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java index 008fd53b85..9636474013 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java @@ -22,8 +22,11 @@ import java.util.List; import javax.inject.Inject; import org.gradle.api.Project; +import org.gradle.api.Transformer; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ListProperty; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.Provider; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; @@ -31,49 +34,70 @@ public class ExtraDirectoryParameters implements ExtraDirectoriesConfiguration { private Project project; - private Path from = Paths.get(""); - private String into = "/"; + private Property from; + private Property into; private ListProperty includes; private ListProperty excludes; @Inject public ExtraDirectoryParameters(ObjectFactory objects, Project project) { this.project = project; - includes = objects.listProperty(String.class).empty(); - excludes = objects.listProperty(String.class).empty(); + this.from = objects.property(Path.class).value(Paths.get("")); + this.into = objects.property(String.class).value("/"); + this.includes = objects.listProperty(String.class).empty(); + this.excludes = objects.listProperty(String.class).empty(); } ExtraDirectoryParameters(ObjectFactory objects, Project project, Path from, String into) { this(objects, project); - this.from = from; - this.into = into; + this.from = objects.property(Path.class).value(from); + this.into = objects.property(String.class).value(into); } @Input public String getFromString() { // Gradle warns about @Input annotations on File objects, so we have to expose a getter for a // String to make them go away. - return from.toString(); + return from.get().toString(); } @Override @Internal public Path getFrom() { - return from; + return from.get(); } public void setFrom(Object from) { - this.from = project.file(from).toPath(); + // TODO: this should also be able support provider of objects convertible by project.file() + System.out.println("setFrom object: " + from); + this.from.set(project.file(from).toPath()); } +// public void setFrom(Provider from) { +// this.from.set( +// from.map( +// new Transformer() { +// @Override +// public Path transform(Object from) { +// return project.file(from).toPath(); +// } +// } +// ) +// ); +// } + @Override @Input public String getInto() { - return into; + return into.get(); } public void setInto(String into) { - this.into = into; + this.into.set(into); + } + + public void setInto(Provider into) { + this.into.set(into); } @Input From 3402b29e5c43609ec160026547ed40aec605a1d6 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Tue, 16 Aug 2022 17:13:34 -0400 Subject: [PATCH 03/24] WIP: add/fix unit tests --- .../tools/jib/gradle/JibExtensionTest.java | 12 ++++++------ .../cloud/tools/jib/gradle/JibPluginTest.java | 13 +++++++++++++ .../projects/lazy-evaluation/build.gradle | 17 +++++++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) 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 c6cafa3c71..e4c63d10d1 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 @@ -241,7 +241,7 @@ public void testExtraDirectories_default() { assertThat(testJibExtension.getExtraDirectories().getPaths()).hasSize(1); assertThat(testJibExtension.getExtraDirectories().getPaths().get(0).getFrom()) .isEqualTo(fakeProject.getProjectDir().toPath().resolve("src/main/jib")); - assertThat(testJibExtension.getExtraDirectories().getPermissions()).isEmpty(); + assertThat(testJibExtension.getExtraDirectories().getPermissions().get()).isEmpty(); } @Test @@ -249,15 +249,15 @@ public void testExtraDirectories() { testJibExtension.extraDirectories( extraDirectories -> { extraDirectories.setPaths("test/path"); - extraDirectories.setPermissions(ImmutableMap.of("file1", "123", "file2", "456")); +// extraDirectories.setPermissions(ImmutableMap.of("file1", "123", "file2", "456")); }); assertThat(testJibExtension.getExtraDirectories().getPaths()).hasSize(1); assertThat(testJibExtension.getExtraDirectories().getPaths().get(0).getFrom()) .isEqualTo(fakeProject.getProjectDir().toPath().resolve("test/path")); - assertThat(testJibExtension.getExtraDirectories().getPermissions()) - .containsExactly("file1", "123", "file2", "456") - .inOrder(); +// assertThat(testJibExtension.getExtraDirectories().getPermissions().get()) +// .containsExactly("file1", "123", "file2", "456") +// .inOrder(); } @Test @@ -456,7 +456,7 @@ public void testProperties() { assertThat(testJibExtension.getExtraDirectories().getPaths().get(1).getFrom()) .isEqualTo(Paths.get("/bar/baz")); System.setProperty("jib.extraDirectories.permissions", "/foo/bar=707,/baz=456"); - assertThat(testJibExtension.getExtraDirectories().getPermissions()) + assertThat(testJibExtension.getExtraDirectories().getPermissions().get()) .containsExactly("/foo/bar", "707", "/baz", "456") .inOrder(); diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java index a5687b949d..41e04813fc 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java @@ -368,6 +368,19 @@ public void testLazyEvalForLabels() { "labels contain values [firstkey:updated-first-label, secondKey:updated-second-label]"); } + @Test + public void testLazyEvalForExtraDirectories() { + // TODO: Add task and test for lazy evaluation + System.out.println("testLazyEvalForExtraDirectories"); + BuildResult checkExtraDirectories = testProject.build("check-extra-directories", "-Djib.console=plain"); + assertThat(checkExtraDirectories.getOutput()) + .contains("extraDirectories permissions: [/txt-files/*.txt:755]"); + assertThat(checkExtraDirectories.getOutput()) + .contains("extraDirectories paths: [" + + testProject.getRoot().toPath().resolve("updated-custom-extra-dir-1") + ", " + + testProject.getRoot().toPath().resolve("updated-custom-extra-dir-2") + "]"); + } + private Project createProject(String... plugins) { Project project = ProjectBuilder.builder().withProjectDir(testProjectRoot.getRoot()).withName("root").build(); diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle index c188939cd3..c606937db5 100644 --- a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle @@ -18,6 +18,7 @@ project.ext.value = 'original' project.afterEvaluate { project.ext.value = 'updated' + project.ext.getCustomPermissions = { -> return ['/txt-files/*.txt': '755'] } } jib { @@ -33,9 +34,25 @@ jib { ] } } + extraDirectories { + paths = project.provider { + [ + project.ext.value + '-custom-extra-dir-1', + project.ext.value + '-custom-extra-dir-2' + ] + } + permissions = project.provider { -> project.ext.getCustomPermissions() } + } } tasks.register('showlabels') { Map prop = project.extensions.getByName('jib')['container']['labels'].get() println('labels contain values ' + prop) } + +tasks.register('check-extra-directories') { + Map permissions = project.extensions.getByName('jib')['extraDirectories']['permissions'].get() + List paths = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['from']}; + println('extraDirectories permissions: ' + permissions) + println('extraDirectories paths: ' + paths) +} From 63319af28c0ad451d83fee114e8ccc5c06e94b9c Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 17 Aug 2022 09:56:10 -0400 Subject: [PATCH 04/24] WIP: changes to setFrom to accept Provider type --- .../gradle/ExtraDirectoriesParameters.java | 1 + .../jib/gradle/ExtraDirectoryParameters.java | 45 ++++++++++++------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java index c1150f8404..f8db042de2 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java @@ -94,6 +94,7 @@ public List getPaths() { * @param paths paths to set. */ public void setPaths(Object paths) { +// System.out.println("setPaths paths: " + paths); this.paths.set( project.files(paths).getFiles().stream() .map(file -> new ExtraDirectoryParameters(objects, project, file.toPath(), "/")) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java index 9636474013..a5fbbb51cf 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java @@ -67,24 +67,39 @@ public Path getFrom() { return from.get(); } - public void setFrom(Object from) { + public void setFrom(Object fromObj) { // TODO: this should also be able support provider of objects convertible by project.file() - System.out.println("setFrom object: " + from); - this.from.set(project.file(from).toPath()); +// System.out.println("setFrom object: " + fromObj); + // TODO: if from is a Provider<>, here we need to convert it to a Provider + if (fromObj instanceof Provider) { +// System.out.println("object is a provider"); + Provider fromProvider = (Provider) fromObj; + this.from.set( + fromProvider.map( + new Transformer() { + @Override + public Path transform(Object obj) { + return project.file(obj).toPath(); + } + })); + } else { +// System.out.println("object is not a provider"); + this.from.set(project.file(fromObj).toPath()); + } } -// public void setFrom(Provider from) { -// this.from.set( -// from.map( -// new Transformer() { -// @Override -// public Path transform(Object from) { -// return project.file(from).toPath(); -// } -// } -// ) -// ); -// } + // public void setFrom(Provider from) { + // this.from.set( + // from.map( + // new Transformer() { + // @Override + // public Path transform(Object from) { + // return project.file(from).toPath(); + // } + // } + // ) + // ); + // } @Override @Input From 5e6f23755b2ec8317f0c5f03ce191450d085a738 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 17 Aug 2022 11:07:39 -0400 Subject: [PATCH 05/24] WIP: comment out added tests for more debugging --- .../cloud/tools/jib/gradle/JibPluginTest.java | 24 +++++++-------- .../projects/lazy-evaluation/build.gradle | 30 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java index 41e04813fc..1e5e3eba7c 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java @@ -368,18 +368,18 @@ public void testLazyEvalForLabels() { "labels contain values [firstkey:updated-first-label, secondKey:updated-second-label]"); } - @Test - public void testLazyEvalForExtraDirectories() { - // TODO: Add task and test for lazy evaluation - System.out.println("testLazyEvalForExtraDirectories"); - BuildResult checkExtraDirectories = testProject.build("check-extra-directories", "-Djib.console=plain"); - assertThat(checkExtraDirectories.getOutput()) - .contains("extraDirectories permissions: [/txt-files/*.txt:755]"); - assertThat(checkExtraDirectories.getOutput()) - .contains("extraDirectories paths: [" + - testProject.getRoot().toPath().resolve("updated-custom-extra-dir-1") + ", " + - testProject.getRoot().toPath().resolve("updated-custom-extra-dir-2") + "]"); - } +// @Test +// public void testLazyEvalForExtraDirectories() { +// // TODO: Add task and test for lazy evaluation +// System.out.println("testLazyEvalForExtraDirectories"); +// BuildResult checkExtraDirectories = testProject.build("check-extra-directories", "-Djib.console=plain"); +// assertThat(checkExtraDirectories.getOutput()) +// .contains("extraDirectories permissions: [/txt-files/*.txt:755]"); +// assertThat(checkExtraDirectories.getOutput()) +// .contains("extraDirectories paths: [" + +// testProject.getRoot().toPath().resolve("updated-custom-extra-dir-1") + ", " + +// testProject.getRoot().toPath().resolve("updated-custom-extra-dir-2") + "]"); +// } private Project createProject(String... plugins) { Project project = diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle index c606937db5..40464ab5e4 100644 --- a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle @@ -34,15 +34,15 @@ jib { ] } } - extraDirectories { - paths = project.provider { - [ - project.ext.value + '-custom-extra-dir-1', - project.ext.value + '-custom-extra-dir-2' - ] - } - permissions = project.provider { -> project.ext.getCustomPermissions() } - } +// extraDirectories { +// paths = project.provider { +// [ +// project.ext.value + '-custom-extra-dir-1', +// project.ext.value + '-custom-extra-dir-2' +// ] +// } +// permissions = project.provider { -> project.ext.getCustomPermissions() } +// } } tasks.register('showlabels') { @@ -50,9 +50,9 @@ tasks.register('showlabels') { println('labels contain values ' + prop) } -tasks.register('check-extra-directories') { - Map permissions = project.extensions.getByName('jib')['extraDirectories']['permissions'].get() - List paths = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['from']}; - println('extraDirectories permissions: ' + permissions) - println('extraDirectories paths: ' + paths) -} +//tasks.register('check-extra-directories') { +// Map permissions = project.extensions.getByName('jib')['extraDirectories']['permissions'].get() +// List paths = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['from']}; +// println('extraDirectories permissions: ' + permissions) +// println('extraDirectories paths: ' + paths) +//} From a5f1aeef7ac71eaafda49889e23db3f85d78181a Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 17 Aug 2022 11:17:20 -0400 Subject: [PATCH 06/24] WIP: clean up updated setFrom to allow for lazy eval --- .../jib/gradle/ExtraDirectoryParameters.java | 28 ++++--------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java index a5fbbb51cf..4a4819cac9 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java @@ -67,13 +67,11 @@ public Path getFrom() { return from.get(); } - public void setFrom(Object fromObj) { - // TODO: this should also be able support provider of objects convertible by project.file() -// System.out.println("setFrom object: " + fromObj); - // TODO: if from is a Provider<>, here we need to convert it to a Provider - if (fromObj instanceof Provider) { -// System.out.println("object is a provider"); - Provider fromProvider = (Provider) fromObj; + public void setFrom(Object from) { + // This setter should be able support provider of suitable objects convertible by project.file() + // If argument is a Provider, here it is converted to a Provider + if (from instanceof Provider) { + Provider fromProvider = (Provider) from; this.from.set( fromProvider.map( new Transformer() { @@ -83,24 +81,10 @@ public Path transform(Object obj) { } })); } else { -// System.out.println("object is not a provider"); - this.from.set(project.file(fromObj).toPath()); + this.from.set(project.file(from).toPath()); } } - // public void setFrom(Provider from) { - // this.from.set( - // from.map( - // new Transformer() { - // @Override - // public Path transform(Object from) { - // return project.file(from).toPath(); - // } - // } - // ) - // ); - // } - @Override @Input public String getInto() { From 56cb69e0e3e29774987428dba2ad78ba56061c7b Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 17 Aug 2022 15:44:25 -0400 Subject: [PATCH 07/24] WIP: fix added unit test, can lazy eval using setFrom but not setPaths --- .../cloud/tools/jib/gradle/JibPluginTest.java | 21 ++++++------ .../projects/lazy-evaluation/build.gradle | 32 ++++++++++--------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java index 1e5e3eba7c..4b0f99fca8 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java @@ -368,18 +368,15 @@ public void testLazyEvalForLabels() { "labels contain values [firstkey:updated-first-label, secondKey:updated-second-label]"); } -// @Test -// public void testLazyEvalForExtraDirectories() { -// // TODO: Add task and test for lazy evaluation -// System.out.println("testLazyEvalForExtraDirectories"); -// BuildResult checkExtraDirectories = testProject.build("check-extra-directories", "-Djib.console=plain"); -// assertThat(checkExtraDirectories.getOutput()) -// .contains("extraDirectories permissions: [/txt-files/*.txt:755]"); -// assertThat(checkExtraDirectories.getOutput()) -// .contains("extraDirectories paths: [" + -// testProject.getRoot().toPath().resolve("updated-custom-extra-dir-1") + ", " + -// testProject.getRoot().toPath().resolve("updated-custom-extra-dir-2") + "]"); -// } + @Test + public void testLazyEvalForExtraDirectories() { + BuildResult checkExtraDirectories = + testProject.build("check-extra-directories", "-Djib.console=plain"); + assertThat(checkExtraDirectories.getOutput()) + .contains("[/txt-files/*.txt:755]"); + assertThat(checkExtraDirectories.getOutput()) + .contains("src/main/updated-custom-extra-dir"); + } private Project createProject(String... plugins) { Project project = diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle index 40464ab5e4..3dec235ad7 100644 --- a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle @@ -34,15 +34,17 @@ jib { ] } } -// extraDirectories { -// paths = project.provider { -// [ -// project.ext.value + '-custom-extra-dir-1', -// project.ext.value + '-custom-extra-dir-2' -// ] -// } -// permissions = project.provider { -> project.ext.getCustomPermissions() } -// } + extraDirectories { + // TODO: the following line does not lazy eval - enable in setPaths() and replace + // paths = project.provider { ['src/main/' + project.ext.value + '-custom-extra-dir'] } + // The following specification currently works: + paths { + path { + from = project.provider { 'src/main/' + project.ext.value + '-custom-extra-dir' } + } + } + permissions = project.provider { -> project.ext.getCustomPermissions() } + } } tasks.register('showlabels') { @@ -50,9 +52,9 @@ tasks.register('showlabels') { println('labels contain values ' + prop) } -//tasks.register('check-extra-directories') { -// Map permissions = project.extensions.getByName('jib')['extraDirectories']['permissions'].get() -// List paths = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['from']}; -// println('extraDirectories permissions: ' + permissions) -// println('extraDirectories paths: ' + paths) -//} +tasks.register('check-extra-directories') { + Map permissions = project.extensions.getByName('jib')['extraDirectories']['permissions'].get() + List paths = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['from']}; + println('extraDirectories permissions: ' + permissions) + println('extraDirectories paths: ' + paths) +} From b43c295102b6b236172b974b9b40be2306651ab8 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 17 Aug 2022 16:52:37 -0400 Subject: [PATCH 08/24] Add extra directories to lazy evaluation testing project --- .../lazy-evaluation/src/main/original-custom-extra-dir/original | 1 + .../lazy-evaluation/src/main/updated-custom-extra-dir/updated | 1 + 2 files changed, 2 insertions(+) create mode 100644 jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/original-custom-extra-dir/original create mode 100644 jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/updated diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/original-custom-extra-dir/original b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/original-custom-extra-dir/original new file mode 100644 index 0000000000..94f3610c08 --- /dev/null +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/original-custom-extra-dir/original @@ -0,0 +1 @@ +original \ No newline at end of file diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/updated b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/updated new file mode 100644 index 0000000000..f55556eed1 --- /dev/null +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/updated @@ -0,0 +1 @@ +updated \ No newline at end of file From 7370713f26970d545ab7d6866d43d1971573ddeb Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Thu, 18 Aug 2022 11:57:27 -0400 Subject: [PATCH 09/24] Switch setFrom to method overloading --- .../jib/gradle/ExtraDirectoryParameters.java | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java index 4a4819cac9..0cf56b047d 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java @@ -68,21 +68,19 @@ public Path getFrom() { } public void setFrom(Object from) { - // This setter should be able support provider of suitable objects convertible by project.file() - // If argument is a Provider, here it is converted to a Provider - if (from instanceof Provider) { - Provider fromProvider = (Provider) from; - this.from.set( - fromProvider.map( - new Transformer() { - @Override - public Path transform(Object obj) { - return project.file(obj).toPath(); - } - })); - } else { - this.from.set(project.file(from).toPath()); - } + this.from.set(project.file(from).toPath()); + } + + public void setFrom(Provider from) { + this.from.set( + // Convert Provider to Provider + from.map( + new Transformer() { + @Override + public Path transform(Object obj) { + return project.file(obj).toPath(); + } + })); } @Override From 13600116fd09695eac3ea158c4f7ad0c8d915c60 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Thu, 18 Aug 2022 12:27:06 -0400 Subject: [PATCH 10/24] Update setPaths to allow for lazy eval --- .../gradle/ExtraDirectoriesParameters.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java index f8db042de2..22b85d41be 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java @@ -27,9 +27,11 @@ import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.Project; +import org.gradle.api.Transformer; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.MapProperty; +import org.gradle.api.provider.Provider; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; @@ -94,13 +96,32 @@ public List getPaths() { * @param paths paths to set. */ public void setPaths(Object paths) { -// System.out.println("setPaths paths: " + paths); this.paths.set( project.files(paths).getFiles().stream() .map(file -> new ExtraDirectoryParameters(objects, project, file.toPath(), "/")) .collect(Collectors.toList())); } + /** + * Sets paths, for lazy evaluation where {@code paths} is a {@link Provider} of a suitable object. + * + * @param paths provider of paths to set + * @see #setPaths(Object) + */ + public void setPaths(Provider paths) { + // Convert Provider to Provider> + this.paths.set( + paths.map( + new Transformer, Object>() { + @Override + public List transform(Object obj) { + return project.files(paths).getFiles().stream() + .map(file -> new ExtraDirectoryParameters(objects, project, file.toPath(), "/")) + .collect(Collectors.toList()); + } + })); + } + /** * Gets the permissions for files in the extra layer on the container. Maps from absolute path on * the container to a 3-digit octal string representation of the file permission bits (e.g. {@code @@ -112,7 +133,8 @@ public void setPaths(Object paths) { public MapProperty getPermissions() { String property = System.getProperty(PropertyNames.EXTRA_DIRECTORIES_PERMISSIONS); if (property != null) { - Map parsedPermissions = ConfigurationPropertyValidator.parseMapProperty(property); + Map parsedPermissions = + ConfigurationPropertyValidator.parseMapProperty(property); if (!parsedPermissions.equals(permissions.get())) { permissions.set(parsedPermissions); } From 1819eb3e790f11fdb588b5f7d3440953262115e4 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Thu, 18 Aug 2022 14:51:56 -0400 Subject: [PATCH 11/24] Update unit tests to check for both specification options --- .../cloud/tools/jib/gradle/JibPluginTest.java | 16 ++++++- .../lazy-evaluation/build-extra-dirs.gradle | 47 +++++++++++++++++++ .../projects/lazy-evaluation/build.gradle | 15 ++---- .../main/original-custom-extra-dir/original | 1 - 4 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build-extra-dirs.gradle delete mode 100644 jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/original-custom-extra-dir/original diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java index 4b0f99fca8..075948a514 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java @@ -373,11 +373,25 @@ public void testLazyEvalForExtraDirectories() { BuildResult checkExtraDirectories = testProject.build("check-extra-directories", "-Djib.console=plain"); assertThat(checkExtraDirectories.getOutput()) - .contains("[/txt-files/*.txt:755]"); + .contains("[/updated:755]"); assertThat(checkExtraDirectories.getOutput()) .contains("src/main/updated-custom-extra-dir"); } + @Test + public void testLazyEvalForExtraDirectories_IndividualPaths() { + BuildResult checkExtraDirectories = + testProject.build("check-extra-directories", "-b=build-extra-dirs.gradle", "-Djib.console=plain"); + assertThat(checkExtraDirectories.getOutput()) + .contains("src/main/updated-custom-extra-dir"); + assertThat(checkExtraDirectories.getOutput()) + .contains("extraDirectories (into): [/updated-custom-into-dir]"); + assertThat(checkExtraDirectories.getOutput()) + .contains("extraDirectories (includes): [[include.txt]]"); + assertThat(checkExtraDirectories.getOutput()) + .contains("extraDirectories (excludes): [[exclude.txt]]"); + } + private Project createProject(String... plugins) { Project project = ProjectBuilder.builder().withProjectDir(testProjectRoot.getRoot()).withName("root").build(); diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build-extra-dirs.gradle b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build-extra-dirs.gradle new file mode 100644 index 0000000000..628eb328d4 --- /dev/null +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build-extra-dirs.gradle @@ -0,0 +1,47 @@ +plugins { + id 'java' + id 'com.google.cloud.tools.jib' +} + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.guava:guava:23.6-jre' +} + +project.ext.value = 'original' + +project.afterEvaluate { + project.ext.value = 'updated' + project.ext.getCustomIncludes = { -> return ['include.txt'] } + project.ext.getCustomExcludes = { -> return ['exclude.txt'] } +} + +jib { + extraDirectories { + paths { + path { + from = project.provider { 'src/main/' + project.ext.value + '-custom-extra-dir' } + into = project.provider { '/' + project.ext.value + '-custom-into-dir' } + includes = project.provider { -> project.ext.getCustomIncludes() } + excludes = project.provider { -> project.ext.getCustomExcludes() } + } + } + } +} + +tasks.register('check-extra-directories') { + List from = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['from']} + List into = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['into']} + List includes = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['includes'].get()} + List excludes = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['excludes'].get()} + println('extraDirectories (from): ' + from) + println('extraDirectories (into): ' + into) + println('extraDirectories (includes): ' + includes) + println('extraDirectories (excludes): ' + excludes) +} diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle index 3dec235ad7..ed358e4008 100644 --- a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/build.gradle @@ -18,7 +18,7 @@ project.ext.value = 'original' project.afterEvaluate { project.ext.value = 'updated' - project.ext.getCustomPermissions = { -> return ['/txt-files/*.txt': '755'] } + project.ext.getCustomPermissions = { -> return ['/updated': '755'] } } jib { @@ -35,14 +35,7 @@ jib { } } extraDirectories { - // TODO: the following line does not lazy eval - enable in setPaths() and replace - // paths = project.provider { ['src/main/' + project.ext.value + '-custom-extra-dir'] } - // The following specification currently works: - paths { - path { - from = project.provider { 'src/main/' + project.ext.value + '-custom-extra-dir' } - } - } + paths = project.provider { ['src/main/' + project.ext.value + '-custom-extra-dir'] } permissions = project.provider { -> project.ext.getCustomPermissions() } } } @@ -53,8 +46,8 @@ tasks.register('showlabels') { } tasks.register('check-extra-directories') { + List paths = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['from']} Map permissions = project.extensions.getByName('jib')['extraDirectories']['permissions'].get() - List paths = project.extensions.getByName('jib')['extraDirectories']['paths'].collect{ path -> path['from']}; - println('extraDirectories permissions: ' + permissions) println('extraDirectories paths: ' + paths) + println('extraDirectories permissions: ' + permissions) } diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/original-custom-extra-dir/original b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/original-custom-extra-dir/original deleted file mode 100644 index 94f3610c08..0000000000 --- a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/original-custom-extra-dir/original +++ /dev/null @@ -1 +0,0 @@ -original \ No newline at end of file From b2815b7064256e6132f18bd49f621ef110cf90aa Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Fri, 19 Aug 2022 15:24:38 -0400 Subject: [PATCH 12/24] Remove setPermissions test --- .../com/google/cloud/tools/jib/gradle/JibExtensionTest.java | 4 ---- 1 file changed, 4 deletions(-) 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 e4c63d10d1..42caf4936e 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 @@ -249,15 +249,11 @@ public void testExtraDirectories() { testJibExtension.extraDirectories( extraDirectories -> { extraDirectories.setPaths("test/path"); -// extraDirectories.setPermissions(ImmutableMap.of("file1", "123", "file2", "456")); }); assertThat(testJibExtension.getExtraDirectories().getPaths()).hasSize(1); assertThat(testJibExtension.getExtraDirectories().getPaths().get(0).getFrom()) .isEqualTo(fakeProject.getProjectDir().toPath().resolve("test/path")); -// assertThat(testJibExtension.getExtraDirectories().getPermissions().get()) -// .containsExactly("file1", "123", "file2", "456") -// .inOrder(); } @Test From 798882dedd3880a9295973082b2c7fcc761c7e1a Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Fri, 19 Aug 2022 15:34:49 -0400 Subject: [PATCH 13/24] Fix file formatting --- .../jib/gradle/GradleRawConfiguration.java | 3 ++- .../cloud/tools/jib/gradle/JibPluginTest.java | 18 ++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) 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 fe55973dae..186ed0f020 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 @@ -174,7 +174,8 @@ public List getExtraDirectories() { @Override public Map getExtraDirectoryPermissions() { - return TaskCommon.convertPermissionsMap(jibExtension.getExtraDirectories().getPermissions().get()); + return TaskCommon.convertPermissionsMap( + jibExtension.getExtraDirectories().getPermissions().get()); } @Override diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java index 075948a514..45be5e7604 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java @@ -372,24 +372,22 @@ public void testLazyEvalForLabels() { public void testLazyEvalForExtraDirectories() { BuildResult checkExtraDirectories = testProject.build("check-extra-directories", "-Djib.console=plain"); - assertThat(checkExtraDirectories.getOutput()) - .contains("[/updated:755]"); - assertThat(checkExtraDirectories.getOutput()) - .contains("src/main/updated-custom-extra-dir"); + assertThat(checkExtraDirectories.getOutput()).contains("[/updated:755]"); + assertThat(checkExtraDirectories.getOutput()).contains("src/main/updated-custom-extra-dir"); } @Test public void testLazyEvalForExtraDirectories_IndividualPaths() { BuildResult checkExtraDirectories = - testProject.build("check-extra-directories", "-b=build-extra-dirs.gradle", "-Djib.console=plain"); - assertThat(checkExtraDirectories.getOutput()) - .contains("src/main/updated-custom-extra-dir"); + testProject.build( + "check-extra-directories", "-b=build-extra-dirs.gradle", "-Djib.console=plain"); + assertThat(checkExtraDirectories.getOutput()).contains("src/main/updated-custom-extra-dir"); assertThat(checkExtraDirectories.getOutput()) - .contains("extraDirectories (into): [/updated-custom-into-dir]"); + .contains("extraDirectories (into): [/updated-custom-into-dir]"); assertThat(checkExtraDirectories.getOutput()) - .contains("extraDirectories (includes): [[include.txt]]"); + .contains("extraDirectories (includes): [[include.txt]]"); assertThat(checkExtraDirectories.getOutput()) - .contains("extraDirectories (excludes): [[exclude.txt]]"); + .contains("extraDirectories (excludes): [[exclude.txt]]"); } private Project createProject(String... plugins) { From b79d5ec3afa97c3079f862777316f51a6f375cf6 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Mon, 22 Aug 2022 12:44:25 -0400 Subject: [PATCH 14/24] Switch from anonymous inner classes to lambdas --- .../tools/jib/gradle/ExtraDirectoriesParameters.java | 11 +++-------- .../tools/jib/gradle/ExtraDirectoryParameters.java | 12 ++---------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java index 22b85d41be..4bd95cef5f 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java @@ -27,7 +27,6 @@ import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.Project; -import org.gradle.api.Transformer; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.MapProperty; @@ -112,14 +111,10 @@ public void setPaths(Provider paths) { // Convert Provider to Provider> this.paths.set( paths.map( - new Transformer, Object>() { - @Override - public List transform(Object obj) { - return project.files(paths).getFiles().stream() + obj -> + project.files(paths).getFiles().stream() .map(file -> new ExtraDirectoryParameters(objects, project, file.toPath(), "/")) - .collect(Collectors.toList()); - } - })); + .collect(Collectors.toList()))); } /** diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java index 0cf56b047d..8914b02efe 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java @@ -22,7 +22,6 @@ import java.util.List; import javax.inject.Inject; import org.gradle.api.Project; -import org.gradle.api.Transformer; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; @@ -72,15 +71,8 @@ public void setFrom(Object from) { } public void setFrom(Provider from) { - this.from.set( - // Convert Provider to Provider - from.map( - new Transformer() { - @Override - public Path transform(Object obj) { - return project.file(obj).toPath(); - } - })); + // Convert Provider to Provider + this.from.set(from.map(obj -> project.file(obj).toPath())); } @Override From 925d5c31bd06cf18579242398509b7b1895fa7da Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Mon, 22 Aug 2022 16:36:24 -0400 Subject: [PATCH 15/24] Fix test compatibility with windows --- .../java/com/google/cloud/tools/jib/gradle/JibPluginTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java index 45be5e7604..b5c12657e9 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java @@ -373,7 +373,7 @@ public void testLazyEvalForExtraDirectories() { BuildResult checkExtraDirectories = testProject.build("check-extra-directories", "-Djib.console=plain"); assertThat(checkExtraDirectories.getOutput()).contains("[/updated:755]"); - assertThat(checkExtraDirectories.getOutput()).contains("src/main/updated-custom-extra-dir"); + assertThat(checkExtraDirectories.getOutput()).contains("updated-custom-extra-dir"); } @Test @@ -381,7 +381,7 @@ public void testLazyEvalForExtraDirectories_IndividualPaths() { BuildResult checkExtraDirectories = testProject.build( "check-extra-directories", "-b=build-extra-dirs.gradle", "-Djib.console=plain"); - assertThat(checkExtraDirectories.getOutput()).contains("src/main/updated-custom-extra-dir"); + assertThat(checkExtraDirectories.getOutput()).contains("updated-custom-extra-dir"); assertThat(checkExtraDirectories.getOutput()) .contains("extraDirectories (into): [/updated-custom-into-dir]"); assertThat(checkExtraDirectories.getOutput()) From af4bb2c4039817da1d825c42aa31e24222c110b9 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Tue, 23 Aug 2022 16:02:03 -0400 Subject: [PATCH 16/24] Coverage: add tests for extraDirectories in JibExtensionTest --- .../tools/jib/gradle/JibExtensionTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) 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 42caf4936e..e80d3fdb35 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 @@ -33,6 +33,8 @@ import java.util.List; import java.util.Properties; import org.gradle.api.Project; +import org.gradle.api.provider.Provider; +import org.gradle.api.provider.ProviderFactory; import org.gradle.testfixtures.ProjectBuilder; import org.junit.Before; import org.junit.Rule; @@ -256,6 +258,29 @@ public void testExtraDirectories() { .isEqualTo(fakeProject.getProjectDir().toPath().resolve("test/path")); } + @Test + public void testExtraDirectories_lazySetFromInto() { + testJibExtension.extraDirectories( + extraDirectories -> + extraDirectories.paths( + paths -> { + ProviderFactory providerFactory = fakeProject.getProviders(); + Provider from = providerFactory.provider(() -> "test/path"); + Provider into = providerFactory.provider(() -> "/target"); + paths.path( + path -> { + path.setFrom(from); + path.setInto(into); + }); + })); + + assertThat(testJibExtension.getExtraDirectories().getPaths()).hasSize(1); + assertThat(testJibExtension.getExtraDirectories().getPaths().get(0).getFrom()) + .isEqualTo(fakeProject.getProjectDir().toPath().resolve("test/path")); + assertThat(testJibExtension.getExtraDirectories().getPaths().get(0).getInto()) + .isEqualTo("/target"); + } + @Test public void testExtraDirectories_withTarget() { testJibExtension.extraDirectories( @@ -305,6 +330,23 @@ public void testExtraDirectories_stringListForPaths() { .isEqualTo(fakeProject.getProjectDir().toPath().resolve("another/path")); } + @Test + public void testExtraDirectories_lazyStringListForPaths() { + testJibExtension.extraDirectories( + extraDirectories -> { + ProviderFactory providerFactory = fakeProject.getProviders(); + Provider paths = + providerFactory.provider(() -> Arrays.asList("test/path", "another/path")); + extraDirectories.setPaths(paths); + }); + + assertThat(testJibExtension.getExtraDirectories().getPaths()).hasSize(2); + assertThat(testJibExtension.getExtraDirectories().getPaths().get(0).getFrom()) + .isEqualTo(fakeProject.getProjectDir().toPath().resolve("test/path")); + assertThat(testJibExtension.getExtraDirectories().getPaths().get(1).getFrom()) + .isEqualTo(fakeProject.getProjectDir().toPath().resolve("another/path")); + } + @Test public void testExtraDirectories_fileListForPaths() { testJibExtension.extraDirectories( From 4d986fa2b17d54aea9bd68d0ceeaf06f3e00dc87 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 24 Aug 2022 10:22:53 -0400 Subject: [PATCH 17/24] Rename test file for committing test extra directory --- .../lazy-evaluation/src/main/updated-custom-extra-dir/unused | 1 + .../lazy-evaluation/src/main/updated-custom-extra-dir/updated | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/unused delete mode 100644 jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/updated diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/unused b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/unused new file mode 100644 index 0000000000..af79d2d849 --- /dev/null +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/unused @@ -0,0 +1 @@ +unused \ No newline at end of file diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/updated b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/updated deleted file mode 100644 index f55556eed1..0000000000 --- a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/updated +++ /dev/null @@ -1 +0,0 @@ -updated \ No newline at end of file From bd9183d98ee44ff21ab86bf6620c6906bc976f64 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 24 Aug 2022 11:05:48 -0400 Subject: [PATCH 18/24] Update changelog and readme --- jib-gradle-plugin/CHANGELOG.md | 1 + jib-gradle-plugin/README.md | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/jib-gradle-plugin/CHANGELOG.md b/jib-gradle-plugin/CHANGELOG.md index 262de8e832..8140b5d90a 100644 --- a/jib-gradle-plugin/CHANGELOG.md +++ b/jib-gradle-plugin/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ### Added - Included `imagePushed` field to image metadata json output file which provides information on whether an image was pushed by Jib. Note that the output file is `build/jib-image.json` by default or configurable with `jib.outputPaths.imageJson`. ([#3641](https://github.com/GoogleContainerTools/jib/pull/3641)) +- Added lazy evaluation for `jib.extraDirectories` parameters using Gradle Property and Provider. ([#3737](https://github.com/GoogleContainerTools/jib/issues/3737)) ### Changed diff --git a/jib-gradle-plugin/README.md b/jib-gradle-plugin/README.md index 5d94e2ec1b..32c6de2f8d 100644 --- a/jib-gradle-plugin/README.md +++ b/jib-gradle-plugin/README.md @@ -459,6 +459,28 @@ Using `paths` as a closure, you may also specify the target of the copy and incl } ``` +You can also configure `paths` and `permissions` through [lazy configuration in Gradle](https://docs.gradle.org/current/userguide/lazy_configuration.html), using providers in `build.gradle`: + +```groovy +extraDirectories { + paths = project.provider { 'src/main/custom-extra-dir' } + permissions = project.provider { ['/path/on/container/to/fileA': '755'] } +} +``` + +```groovy +extraDirectories { + paths { + path { + from = project.provider { 'src/main/custom-extra-dir' } + into = project.provider { '/dest-in-container' } + includes = project.provider { ['*.txt', '**/*.txt'] } + excludes = project.provider { ['hidden.txt'] } + } + } +} +``` + ### Authentication Methods Pushing/pulling from private registries require authorization credentials. From 11d9dd170a0c2537114511c2c6c6db4d1c7c2541 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 24 Aug 2022 14:02:01 -0400 Subject: [PATCH 19/24] Move object to parameters logic into helper method --- .../gradle/ExtraDirectoriesParameters.java | 22 +++++++++---------- .../jib/gradle/ExtraDirectoryParameters.java | 1 - 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java index 4bd95cef5f..b9c221251b 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import javax.annotation.Nonnull; import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.Project; @@ -95,10 +96,7 @@ public List getPaths() { * @param paths paths to set. */ public void setPaths(Object paths) { - this.paths.set( - project.files(paths).getFiles().stream() - .map(file -> new ExtraDirectoryParameters(objects, project, file.toPath(), "/")) - .collect(Collectors.toList())); + this.paths.set(transformObjectToParametersList(paths)); } /** @@ -108,13 +106,15 @@ public void setPaths(Object paths) { * @see #setPaths(Object) */ public void setPaths(Provider paths) { - // Convert Provider to Provider> - this.paths.set( - paths.map( - obj -> - project.files(paths).getFiles().stream() - .map(file -> new ExtraDirectoryParameters(objects, project, file.toPath(), "/")) - .collect(Collectors.toList()))); + this.paths.set(paths.map(this::transformObjectToParametersList)); + } + + /** Helper method to convert Object to List in {@code setFrom} */ + @Nonnull + private List transformObjectToParametersList(Object obj) { + return project.files(obj).getFiles().stream() + .map(file -> new ExtraDirectoryParameters(objects, project, file.toPath(), "/")) + .collect(Collectors.toList()); } /** diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java index 8914b02efe..537b51f085 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java @@ -71,7 +71,6 @@ public void setFrom(Object from) { } public void setFrom(Provider from) { - // Convert Provider to Provider this.from.set(from.map(obj -> project.file(obj).toPath())); } From c7e131e68d551d8a5fffeccf1805c4b64fe052ea Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 24 Aug 2022 14:37:00 -0400 Subject: [PATCH 20/24] Fix javadoc checkstyle violations --- .../cloud/tools/jib/gradle/ExtraDirectoriesParameters.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java index b9c221251b..7dee22290f 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java @@ -109,7 +109,10 @@ public void setPaths(Provider paths) { this.paths.set(paths.map(this::transformObjectToParametersList)); } - /** Helper method to convert Object to List in {@code setFrom} */ + /** + * Helper method to convert {@code Object} to {@code List} in {@code + * setFrom}. + */ @Nonnull private List transformObjectToParametersList(Object obj) { return project.files(obj).getFiles().stream() From f380733e7e8032f7ff9a23b30f7cafaed381eb4f Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 24 Aug 2022 17:01:11 -0400 Subject: [PATCH 21/24] Rename added tests Co-authored-by: Mridula <66699525+mpeddada1@users.noreply.github.com> --- .../com/google/cloud/tools/jib/gradle/JibExtensionTest.java | 4 ++-- .../java/com/google/cloud/tools/jib/gradle/JibPluginTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 e80d3fdb35..bd15b9e0c4 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 @@ -259,7 +259,7 @@ public void testExtraDirectories() { } @Test - public void testExtraDirectories_lazySetFromInto() { + public void testExtraDirectories_lazyEvaluation_setFromInto() { testJibExtension.extraDirectories( extraDirectories -> extraDirectories.paths( @@ -331,7 +331,7 @@ public void testExtraDirectories_stringListForPaths() { } @Test - public void testExtraDirectories_lazyStringListForPaths() { + public void testExtraDirectories_lazyEvaluation_StringListForPaths() { testJibExtension.extraDirectories( extraDirectories -> { ProviderFactory providerFactory = fakeProject.getProviders(); diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java index b5c12657e9..41ba41e795 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java @@ -377,7 +377,7 @@ public void testLazyEvalForExtraDirectories() { } @Test - public void testLazyEvalForExtraDirectories_IndividualPaths() { + public void testLazyEvalForExtraDirectories_individualPaths() { BuildResult checkExtraDirectories = testProject.build( "check-extra-directories", "-b=build-extra-dirs.gradle", "-Djib.console=plain"); From 96197cfd846f16fdb49aacb6926a37e1934526e7 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Wed, 24 Aug 2022 17:03:12 -0400 Subject: [PATCH 22/24] Rename helper method --- .../cloud/tools/jib/gradle/ExtraDirectoriesParameters.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java index 7dee22290f..30dc526e89 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java @@ -96,7 +96,7 @@ public List getPaths() { * @param paths paths to set. */ public void setPaths(Object paths) { - this.paths.set(transformObjectToParametersList(paths)); + this.paths.set(convertToExtraDirectoryParametersList(paths)); } /** @@ -106,7 +106,7 @@ public void setPaths(Object paths) { * @see #setPaths(Object) */ public void setPaths(Provider paths) { - this.paths.set(paths.map(this::transformObjectToParametersList)); + this.paths.set(paths.map(this::convertToExtraDirectoryParametersList)); } /** @@ -114,7 +114,7 @@ public void setPaths(Provider paths) { * setFrom}. */ @Nonnull - private List transformObjectToParametersList(Object obj) { + private List convertToExtraDirectoryParametersList(Object obj) { return project.files(obj).getFiles().stream() .map(file -> new ExtraDirectoryParameters(objects, project, file.toPath(), "/")) .collect(Collectors.toList()); From 25e47a5feff883f056ab97edad8d87aa1a3d2d42 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Thu, 25 Aug 2022 13:04:25 -0400 Subject: [PATCH 23/24] Updated test to use stricter assert statement for path.from --- .../cloud/tools/jib/gradle/JibPluginTest.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java index 41ba41e795..7ba5ed904c 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/JibPluginTest.java @@ -377,11 +377,20 @@ public void testLazyEvalForExtraDirectories() { } @Test - public void testLazyEvalForExtraDirectories_individualPaths() { + public void testLazyEvalForExtraDirectories_individualPaths() throws IOException { BuildResult checkExtraDirectories = testProject.build( "check-extra-directories", "-b=build-extra-dirs.gradle", "-Djib.console=plain"); - assertThat(checkExtraDirectories.getOutput()).contains("updated-custom-extra-dir"); + + Path extraDirectoryPath = + testProject + .getProjectRoot() + .resolve("src") + .resolve("main") + .resolve("updated-custom-extra-dir") + .toRealPath(); + assertThat(checkExtraDirectories.getOutput()) + .contains("extraDirectories (from): [" + extraDirectoryPath + "]"); assertThat(checkExtraDirectories.getOutput()) .contains("extraDirectories (into): [/updated-custom-into-dir]"); assertThat(checkExtraDirectories.getOutput()) From 6f0a3b7dc9615130ad792b2bbd3106b4dd2f7949 Mon Sep 17 00:00:00 2001 From: Emily Wang Date: Thu, 25 Aug 2022 13:13:43 -0400 Subject: [PATCH 24/24] Update test file with more informative content --- .../lazy-evaluation/src/main/updated-custom-extra-dir/foo | 1 + .../lazy-evaluation/src/main/updated-custom-extra-dir/unused | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/foo delete mode 100644 jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/unused diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/foo b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/foo new file mode 100644 index 0000000000..54315cd5f5 --- /dev/null +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/foo @@ -0,0 +1 @@ +Unused file for committing parent directory so that it exists for extraDirectories tests \ No newline at end of file diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/unused b/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/unused deleted file mode 100644 index af79d2d849..0000000000 --- a/jib-gradle-plugin/src/test/resources/gradle/projects/lazy-evaluation/src/main/updated-custom-extra-dir/unused +++ /dev/null @@ -1 +0,0 @@ -unused \ No newline at end of file