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 a3e65bae3b..f364555f91 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,6 +27,7 @@ import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.Project; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ListProperty; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; @@ -34,6 +35,7 @@ /** Object in {@link JibExtension} that configures the extra directories. */ public class ExtraDirectoriesParameters { + private final ObjectFactory objects; private final Project project; private ListProperty paths; @@ -41,10 +43,11 @@ public class ExtraDirectoriesParameters { private Map permissions = Collections.emptyMap(); @Inject - public ExtraDirectoriesParameters(Project project) { + public ExtraDirectoriesParameters(ObjectFactory objects, Project project) { + this.objects = objects; this.project = project; - paths = project.getObjects().listProperty(ExtraDirectoryParameters.class).empty(); - spec = project.getObjects().newInstance(ExtraDirectoryParametersSpec.class, project, paths); + paths = objects.listProperty(ExtraDirectoryParameters.class).empty(); + spec = objects.newInstance(ExtraDirectoryParametersSpec.class, project, paths); } public void paths(Action action) { @@ -70,12 +73,13 @@ public List getPaths() { List pathStrings = ConfigurationPropertyValidator.parseListProperty(property); return pathStrings .stream() - .map(path -> new ExtraDirectoryParameters(project, Paths.get(path), "/")) + .map(path -> new ExtraDirectoryParameters(objects, project, Paths.get(path), "/")) .collect(Collectors.toList()); } if (paths.get().isEmpty()) { return Collections.singletonList( new ExtraDirectoryParameters( + objects, project, project.getProjectDir().toPath().resolve("src").resolve("main").resolve("jib"), "/")); @@ -95,7 +99,7 @@ public void setPaths(Object paths) { .files(paths) .getFiles() .stream() - .map(file -> new ExtraDirectoryParameters(project, file.toPath(), "/")) + .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 5e1ed1e544..008fd53b85 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 @@ -16,27 +16,35 @@ package com.google.cloud.tools.jib.gradle; +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtraDirectoriesConfiguration; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import javax.inject.Inject; import org.gradle.api.Project; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.ListProperty; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; /** Configuration of an extra directory. */ -public class ExtraDirectoryParameters { +public class ExtraDirectoryParameters implements ExtraDirectoriesConfiguration { private Project project; private Path from = Paths.get(""); private String into = "/"; + private ListProperty includes; + private ListProperty excludes; @Inject - public ExtraDirectoryParameters(Project project) { + public ExtraDirectoryParameters(ObjectFactory objects, Project project) { this.project = project; + includes = objects.listProperty(String.class).empty(); + excludes = objects.listProperty(String.class).empty(); } - public ExtraDirectoryParameters(Project project, Path from, String into) { - this.project = project; + ExtraDirectoryParameters(ObjectFactory objects, Project project, Path from, String into) { + this(objects, project); this.from = from; this.into = into; } @@ -48,6 +56,7 @@ public String getFromString() { return from.toString(); } + @Override @Internal public Path getFrom() { return from; @@ -57,6 +66,7 @@ public void setFrom(Object from) { this.from = project.file(from).toPath(); } + @Override @Input public String getInto() { return into; @@ -65,4 +75,26 @@ public String getInto() { public void setInto(String into) { this.into = into; } + + @Input + public ListProperty getIncludes() { + return includes; + } + + @Input + public ListProperty getExcludes() { + return excludes; + } + + @Override + @Internal + public List getIncludesList() { + return includes.get(); + } + + @Override + @Internal + public List getExcludesList() { + return excludes.get(); + } } 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 078df3d76c..50f21c36fb 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 @@ -16,14 +16,12 @@ package com.google.cloud.tools.jib.gradle; -import com.google.cloud.tools.jib.api.buildplan.AbsoluteUnixPath; import com.google.cloud.tools.jib.api.buildplan.FilePermissions; import com.google.cloud.tools.jib.api.buildplan.ImageFormat; import com.google.cloud.tools.jib.plugins.common.AuthProperty; import com.google.cloud.tools.jib.plugins.common.RawConfiguration; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -164,16 +162,14 @@ public String getCreationTime() { } @Override - public Map getExtraDirectories() { - Map directoryMap = new LinkedHashMap<>(); + public List getExtraDirectories() { for (ExtraDirectoryParameters path : jibExtension.getExtraDirectories().getPaths()) { if (path.getFrom().equals(Paths.get(""))) { throw new IllegalArgumentException( "Incomplete extraDirectories.paths configuration; source directory must be set"); } - directoryMap.put(path.getFrom(), AbsoluteUnixPath.get(path.getInto())); } - return directoryMap; + return jibExtension.getExtraDirectories().getPaths(); } @Override 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 10c0820e1d..80ae4eb4bf 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 @@ -21,6 +21,7 @@ import com.google.cloud.tools.jib.plugins.common.ConfigurationPropertyValidator; import com.google.cloud.tools.jib.plugins.common.PropertyNames; import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtensionConfiguration; +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtraDirectoriesConfiguration; import com.google.cloud.tools.jib.plugins.common.RawConfiguration.PlatformConfiguration; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; @@ -132,6 +133,7 @@ Optional getMode() { /** Configuration for {@code platform} parameter. */ public static class PlatformParameters implements PlatformConfiguration { + @Nullable @Parameter private String os; @Nullable @Parameter private String architecture; @@ -150,11 +152,8 @@ public Optional getArchitectureName() { public static class FromConfiguration { @Nullable @Parameter private String image; - @Nullable @Parameter private String credHelper; - @Parameter private FromAuthConfiguration auth = new FromAuthConfiguration(); - @Parameter private List platforms; /** Constructor for defaults. */ @@ -170,11 +169,8 @@ public FromConfiguration() { public static class ToConfiguration { @Nullable @Parameter private String image; - @Parameter private List tags = Collections.emptyList(); - @Nullable @Parameter private String credHelper; - @Parameter private ToAuthConfiguration auth = new ToAuthConfiguration(); public void set(String image) { @@ -188,35 +184,20 @@ public static class ContainerParameters { // Note: `entrypoint` and `args` are @Nullable to handle inheriting values from the base image @Nullable @Parameter private List entrypoint; - @Parameter private List jvmFlags = Collections.emptyList(); - @Parameter private Map environment = Collections.emptyMap(); - @Parameter private List extraClasspath = Collections.emptyList(); - private boolean expandClasspathDependencies; - @Nullable @Parameter private String mainClass; - @Nullable @Parameter private List args; - @Parameter private String format = "Docker"; - @Parameter private List ports = Collections.emptyList(); - @Parameter private List volumes = Collections.emptyList(); - @Parameter private Map labels = Collections.emptyMap(); - @Parameter private String appRoot = ""; - @Nullable @Parameter private String user; - @Nullable @Parameter private String workingDirectory; - @Parameter private String filesModificationTime = "EPOCH_PLUS_SECOND"; - @Parameter private String creationTime = "EPOCH"; } @@ -224,7 +205,6 @@ public static class ContainerParameters { public static class ExtraDirectoriesParameters { @Parameter private List paths = Collections.emptyList(); - @Parameter private List permissions = Collections.emptyList(); public List getPaths() { @@ -233,11 +213,12 @@ public List getPaths() { } /** A bean that configures the source and destination of an extra directory. */ - public static class ExtraDirectoryParameters { + public static class ExtraDirectoryParameters implements ExtraDirectoriesConfiguration { @Parameter private File from = new File(""); - @Parameter private String into = "/"; + @Parameter private List includes = Collections.emptyList(); + @Parameter private List excludes = Collections.emptyList(); // Need default constructor for Maven public ExtraDirectoryParameters() {} @@ -254,6 +235,7 @@ public void set(File path) { into = "/"; } + @Override public Path getFrom() { return from.toPath(); } @@ -262,36 +244,41 @@ public void setFrom(File from) { this.from = from; } - String getInto() { + @Override + public String getInto() { return into; } + + @Override + public List getIncludesList() { + return includes; + } + + @Override + public List getExcludesList() { + return excludes; + } } /** Configuration for the {@code dockerClient} parameter. */ public static class DockerClientParameters { @Nullable @Parameter private File executable; - @Parameter private Map environment = Collections.emptyMap(); } public static class OutputPathsParameters { @Nullable @Parameter private File tar; - @Nullable @Parameter private File digest; - @Nullable @Parameter private File imageId; - @Nullable @Parameter private File imageJson; } public static class ExtensionParameters implements ExtensionConfiguration { @Parameter private String implementation = ""; - @Parameter private Map properties = Collections.emptyMap(); - @Nullable @Parameter private Object configuration; @Override @@ -322,17 +309,14 @@ public Optional getExtraConfiguration() { @Parameter(defaultValue = "${plugin}", readonly = true) protected PluginDescriptor descriptor; - @Parameter private FromConfiguration from = new FromConfiguration(); + @Component protected SettingsDecrypter settingsDecrypter; + @Parameter private FromConfiguration from = new FromConfiguration(); @Parameter private ToConfiguration to = new ToConfiguration(); - @Parameter private ContainerParameters container = new ContainerParameters(); - // this parameter is cloned in FilesMojo @Parameter private ExtraDirectoriesParameters extraDirectories = new ExtraDirectoriesParameters(); - @Parameter private DockerClientParameters dockerClient = new DockerClientParameters(); - @Parameter private OutputPathsParameters outputPaths = new OutputPathsParameters(); @Parameter(property = PropertyNames.ALLOW_INSECURE_REGISTRIES) @@ -345,9 +329,6 @@ public Optional getExtraConfiguration() { private boolean skip; @Parameter private List pluginExtensions = Collections.emptyList(); - - @Component protected SettingsDecrypter settingsDecrypter; - @Inject private Set> injectedPluginExtensions = Collections.emptySet(); protected Set> getInjectedPluginExtensions() { 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 b7f0234801..276b638d34 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 @@ -16,14 +16,11 @@ package com.google.cloud.tools.jib.maven; -import com.google.cloud.tools.jib.api.buildplan.AbsoluteUnixPath; import com.google.cloud.tools.jib.api.buildplan.FilePermissions; import com.google.cloud.tools.jib.api.buildplan.ImageFormat; -import com.google.cloud.tools.jib.maven.JibPluginConfiguration.ExtraDirectoryParameters; import com.google.cloud.tools.jib.plugins.common.AuthProperty; import com.google.cloud.tools.jib.plugins.common.RawConfiguration; import java.nio.file.Path; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -169,13 +166,8 @@ public String getCreationTime() { } @Override - public Map getExtraDirectories() { - Map directoryMap = new LinkedHashMap<>(); - for (ExtraDirectoryParameters extraDirectory : - MojoCommon.getExtraDirectories(jibPluginConfiguration)) { - directoryMap.put(extraDirectory.getFrom(), AbsoluteUnixPath.get(extraDirectory.getInto())); - } - return directoryMap; + public List getExtraDirectories() { + return MojoCommon.getExtraDirectories(jibPluginConfiguration); } @Override 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 8eeabc08e9..32de9ec728 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 @@ -37,6 +37,7 @@ import com.google.cloud.tools.jib.api.buildplan.Platform; import com.google.cloud.tools.jib.frontend.CredentialRetrieverFactory; import com.google.cloud.tools.jib.global.JibSystemProperties; +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtraDirectoriesConfiguration; import com.google.cloud.tools.jib.plugins.common.RawConfiguration.PlatformConfiguration; import com.google.cloud.tools.jib.plugins.common.globalconfig.GlobalConfig; import com.google.cloud.tools.jib.plugins.extension.JibPluginExtensionException; @@ -58,7 +59,6 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -429,15 +429,13 @@ static JibContainerBuilder processCommonConfiguration( getCreationTime(rawConfiguration.getCreationTime(), projectProperties)); // Adds all the extra files. - for (Map.Entry entry : - rawConfiguration.getExtraDirectories().entrySet()) { - Path sourceDirectory = entry.getKey(); - AbsoluteUnixPath targetDirectory = entry.getValue(); - if (Files.exists(sourceDirectory)) { + for (ExtraDirectoriesConfiguration extraDirectory : rawConfiguration.getExtraDirectories()) { + Path from = extraDirectory.getFrom(); + if (Files.exists(from)) { jibContainerBuilder.addFileEntriesLayer( JavaContainerBuilderHelper.extraDirectoryLayerConfiguration( - sourceDirectory, - targetDirectory, + from, + AbsoluteUnixPath.get(extraDirectory.getInto()), rawConfiguration.getExtraDirectoryPermissions(), modificationTimeProvider)); } 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 de5015a003..b3ea91cefd 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 @@ -16,7 +16,6 @@ package com.google.cloud.tools.jib.plugins.common; -import com.google.cloud.tools.jib.api.buildplan.AbsoluteUnixPath; import com.google.cloud.tools.jib.api.buildplan.FilePermissions; import com.google.cloud.tools.jib.api.buildplan.ImageFormat; import java.nio.file.Path; @@ -47,6 +46,17 @@ static interface PlatformConfiguration { Optional getArchitectureName(); } + static interface ExtraDirectoriesConfiguration { + + Path getFrom(); + + String getInto(); + + List getIncludesList(); + + List getExcludesList(); + } + Optional getFromImage(); Optional getToImage(); @@ -99,7 +109,7 @@ static interface PlatformConfiguration { String getCreationTime(); - Map getExtraDirectories(); + List getExtraDirectories(); Map getExtraDirectoryPermissions(); diff --git a/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessorTest.java b/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessorTest.java index 484dd60ae4..d5371be228 100644 --- a/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessorTest.java +++ b/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/PluginConfigurationProcessorTest.java @@ -42,6 +42,7 @@ import com.google.cloud.tools.jib.api.buildplan.Platform; import com.google.cloud.tools.jib.configuration.BuildContext; import com.google.cloud.tools.jib.configuration.ImageConfiguration; +import com.google.cloud.tools.jib.plugins.common.RawConfiguration.ExtraDirectoriesConfiguration; import com.google.cloud.tools.jib.plugins.common.RawConfiguration.PlatformConfiguration; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -122,6 +123,35 @@ public Optional getArchitectureName() { } } + private static class TestExtraDirectoriesConfiguration implements ExtraDirectoriesConfiguration { + + private final Path from; + + private TestExtraDirectoriesConfiguration(Path from) { + this.from = from; + } + + @Override + public Path getFrom() { + return from; + } + + @Override + public String getInto() { + return "/target/dir"; + } + + @Override + public List getIncludesList() { + return Collections.emptyList(); + } + + @Override + public List getExcludesList() { + return Collections.emptyList(); + } + } + @Before public void setUp() throws IOException, InvalidImageReferenceException, InferredAuthException { when(rawConfiguration.getFromAuth()).thenReturn(authProperty); @@ -177,8 +207,8 @@ public void testPluginConfigurationProcessor_extraDirectory() InvalidContainerizingModeException, InvalidFilesModificationTimeException, InvalidCreationTimeException { Path extraDirectory = Paths.get(Resources.getResource("core/layer").toURI()); - when(rawConfiguration.getExtraDirectories()) - .thenReturn(ImmutableMap.of(extraDirectory, AbsoluteUnixPath.get("/target/dir"))); + Mockito.>when(rawConfiguration.getExtraDirectories()) + .thenReturn(Arrays.asList(new TestExtraDirectoriesConfiguration(extraDirectory))); when(rawConfiguration.getExtraDirectoryPermissions()) .thenReturn(ImmutableMap.of("/target/dir/foo", FilePermissions.fromOctalString("123")));