diff --git a/jib-gradle-plugin/src/integration-test/java/com/google/cloud/tools/jib/gradle/JibRunHelper.java b/jib-gradle-plugin/src/integration-test/java/com/google/cloud/tools/jib/gradle/JibRunHelper.java index b2cb9a63ef..fa06d3f1a4 100644 --- a/jib-gradle-plugin/src/integration-test/java/com/google/cloud/tools/jib/gradle/JibRunHelper.java +++ b/jib-gradle-plugin/src/integration-test/java/com/google/cloud/tools/jib/gradle/JibRunHelper.java @@ -89,7 +89,7 @@ static void buildAndRunAdditionalTag( assertCreationTimeEpoch(additionalImageReference); } - static void buildToDockerDaemon( + static BuildResult buildToDockerDaemon( TestProject testProject, String imageReference, String gradleBuildFile) throws IOException, InterruptedException, DigestException { BuildResult buildResult = @@ -106,6 +106,8 @@ static void buildToDockerDaemon( String history = new Command("docker", "history", imageReference).run(); Assert.assertThat(history, CoreMatchers.containsString("jib-gradle-plugin")); + + return buildResult; } static String buildToDockerDaemonAndRun( diff --git a/jib-gradle-plugin/src/integration-test/java/com/google/cloud/tools/jib/gradle/SingleProjectIntegrationTest.java b/jib-gradle-plugin/src/integration-test/java/com/google/cloud/tools/jib/gradle/SingleProjectIntegrationTest.java index 2dcefd38ed..7af925c53f 100644 --- a/jib-gradle-plugin/src/integration-test/java/com/google/cloud/tools/jib/gradle/SingleProjectIntegrationTest.java +++ b/jib-gradle-plugin/src/integration-test/java/com/google/cloud/tools/jib/gradle/SingleProjectIntegrationTest.java @@ -129,6 +129,22 @@ private static void assertDockerInspect(String imageReference) + " }")); } + private static void assertExtraDirectoryDeprecationWarning(String pomXml) + throws DigestException, IOException, InterruptedException { + String targetImage = "localhost:6000/simpleimage:gradle" + System.nanoTime(); + BuildResult buildResult = + JibRunHelper.buildToDockerDaemon(simpleTestProject, targetImage, pomXml); + Assert.assertEquals( + "Hello, world. \nrw-r--r--\nrw-r--r--\nfoo\ncat\n", + new Command("docker", "run", "--rm", targetImage).run()); + Assert.assertThat( + buildResult.getOutput(), + CoreMatchers.containsString( + "'jib.extraDirectory', 'jib.extraDirectory.path', and 'jib.extraDirectory.permissions' " + + "are deprecated; use 'jib.extraDirectories.paths' and " + + "'jib.extraDirectories.permissions'")); + } + private static String buildAndRunComplex( String imageReference, String username, String password, LocalRegistry targetRegistry) throws IOException, InterruptedException { @@ -232,6 +248,24 @@ public void testDockerDaemon_simpleWithIncompatibleJava11() } } + @Test + public void testDockerDaemon_simple_deprecatedExtraDirectory() + throws DigestException, IOException, InterruptedException { + assertExtraDirectoryDeprecationWarning("build-extra-dir-deprecated.gradle"); + } + + @Test + public void testDockerDaemon_simple_deprecatedExtraDirectory2() + throws DigestException, IOException, InterruptedException { + assertExtraDirectoryDeprecationWarning("build-extra-dir-deprecated2.gradle"); + } + + @Test + public void testDockerDaemon_simple_deprecatedExtraDirectory3() + throws DigestException, IOException, InterruptedException { + assertExtraDirectoryDeprecationWarning("build-extra-dir-deprecated3.gradle"); + } + @Test public void testDockerDaemon_simple_multipleExtraDirectories() throws DigestException, IOException, InterruptedException { diff --git a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dir-deprecated.gradle b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dir-deprecated.gradle new file mode 100644 index 0000000000..f330a8f97a --- /dev/null +++ b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dir-deprecated.gradle @@ -0,0 +1,20 @@ +plugins { + id 'java' + id 'com.google.cloud.tools.jib' +} + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +repositories { + mavenCentral() +} + +dependencies { + compile files('libs/dependency-1.0.0.jar') +} + +jib.to.image = System.getProperty("_TARGET_IMAGE") +jib.extraDirectory { + path = file('src/main/custom-extra-dir') +} diff --git a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dir-deprecated2.gradle b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dir-deprecated2.gradle new file mode 100644 index 0000000000..4eeb3e5c56 --- /dev/null +++ b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dir-deprecated2.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java' + id 'com.google.cloud.tools.jib' +} + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +repositories { + mavenCentral() +} + +dependencies { + compile files('libs/dependency-1.0.0.jar') +} + +jib.to.image = System.getProperty("_TARGET_IMAGE") +jib.extraDirectory = file('src/main/custom-extra-dir') diff --git a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dir-deprecated3.gradle b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dir-deprecated3.gradle new file mode 100644 index 0000000000..3d0a53203f --- /dev/null +++ b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dir-deprecated3.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java' + id 'com.google.cloud.tools.jib' +} + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +repositories { + mavenCentral() +} + +dependencies { + compile files('libs/dependency-1.0.0.jar') +} + +jib.to.image = System.getProperty("_TARGET_IMAGE") +jib.extraDirectory.path = file('src/main/custom-extra-dir') diff --git a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dirs.gradle b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dirs.gradle index d185ff2603..d3a4ff06c8 100644 --- a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dirs.gradle +++ b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dirs.gradle @@ -15,4 +15,4 @@ dependencies { } jib.to.image = System.getProperty("_TARGET_IMAGE") -jib.extraDirectory = ['src/main/custom-extra-dir', 'src/main/custom-extra-dir2'] +jib.extraDirectories.paths = ['src/main/custom-extra-dir', 'src/main/custom-extra-dir2'] diff --git a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dirs2.gradle b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dirs2.gradle index 07ebab8972..362d5b54da 100644 --- a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dirs2.gradle +++ b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build-extra-dirs2.gradle @@ -15,7 +15,7 @@ dependencies { } jib.to.image = System.getProperty("_TARGET_IMAGE") -jib.extraDirectory { - path = files('src/main/custom-extra-dir', 'src/main/custom-extra-dir2') +jib.extraDirectories { + paths = files('src/main/custom-extra-dir', 'src/main/custom-extra-dir2') permissions = ['/baz':'705'] } diff --git a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build.gradle b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build.gradle index b350cfeb4d..84b461ad2a 100644 --- a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build.gradle +++ b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/build.gradle @@ -28,5 +28,5 @@ jib { workingDirectory = '/home' extraClasspath = ['/d1','/d2'] } - extraDirectory = file('src/main/custom-extra-dir') + extraDirectories.paths = file('src/main/custom-extra-dir') } diff --git a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/complex-build.gradle b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/complex-build.gradle index 9a9b9d1fbe..de303ff081 100644 --- a/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/complex-build.gradle +++ b/jib-gradle-plugin/src/integration-test/resources/gradle/projects/simple/complex-build.gradle @@ -39,8 +39,8 @@ jib { labels = [key1:'value1', key2:'value2'] volumes = ['/var/log', '/var/log2'] } - extraDirectory { - path = file('src/main/custom-extra-dir') + extraDirectories { + paths = file('src/main/custom-extra-dir') permissions = ['/foo':'755', '/bar/cat':'777'] } allowInsecureRegistries = true diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildDockerTask.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildDockerTask.java index afc2fdb98b..9a10c72762 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildDockerTask.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildDockerTask.java @@ -101,6 +101,7 @@ public void buildDocker() // Asserts required @Input parameters are not null. Preconditions.checkNotNull(jibExtension); + TaskCommon.checkDeprecatedUsage(jibExtension, getLogger()); TaskCommon.disableHttpLogging(); try { diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildImageTask.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildImageTask.java index 15fe7da536..d887cfce38 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildImageTask.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildImageTask.java @@ -78,6 +78,7 @@ public void buildImage() MainClassInferenceException { // Asserts required @Input parameters are not null. Preconditions.checkNotNull(jibExtension); + TaskCommon.checkDeprecatedUsage(jibExtension, getLogger()); TaskCommon.disableHttpLogging(); try { diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildTarTask.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildTarTask.java index 57de55d8f5..5a5a55715d 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildTarTask.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildTarTask.java @@ -81,7 +81,7 @@ public void setTargetImage(String targetImage) { @InputFiles public FileCollection getInputFiles() { List extraDirectories = - Preconditions.checkNotNull(jibExtension).getExtraDirectory().getPaths(); + Preconditions.checkNotNull(jibExtension).getExtraDirectories().getPaths(); return extraDirectories .stream() .map(Path::toFile) @@ -105,6 +105,7 @@ public void buildTar() MainClassInferenceException { // Asserts required @Input parameters are not null. Preconditions.checkNotNull(jibExtension); + TaskCommon.checkDeprecatedUsage(jibExtension, getLogger()); TaskCommon.disableHttpLogging(); try { 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/ExtraDirectoriesParameters.java similarity index 71% rename from jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoryParameters.java rename to jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/ExtraDirectoriesParameters.java index 2d419becc5..219b52eb94 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/ExtraDirectoriesParameters.java @@ -30,17 +30,19 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; -/** Object in {@link JibExtension} that configures the extra directory. */ -public class ExtraDirectoryParameters { +/** Object in {@link JibExtension} that configures the extra directories. */ +public class ExtraDirectoriesParameters { private final Project project; + @Deprecated private final JibExtension jibExtension; private List paths; private Map permissions = Collections.emptyMap(); @Inject - public ExtraDirectoryParameters(Project project) { + public ExtraDirectoriesParameters(Project project, JibExtension jibExtension) { this.project = project; + this.jibExtension = jibExtension; paths = Collections.singletonList( project.getProjectDir().toPath().resolve("src").resolve("main").resolve("jib")); @@ -57,7 +59,9 @@ public List getPathStrings() { public List getPaths() { // Gradle warns about @Input annotations on File objects, so we have to expose a getter for a // String to make them go away. - String property = System.getProperty(PropertyNames.EXTRA_DIRECTORY_PATH); + String deprecatedProperty = System.getProperty(PropertyNames.EXTRA_DIRECTORY_PATH); + String newProperty = System.getProperty(PropertyNames.EXTRA_DIRECTORIES_PATHS); + String property = newProperty != null ? newProperty : deprecatedProperty; if (property != null) { List pathStrings = ConfigurationPropertyValidator.parseListProperty(property); return pathStrings.stream().map(Paths::get).collect(Collectors.toList()); @@ -67,16 +71,22 @@ public List getPaths() { /** * Sets paths. {@code paths} can be any suitable object describing file paths convertible by - * {@link Project#files} (such as {@code List}). + * {@link Project#files} (such as {@link File}, {@code List}, or {@code List}). * * @param paths paths to set. */ - // non-plural to retain backward-compatibility for the "jib.extraDirectory.path" config parameter - public void setPath(Object paths) { + public void setPaths(Object paths) { + jibExtension.extraDirectoriesConfigured = true; this.paths = project.files(paths).getFiles().stream().map(File::toPath).collect(Collectors.toList()); } + @Deprecated + public void setPath(File path) { + jibExtension.extraDirectoryConfigured = true; + this.paths = Collections.singletonList(path.toPath()); + } + /** * 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 @@ -86,9 +96,11 @@ public void setPath(Object paths) { */ @Input public Map getPermissions() { - if (System.getProperty(PropertyNames.EXTRA_DIRECTORY_PERMISSIONS) != null) { - return ConfigurationPropertyValidator.parseMapProperty( - System.getProperty(PropertyNames.EXTRA_DIRECTORY_PERMISSIONS)); + String deprecatedProperty = System.getProperty(PropertyNames.EXTRA_DIRECTORY_PERMISSIONS); + String newProperty = System.getProperty(PropertyNames.EXTRA_DIRECTORIES_PERMISSIONS); + String property = newProperty != null ? newProperty : deprecatedProperty; + if (property != null) { + return ConfigurationPropertyValidator.parseMapProperty(property); } return permissions; } diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/FilesTask.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/FilesTask.java index d59523fe4b..e32ad05486 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/FilesTask.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/FilesTask.java @@ -150,7 +150,7 @@ public void listFiles() { printProjectFiles(project); // Print extra layer - List extraDirectories = jibExtension.getExtraDirectory().getPaths(); + List extraDirectories = jibExtension.getExtraDirectories().getPaths(); extraDirectories.stream().filter(Files::exists).forEach(System.out::println); // Find project dependencies diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/FilesTaskV2.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/FilesTaskV2.java index 1d8e4a4a6a..6c5b2938a4 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/FilesTaskV2.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/FilesTaskV2.java @@ -69,7 +69,7 @@ public void listFiles() throws IOException { addProjectFiles(project); // Add extra layer - List extraDirectories = jibExtension.getExtraDirectory().getPaths(); + List extraDirectories = jibExtension.getExtraDirectories().getPaths(); extraDirectories.stream().filter(Files::exists).forEach(skaffoldFilesOutput::addInput); // Find project dependencies 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 de7ae2fd03..eed3b424a3 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 @@ -152,11 +152,11 @@ public Optional getProperty(String propertyName) { @Override public List getExtraDirectories() { - return jibExtension.getExtraDirectory().getPaths(); + return jibExtension.getExtraDirectories().getPaths(); } @Override public Map getExtraDirectoryPermissions() { - return TaskCommon.convertPermissionsMap(jibExtension.getExtraDirectory().getPermissions()); + return TaskCommon.convertPermissionsMap(jibExtension.getExtraDirectories().getPermissions()); } } diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index 70d35d5255..d7760e0004 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -17,6 +17,7 @@ package com.google.cloud.tools.jib.gradle; import com.google.cloud.tools.jib.plugins.common.PropertyNames; +import java.io.File; import org.gradle.api.Action; import org.gradle.api.Project; import org.gradle.api.model.ObjectFactory; @@ -48,8 +49,8 @@ * format = OCI * appRoot = '/app' * } - * extraDirectory { - * path = file('path/to/extra/dir') + * extraDirectories { + * paths = ['/path/to/extra/dir', 'can/be/relative/to/project/root'] * permissions = [ * '/path/on/container/file1': 744, * '/path/on/container/file2': 123 @@ -67,17 +68,19 @@ public class JibExtension { private final BaseImageParameters from; private final TargetImageParameters to; private final ContainerParameters container; - private final ExtraDirectoryParameters extraDirectory; - + private final ExtraDirectoriesParameters extraDirectories; private final Property allowInsecureRegistries; + @Deprecated boolean extraDirectoryConfigured; + @Deprecated boolean extraDirectoriesConfigured; + public JibExtension(Project project) { ObjectFactory objectFactory = project.getObjects(); from = objectFactory.newInstance(BaseImageParameters.class); to = objectFactory.newInstance(TargetImageParameters.class); container = objectFactory.newInstance(ContainerParameters.class); - extraDirectory = objectFactory.newInstance(ExtraDirectoryParameters.class, project); + extraDirectories = objectFactory.newInstance(ExtraDirectoriesParameters.class, project, this); allowInsecureRegistries = objectFactory.property(Boolean.class); @@ -97,19 +100,22 @@ public void container(Action action) { action.execute(container); } - public void extraDirectory(Action action) { - action.execute(extraDirectory); + @Deprecated + public void extraDirectory(Action action) { + extraDirectoryConfigured = true; + action.execute(extraDirectories); + } + + public void extraDirectories(Action action) { + extraDirectoriesConfigured = true; + action.execute(extraDirectories); } - /** - * Sets extra directory paths. {@code extraDirectories} can be any suitable object describing file - * paths convertible by {@link Project#files} (such as {@code List}). - * - * @param extraDirectories paths to set. - */ - // non-plural to retain backward-compatibility for the "jib.extraDirectory" config parameter - public void setExtraDirectory(Object extraDirectories) { - this.extraDirectory.setPath(extraDirectories); + @Deprecated + // for the deprecated "jib.extraDirectory" config parameter + public void setExtraDirectory(File extraDirectory) { + extraDirectoryConfigured = true; + this.extraDirectories.setPath(extraDirectory); } public void setAllowInsecureRegistries(boolean allowInsecureRegistries) { @@ -134,10 +140,17 @@ public ContainerParameters getContainer() { return container; } + @Deprecated + @Nested + @Optional + public ExtraDirectoriesParameters getExtraDirectory() { + return extraDirectories; + } + @Nested @Optional - public ExtraDirectoryParameters getExtraDirectory() { - return extraDirectory; + public ExtraDirectoriesParameters getExtraDirectories() { + return extraDirectories; } @Input diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/TaskCommon.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/TaskCommon.java index 3464a0d197..8b7ef5654d 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/TaskCommon.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/TaskCommon.java @@ -19,12 +19,13 @@ import com.google.api.client.http.HttpTransport; import com.google.cloud.tools.jib.configuration.FilePermissions; import com.google.cloud.tools.jib.filesystem.AbsoluteUnixPath; -import com.google.common.annotations.VisibleForTesting; +import com.google.cloud.tools.jib.plugins.common.PropertyNames; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import javax.annotation.Nullable; import org.gradle.api.Project; +import org.gradle.api.logging.Logger; import org.gradle.api.plugins.WarPluginConvention; import org.gradle.api.tasks.bundling.War; import org.gradle.internal.logging.events.LogEvent; @@ -67,6 +68,25 @@ static void disableHttpLogging() { java.util.logging.Logger.getLogger(HttpTransport.class.getName()).setLevel(Level.OFF); } + @Deprecated + static void checkDeprecatedUsage(JibExtension jibExtension, Logger logger) { + if (jibExtension.extraDirectoryConfigured + || System.getProperty(PropertyNames.EXTRA_DIRECTORY_PATH) != null + || System.getProperty(PropertyNames.EXTRA_DIRECTORY_PERMISSIONS) != null) { + logger.warn( + "'jib.extraDirectory', 'jib.extraDirectory.path', and 'jib.extraDirectory.permissions' " + + "are deprecated; use 'jib.extraDirectories.paths' and " + + "'jib.extraDirectories.permissions'"); + + if (jibExtension.extraDirectoriesConfigured + || System.getProperty(PropertyNames.EXTRA_DIRECTORIES_PATHS) != null + || System.getProperty(PropertyNames.EXTRA_DIRECTORIES_PERMISSIONS) != null) { + throw new IllegalArgumentException( + "You cannot configure both 'jib.extraDirectory.path' and 'jib.extraDirectories.paths'"); + } + } + } + /** * Validates and converts a {@code String->String} file-path-to-file-permissions map to an * equivalent {@code AbsoluteUnixPath->FilePermission} map. @@ -74,7 +94,6 @@ static void disableHttpLogging() { * @param stringMap the map to convert (example entry: {@code "/path/on/container" -> "755"}) * @return the converted map */ - @VisibleForTesting static Map convertPermissionsMap( Map stringMap) { Map permissionsMap = new HashMap<>(); 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 c4ca5edbb9..40aab0338a 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 @@ -56,6 +56,8 @@ private static void clearProperties() { System.clearProperty("jib.container.user"); System.clearProperty("jib.extraDirectory.path"); System.clearProperty("jib.extraDirectory.permissions"); + System.clearProperty("jib.extraDirectories.paths"); + System.clearProperty("jib.extraDirectories.permissions"); } @Before @@ -151,24 +153,90 @@ public void testContainer() { } @Test - public void testExtraDirectory() { + public void testExtraDirectories_default() { Assert.assertEquals( Arrays.asList(Paths.get(fakeProject.getProjectDir().getPath(), "src", "main", "jib")), - testJibExtension.getExtraDirectory().getPaths()); + testJibExtension.getExtraDirectories().getPaths()); Assert.assertEquals( - Collections.emptyMap(), testJibExtension.getExtraDirectory().getPermissions()); + Collections.emptyMap(), testJibExtension.getExtraDirectories().getPermissions()); + } + @Test + public void testExtraDirectories_deprecatedConfig() { testJibExtension.extraDirectory( extraDirectory -> { extraDirectory.setPath(Paths.get("test", "path").toFile()); extraDirectory.setPermissions(ImmutableMap.of("file1", "123", "file2", "456")); }); + Assert.assertTrue(testJibExtension.extraDirectoryConfigured); + Assert.assertFalse(testJibExtension.extraDirectoriesConfigured); + + Assert.assertEquals( + Arrays.asList(Paths.get("test", "path")), + testJibExtension.getExtraDirectories().getPaths()); + Assert.assertEquals( + ImmutableMap.of("file1", "123", "file2", "456"), + testJibExtension.getExtraDirectories().getPermissions()); + } + + @Test + public void testExtraDirectories() { + testJibExtension.extraDirectories( + extraDirectories -> { + extraDirectories.setPaths("test/path"); + extraDirectories.setPermissions(ImmutableMap.of("file1", "123", "file2", "456")); + }); + Assert.assertFalse(testJibExtension.extraDirectoryConfigured); + Assert.assertTrue(testJibExtension.extraDirectoriesConfigured); + Assert.assertEquals( Arrays.asList(Paths.get(fakeProject.getProjectDir().getPath(), "test", "path")), - testJibExtension.getExtraDirectory().getPaths()); + testJibExtension.getExtraDirectories().getPaths()); Assert.assertEquals( ImmutableMap.of("file1", "123", "file2", "456"), - testJibExtension.getExtraDirectory().getPermissions()); + testJibExtension.getExtraDirectories().getPermissions()); + } + + @Test + public void testExtraDirectories_fileForPaths() { + testJibExtension.extraDirectories( + extraDirectories -> { + extraDirectories.setPaths(Paths.get("test", "path").toFile()); + }); + Assert.assertEquals( + Arrays.asList(Paths.get(fakeProject.getProjectDir().getPath(), "test", "path")), + testJibExtension.getExtraDirectories().getPaths()); + } + + @Test + public void testExtraDirectories_stringListForPaths() { + testJibExtension.extraDirectories( + extraDirectories -> { + extraDirectories.setPaths(Arrays.asList("test/path", "another/path")); + extraDirectories.setPermissions(ImmutableMap.of("file1", "123", "file2", "456")); + }); + + String projectRoot = fakeProject.getProjectDir().getPath(); + Assert.assertEquals( + Arrays.asList( + Paths.get(projectRoot, "test", "path"), Paths.get(projectRoot, "another", "path")), + testJibExtension.getExtraDirectories().getPaths()); + } + + @Test + public void testExtraDirectories_fileListForPaths() { + testJibExtension.extraDirectories( + extraDirectories -> { + extraDirectories.setPaths( + Arrays.asList( + Paths.get("test", "path").toFile(), Paths.get("another", "path").toFile())); + }); + + String projectRoot = fakeProject.getProjectDir().getPath(); + Assert.assertEquals( + Arrays.asList( + Paths.get(projectRoot, "test", "path"), Paths.get(projectRoot, "another", "path")), + testJibExtension.getExtraDirectories().getPaths()); } @Test @@ -220,5 +288,25 @@ public void testProperties() { Assert.assertTrue(testJibExtension.getContainer().getUseCurrentTimestamp()); System.setProperty("jib.container.user", "myUser"); Assert.assertEquals("myUser", testJibExtension.getContainer().getUser()); + System.setProperty("jib.extraDirectories.paths", "/foo,/bar/baz"); + Assert.assertEquals( + Arrays.asList(Paths.get("/foo"), Paths.get("/bar/baz")), + testJibExtension.getExtraDirectories().getPaths()); + System.setProperty("jib.extraDirectories.permissions", "/foo/bar=707,/baz=456"); + Assert.assertEquals( + ImmutableMap.of("/foo/bar", "707", "/baz", "456"), + testJibExtension.getExtraDirectories().getPermissions()); + } + + @Test + public void testDeprecatedProperties() { + System.setProperty("jib.extraDirectory.path", "/foo,/bar/baz"); + Assert.assertEquals( + Arrays.asList(Paths.get("/foo"), Paths.get("/bar/baz")), + testJibExtension.getExtraDirectories().getPaths()); + System.setProperty("jib.extraDirectory.permissions", "/foo/bar=707,/baz=456"); + Assert.assertEquals( + ImmutableMap.of("/foo/bar", "707", "/baz", "456"), + testJibExtension.getExtraDirectories().getPermissions()); } } diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/TaskCommonTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/TaskCommonTest.java new file mode 100644 index 0000000000..882c213a75 --- /dev/null +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/TaskCommonTest.java @@ -0,0 +1,126 @@ +/* + * Copyright 2019 Google LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.cloud.tools.jib.gradle; + +import org.gradle.api.logging.Logger; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + +/** Tests for {@link TaskCommon}. */ +@RunWith(MockitoJUnitRunner.class) +public class TaskCommonTest { + + @Mock private JibExtension jibExtension; + @Mock private Logger logger; + + @Before + public void setUp() { + Assert.assertNull(System.getProperty("jib.extraDirectory.path")); + Assert.assertNull(System.getProperty("jib.extraDirectory.permissions")); + Assert.assertNull(System.getProperty("jib.extraDirectories.paths")); + Assert.assertNull(System.getProperty("jib.extraDirectories.permissions")); + } + + @After + public void tearDown() { + System.clearProperty("jib.extraDirectory.path"); + System.clearProperty("jib.extraDirectory.permissions"); + System.clearProperty("jib.extraDirectories.paths"); + System.clearProperty("jib.extraDirectories.permissions"); + } + + @Test + public void testCheckDeprecatedUsage_default() { + TaskCommon.checkDeprecatedUsage(jibExtension, logger); + Mockito.verify(logger, Mockito.never()).warn(Mockito.anyString()); + } + + @Test + public void testCheckDeprecatedUsage_extraDirectoriesConfigured() { + jibExtension.extraDirectoriesConfigured = true; + TaskCommon.checkDeprecatedUsage(jibExtension, logger); + Mockito.verify(logger, Mockito.never()).warn(Mockito.anyString()); + } + + @Test + public void testCheckDeprecatedUsage_extraDirectoryPathPropertySet() { + System.setProperty("jib.extraDirectory.path", "something"); + TaskCommon.checkDeprecatedUsage(jibExtension, logger); + Mockito.verify(logger, Mockito.times(1)) + .warn( + "'jib.extraDirectory', 'jib.extraDirectory.path', and 'jib.extraDirectory.permissions' " + + "are deprecated; use 'jib.extraDirectories.paths' and " + + "'jib.extraDirectories.permissions'"); + } + + @Test + public void testCheckDeprecatedUsage_extraDirectoryPermissionsPropertySet() { + System.setProperty("jib.extraDirectory.permissions", "something"); + TaskCommon.checkDeprecatedUsage(jibExtension, logger); + Mockito.verify(logger, Mockito.times(1)) + .warn( + "'jib.extraDirectory', 'jib.extraDirectory.path', and 'jib.extraDirectory.permissions' " + + "are deprecated; use 'jib.extraDirectories.paths' and " + + "'jib.extraDirectories.permissions'"); + } + + @Test + public void testCheckDeprecatedUsage_extraDirectoryAndExtraDirectoriesPropertiesSet() { + System.setProperty("jib.extraDirectory.path", "something"); + System.setProperty("jib.extraDirectories.permissions", "something"); + + try { + TaskCommon.checkDeprecatedUsage(jibExtension, logger); + Assert.fail(); + } catch (IllegalArgumentException ex) { + Assert.assertEquals( + "You cannot configure both 'jib.extraDirectory.path' and 'jib.extraDirectories.paths'", + ex.getMessage()); + } + } + + @Test + public void testCheckDeprecatedUsage_extraDirectoryConfigured() { + jibExtension.extraDirectoryConfigured = true; + TaskCommon.checkDeprecatedUsage(jibExtension, logger); + Mockito.verify(logger, Mockito.times(1)) + .warn( + "'jib.extraDirectory', 'jib.extraDirectory.path', and 'jib.extraDirectory.permissions' " + + "are deprecated; use 'jib.extraDirectories.paths' and " + + "'jib.extraDirectories.permissions'"); + } + + @Test + public void testCheckDeprecatedUsage_extraDirectoryAndExtraDirectoriesConfigured() { + jibExtension.extraDirectoryConfigured = true; + jibExtension.extraDirectoriesConfigured = true; + try { + TaskCommon.checkDeprecatedUsage(jibExtension, logger); + Assert.fail(); + } catch (IllegalArgumentException ex) { + Assert.assertEquals( + "You cannot configure both 'jib.extraDirectory.path' and 'jib.extraDirectories.paths'", + ex.getMessage()); + } + } +} diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/multi-service/complex-service/build.gradle b/jib-gradle-plugin/src/test/resources/gradle/projects/multi-service/complex-service/build.gradle index 92ca5a3e66..eacc676f1c 100644 --- a/jib-gradle-plugin/src/test/resources/gradle/projects/multi-service/complex-service/build.gradle +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/multi-service/complex-service/build.gradle @@ -17,8 +17,8 @@ jib { to { image = System.getProperty("_TARGET_IMAGE") } - extraDirectory { - path = file('src/main/other-jib') + extraDirectories { + paths = file('src/main/other-jib') } } @@ -34,4 +34,4 @@ dependencies { compile project(':lib') compile 'org.apache.commons:commons-io:1.3.2' compile 'com.google.guava:guava:HEAD-jre-SNAPSHOT' -} \ No newline at end of file +} diff --git a/jib-gradle-plugin/src/test/resources/gradle/projects/simple/build.gradle b/jib-gradle-plugin/src/test/resources/gradle/projects/simple/build.gradle index 52d0f7cab5..6dab9e5207 100644 --- a/jib-gradle-plugin/src/test/resources/gradle/projects/simple/build.gradle +++ b/jib-gradle-plugin/src/test/resources/gradle/projects/simple/build.gradle @@ -18,7 +18,7 @@ jib { to { image = System.getProperty("_TARGET_IMAGE") } - extraDirectory { - path = file('src/main/custom-extra-dir') + extraDirectories { + paths = file('src/main/custom-extra-dir') } } diff --git a/jib-maven-plugin/src/test/resources/maven/projects/simple/pom-complex-properties.xml b/jib-maven-plugin/src/test/resources/maven/projects/simple/pom-complex-properties.xml index 9e392e7e84..b8c1dc77e3 100644 --- a/jib-maven-plugin/src/test/resources/maven/projects/simple/pom-complex-properties.xml +++ b/jib-maven-plugin/src/test/resources/maven/projects/simple/pom-complex-properties.xml @@ -27,8 +27,8 @@ key1=value1,key2=value2 /var/log,/var/log2 Docker - ${project.basedir}/src/main/jib-custom - /foo=755,/bar/cat=777 + ${project.basedir}/src/main/jib-custom + /foo=755,/bar/cat=777 true