From 2bf83d7da6b919ea949323e00861a9d25c6ad83c Mon Sep 17 00:00:00 2001 From: Urs Keller Date: Sun, 12 Dec 2021 00:11:50 +0100 Subject: [PATCH 1/7] Expose jib.from.platforms as property. --- .../jib/maven/JibPluginConfiguration.java | 22 +++++++++++++++---- .../jib/plugins/common/PropertyNames.java | 1 + 2 files changed, 19 insertions(+), 4 deletions(-) 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 284f1f8a44..7194a8766c 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 @@ -37,6 +37,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.annotation.Nullable; import javax.inject.Inject; import org.apache.maven.execution.MavenSession; @@ -146,6 +147,16 @@ public Optional getOsName() { public Optional getArchitectureName() { return Optional.ofNullable(architecture); } + + private static PlatformParameters ofString(String osArchitecture) { + if (osArchitecture == null || !osArchitecture.matches("[^/]+/[^/]+")) { + throw new IllegalArgumentException("osArchitecture must be of form os/architecture"); + } + PlatformParameters platformParameters = new PlatformParameters(); + platformParameters.os = osArchitecture.split("/")[0].trim(); + platformParameters.architecture = osArchitecture.split("/")[1].trim(); + return platformParameters; + } } /** Configuration for {@code from} parameter. */ @@ -158,10 +169,7 @@ public static class FromConfiguration { /** Constructor for defaults. */ public FromConfiguration() { - PlatformParameters platform = new PlatformParameters(); - platform.os = "linux"; - platform.architecture = "amd64"; - platforms = Collections.singletonList(platform); + platforms = Collections.singletonList(PlatformParameters.ofString("linux/amd64")); } } @@ -354,6 +362,12 @@ protected void checkJibVersion() throws MojoExecutionException { * @return the specified platforms */ List getPlatforms() { + String property = getProperty(PropertyNames.FROM_PLATFORMS); + if (property != null) { + return Stream.of(property.split(",")) + .map(PlatformParameters::ofString) + .collect(Collectors.toList()); + } return from.platforms; } diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java index 29ddadbce2..14e27c2ed3 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java @@ -23,6 +23,7 @@ public class PropertyNames { public static final String FROM_CRED_HELPER = "jib.from.credHelper"; public static final String FROM_AUTH_USERNAME = "jib.from.auth.username"; public static final String FROM_AUTH_PASSWORD = "jib.from.auth.password"; + public static final String FROM_PLATFORMS = "jib.from.platforms"; public static final String TO_IMAGE = "jib.to.image"; public static final String TO_IMAGE_ALTERNATE = "image"; public static final String TO_TAGS = "jib.to.tags"; From 769306c73accdea9e0f45a49c2234ef785bb2cd4 Mon Sep 17 00:00:00 2001 From: Urs Keller Date: Sun, 12 Dec 2021 00:11:50 +0100 Subject: [PATCH 2/7] Expose jib.from.platforms as property. --- .../jib/maven/JibPluginConfiguration.java | 22 +++++++++++++++---- .../jib/plugins/common/PropertyNames.java | 1 + 2 files changed, 19 insertions(+), 4 deletions(-) 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 284f1f8a44..7194a8766c 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 @@ -37,6 +37,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.annotation.Nullable; import javax.inject.Inject; import org.apache.maven.execution.MavenSession; @@ -146,6 +147,16 @@ public Optional getOsName() { public Optional getArchitectureName() { return Optional.ofNullable(architecture); } + + private static PlatformParameters ofString(String osArchitecture) { + if (osArchitecture == null || !osArchitecture.matches("[^/]+/[^/]+")) { + throw new IllegalArgumentException("osArchitecture must be of form os/architecture"); + } + PlatformParameters platformParameters = new PlatformParameters(); + platformParameters.os = osArchitecture.split("/")[0].trim(); + platformParameters.architecture = osArchitecture.split("/")[1].trim(); + return platformParameters; + } } /** Configuration for {@code from} parameter. */ @@ -158,10 +169,7 @@ public static class FromConfiguration { /** Constructor for defaults. */ public FromConfiguration() { - PlatformParameters platform = new PlatformParameters(); - platform.os = "linux"; - platform.architecture = "amd64"; - platforms = Collections.singletonList(platform); + platforms = Collections.singletonList(PlatformParameters.ofString("linux/amd64")); } } @@ -354,6 +362,12 @@ protected void checkJibVersion() throws MojoExecutionException { * @return the specified platforms */ List getPlatforms() { + String property = getProperty(PropertyNames.FROM_PLATFORMS); + if (property != null) { + return Stream.of(property.split(",")) + .map(PlatformParameters::ofString) + .collect(Collectors.toList()); + } return from.platforms; } diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java index 29ddadbce2..14e27c2ed3 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java @@ -23,6 +23,7 @@ public class PropertyNames { public static final String FROM_CRED_HELPER = "jib.from.credHelper"; public static final String FROM_AUTH_USERNAME = "jib.from.auth.username"; public static final String FROM_AUTH_PASSWORD = "jib.from.auth.password"; + public static final String FROM_PLATFORMS = "jib.from.platforms"; public static final String TO_IMAGE = "jib.to.image"; public static final String TO_IMAGE_ALTERNATE = "image"; public static final String TO_TAGS = "jib.to.tags"; From 1840cd2a595607809e4989d699921cd947c2c8bf Mon Sep 17 00:00:00 2001 From: Urs Keller Date: Thu, 16 Dec 2021 11:21:06 +0100 Subject: [PATCH 3/7] code review suggestions --- .../jib/maven/JibPluginConfiguration.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) 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 7194a8766c..2e237a41d1 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 @@ -36,8 +36,9 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; -import java.util.stream.Stream; import javax.annotation.Nullable; import javax.inject.Inject; import org.apache.maven.execution.MavenSession; @@ -135,6 +136,17 @@ Optional getMode() { /** Configuration for {@code platform} parameter. */ public static class PlatformParameters implements PlatformConfiguration { + private static PlatformParameters ofString(String osArchitecture) { + Matcher matcher = Pattern.compile("([^/ ]+)/([^/ ]+)").matcher(osArchitecture); + if (!matcher.matches()) { + throw new IllegalArgumentException("osArchitecture must be of form os/architecture"); + } + PlatformParameters platformParameters = new PlatformParameters(); + platformParameters.os = matcher.group(1); + platformParameters.architecture = matcher.group(2); + return platformParameters; + } + @Nullable @Parameter private String os; @Nullable @Parameter private String architecture; @@ -147,16 +159,6 @@ public Optional getOsName() { public Optional getArchitectureName() { return Optional.ofNullable(architecture); } - - private static PlatformParameters ofString(String osArchitecture) { - if (osArchitecture == null || !osArchitecture.matches("[^/]+/[^/]+")) { - throw new IllegalArgumentException("osArchitecture must be of form os/architecture"); - } - PlatformParameters platformParameters = new PlatformParameters(); - platformParameters.os = osArchitecture.split("/")[0].trim(); - platformParameters.architecture = osArchitecture.split("/")[1].trim(); - return platformParameters; - } } /** Configuration for {@code from} parameter. */ @@ -364,7 +366,7 @@ protected void checkJibVersion() throws MojoExecutionException { List getPlatforms() { String property = getProperty(PropertyNames.FROM_PLATFORMS); if (property != null) { - return Stream.of(property.split(",")) + return ConfigurationPropertyValidator.parseListProperty(property).stream() .map(PlatformParameters::ofString) .collect(Collectors.toList()); } From 273f19fa245442b9cfc556d671d9362632d42d0e Mon Sep 17 00:00:00 2001 From: Urs Keller Date: Thu, 16 Dec 2021 11:44:29 +0100 Subject: [PATCH 4/7] Adding tests --- .../jib/maven/JibPluginConfiguration.java | 2 +- .../jib/maven/JibPluginConfigurationTest.java | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) 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 2e237a41d1..195d1e33c2 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 @@ -139,7 +139,7 @@ public static class PlatformParameters implements PlatformConfiguration { private static PlatformParameters ofString(String osArchitecture) { Matcher matcher = Pattern.compile("([^/ ]+)/([^/ ]+)").matcher(osArchitecture); if (!matcher.matches()) { - throw new IllegalArgumentException("osArchitecture must be of form os/architecture"); + throw new IllegalArgumentException("Platform must be of form os/architecture."); } PlatformParameters platformParameters = new PlatformParameters(); platformParameters.os = matcher.group(1); diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java index d25da1613c..4a3d56aefb 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java @@ -89,6 +89,11 @@ public void testSystemProperties() { sessionProperties.put("jib.from.credHelper", "credHelper"); Assert.assertEquals("credHelper", testPluginConfiguration.getBaseImageCredentialHelperName()); + sessionProperties.put("jib.from.platforms", "linux/amd64,darwin/arm64"); + Assert.assertEquals(2, testPluginConfiguration.getPlatforms().size()); + assertPlatformIs("linux", "amd64", testPluginConfiguration.getPlatforms().get(0)); + assertPlatformIs("darwin", "arm64", testPluginConfiguration.getPlatforms().get(1)); + sessionProperties.put("image", "toImage"); Assert.assertEquals("toImage", testPluginConfiguration.getTargetImage()); sessionProperties.remove("image"); @@ -150,6 +155,23 @@ public void testSystemProperties() { testPluginConfiguration.getDockerClientEnvironment()); } + @Test + public void testSystemPropertiesWithInvalidPlatform() { + sessionProperties.put("jib.from.platforms", "linux /amd64"); + Assert.assertThrows( + IllegalArgumentException.class, () -> testPluginConfiguration.getPlatforms()); + } + + private void assertPlatformIs( + String osName, + String architecture, + JibPluginConfiguration.PlatformParameters platformParameters) { + Assert.assertTrue(platformParameters.getOsName().isPresent()); + Assert.assertEquals(osName, platformParameters.getOsName().get()); + Assert.assertTrue(platformParameters.getArchitectureName().isPresent()); + Assert.assertEquals(architecture, platformParameters.getArchitectureName().get()); + } + @Test public void testSystemPropertiesExtraDirectories() { sessionProperties.put("jib.extraDirectories.paths", "custom-jib"); From 054dfd2f1e82c85cee13645a86800c03e1a8a36b Mon Sep 17 00:00:00 2001 From: Urs Keller Date: Thu, 16 Dec 2021 12:10:46 +0100 Subject: [PATCH 5/7] add jib.from.platforms to the gradle plugin --- .../tools/jib/gradle/BaseImageParameters.java | 13 +++++++++++++ .../tools/jib/gradle/PlatformParameters.java | 14 ++++++++++++++ .../cloud/tools/jib/gradle/JibExtensionTest.java | 15 +++++++++++++++ .../jib/maven/JibPluginConfigurationTest.java | 13 ++++++------- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BaseImageParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BaseImageParameters.java index 9077e5b147..a8920f9401 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BaseImageParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BaseImageParameters.java @@ -16,7 +16,10 @@ package com.google.cloud.tools.jib.gradle; +import com.google.cloud.tools.jib.plugins.common.ConfigurationPropertyValidator; import com.google.cloud.tools.jib.plugins.common.PropertyNames; +import java.util.List; +import java.util.stream.Collectors; import javax.annotation.Nullable; import javax.inject.Inject; import org.gradle.api.Action; @@ -53,6 +56,16 @@ public BaseImageParameters(ObjectFactory objectFactory) { @Nested @Optional public ListProperty getPlatforms() { + String platformsProperty = System.getProperty(PropertyNames.FROM_PLATFORMS); + if (platformsProperty != null) { + List parsedPlatforms = + ConfigurationPropertyValidator.parseListProperty(platformsProperty).stream() + .map(PlatformParameters::ofString) + .collect(Collectors.toList()); + if (!parsedPlatforms.equals(platforms.get())) { + platforms.set(parsedPlatforms); + } + } return platforms; } diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java index 204d0c20ad..d983eedc71 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java @@ -18,12 +18,26 @@ import com.google.cloud.tools.jib.plugins.common.RawConfiguration.PlatformConfiguration; import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.annotation.Nullable; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; /** Configuration of a platform. */ public class PlatformParameters implements PlatformConfiguration { + + static PlatformParameters ofString(String osArchitecture) { + Matcher matcher = Pattern.compile("([^/ ]+)/([^/ ]+)").matcher(osArchitecture); + if (!matcher.matches()) { + throw new IllegalArgumentException("Platform must be of form os/architecture."); + } + PlatformParameters platformParameters = new PlatformParameters(); + platformParameters.os = matcher.group(1); + platformParameters.architecture = matcher.group(2); + return platformParameters; + } + @Nullable private String os; @Nullable private String architecture; 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 bb1540c36b..a909394bc2 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 @@ -341,6 +341,15 @@ public void testProperties() { System.setProperty("jib.from.credHelper", "credHelper"); assertThat(testJibExtension.getFrom().getCredHelper()).isEqualTo("credHelper"); + System.setProperty("jib.from.platforms", "linux/amd64,darwin/arm64"); + assertThat(testJibExtension.getFrom().getPlatforms().get()).hasSize(2); + PlatformParameters platform1 = testJibExtension.getFrom().getPlatforms().get().get(0); + assertThat(platform1.getOs()).isEqualTo("linux"); + assertThat(platform1.getArchitecture()).isEqualTo("amd64"); + PlatformParameters platform2 = testJibExtension.getFrom().getPlatforms().get().get(1); + assertThat(platform2.getOs()).isEqualTo("darwin"); + assertThat(platform2.getArchitecture()).isEqualTo("arm64"); + System.setProperty("jib.to.image", "toImage"); assertThat(testJibExtension.getTo().getImage()).isEqualTo("toImage"); System.setProperty("jib.to.tags", "tag1,tag2,tag3"); @@ -412,6 +421,12 @@ public void testProperties() { .inOrder(); } + @Test + public void testSystemPropertiesWithInvalidPlatform() { + System.setProperty("jib.from.platforms", "linux /amd64"); + assertThrows(IllegalArgumentException.class, testJibExtension.getFrom()::getPlatforms); + } + @Test public void testPropertiesOutputPaths() { System.setProperties(new Properties()); diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java index 4a3d56aefb..943e9f731a 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java @@ -155,13 +155,6 @@ public void testSystemProperties() { testPluginConfiguration.getDockerClientEnvironment()); } - @Test - public void testSystemPropertiesWithInvalidPlatform() { - sessionProperties.put("jib.from.platforms", "linux /amd64"); - Assert.assertThrows( - IllegalArgumentException.class, () -> testPluginConfiguration.getPlatforms()); - } - private void assertPlatformIs( String osName, String architecture, @@ -172,6 +165,12 @@ private void assertPlatformIs( Assert.assertEquals(architecture, platformParameters.getArchitectureName().get()); } + @Test + public void testSystemPropertiesWithInvalidPlatform() { + sessionProperties.put("jib.from.platforms", "linux /amd64"); + Assert.assertThrows(IllegalArgumentException.class, testPluginConfiguration::getPlatforms); + } + @Test public void testSystemPropertiesExtraDirectories() { sessionProperties.put("jib.extraDirectories.paths", "custom-jib"); From 87100a2fd92b65483b752f0c99eb1bf45d8a2d8d Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 16 Dec 2021 12:50:07 -0500 Subject: [PATCH 6/7] Fix PlatformParameters comparsion / refactor test code --- jib-gradle-plugin/CHANGELOG.md | 2 + jib-gradle-plugin/README.md | 2 +- .../tools/jib/gradle/BaseImageParameters.java | 14 +- .../tools/jib/gradle/PlatformParameters.java | 20 +- .../tools/jib/gradle/JibExtensionTest.java | 40 +-- jib-maven-plugin/CHANGELOG.md | 2 + jib-maven-plugin/README.md | 2 +- .../jib/maven/JibPluginConfiguration.java | 6 +- .../jib/maven/JibPluginConfigurationTest.java | 308 +++++++++--------- 9 files changed, 208 insertions(+), 188 deletions(-) diff --git a/jib-gradle-plugin/CHANGELOG.md b/jib-gradle-plugin/CHANGELOG.md index 7c4a8fb9af..4f6b8854da 100644 --- a/jib-gradle-plugin/CHANGELOG.md +++ b/jib-gradle-plugin/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file. ### Added +- [`jib.from.platforms`](https://github.com/GoogleContainerTools/jib/tree/master/jib-gradle-plugin#from-closure) parameter for multi-architecture image building can now be configured through Maven and system properties (for example, `-Djib.from.platforms=linux/amd64,linux/arm64` on the command-line). ([#2742](https://github.com/GoogleContainerTools/jib/pull/2742)) + ### Changed - Changed the default base image from the `adoptopenjdk` images to the [`eclipse-temurin`](https://hub.docker.com/_/eclipse-temurin) (for Java 8 and 11) and [`azul/zulu-openjdk`](https://hub.docker.com/r/azul/zulu-openjdk) (for Java 17) images on Docker Hub. Note that Temurin (by Adoptium) is the new name of AdoptOpenJDK. ([#3491](https://github.com/GoogleContainerTools/jib/pull/3491)) diff --git a/jib-gradle-plugin/README.md b/jib-gradle-plugin/README.md index b9470949f5..96f0114fcc 100644 --- a/jib-gradle-plugin/README.md +++ b/jib-gradle-plugin/README.md @@ -213,7 +213,7 @@ Property | Type | Default | Description `image` | `String` | `adoptopenjdk:{8,11}-jre` (or `jetty` for WAR) | The image reference for the base image. The source type can be specified using a [special type prefix](#setting-the-base-image). `auth` | [`auth`](#auth-closure) | *None* | Specifies credentials directly (alternative to `credHelper`). `credHelper` | `String` | *None* | Specifies a credential helper that can authenticate pulling the base image. This parameter can either be configured as an absolute path to the credential helper executable or as a credential helper suffix (following `docker-credential-`). -`platforms` | [`platforms`](#platforms-closure) | See [`platforms`](#platforms-closure) | _Incubating feature_: Configures platforms of base images to select from a manifest list. +`platforms` | [`platforms`](#platforms-closure) | See [`platforms`](#platforms-closure) | Configures platforms of base images to select from a manifest list. `to` is a closure with the following properties: diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BaseImageParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BaseImageParameters.java index a8920f9401..2a9552eccd 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BaseImageParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BaseImageParameters.java @@ -56,14 +56,14 @@ public BaseImageParameters(ObjectFactory objectFactory) { @Nested @Optional public ListProperty getPlatforms() { - String platformsProperty = System.getProperty(PropertyNames.FROM_PLATFORMS); - if (platformsProperty != null) { - List parsedPlatforms = - ConfigurationPropertyValidator.parseListProperty(platformsProperty).stream() - .map(PlatformParameters::ofString) + String property = System.getProperty(PropertyNames.FROM_PLATFORMS); + if (property != null) { + List parsed = + ConfigurationPropertyValidator.parseListProperty(property).stream() + .map(PlatformParameters::of) .collect(Collectors.toList()); - if (!parsedPlatforms.equals(platforms.get())) { - platforms.set(parsedPlatforms); + if (!parsed.equals(platforms.get())) { + platforms.set(parsed); } } return platforms; diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java index d983eedc71..909cf946b3 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java @@ -17,6 +17,7 @@ package com.google.cloud.tools.jib.gradle; import com.google.cloud.tools.jib.plugins.common.RawConfiguration.PlatformConfiguration; +import java.util.Objects; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -27,7 +28,7 @@ /** Configuration of a platform. */ public class PlatformParameters implements PlatformConfiguration { - static PlatformParameters ofString(String osArchitecture) { + static PlatformParameters of(String osArchitecture) { Matcher matcher = Pattern.compile("([^/ ]+)/([^/ ]+)").matcher(osArchitecture); if (!matcher.matches()) { throw new IllegalArgumentException("Platform must be of form os/architecture."); @@ -72,4 +73,21 @@ public Optional getArchitectureName() { public void setArchitecture(String architecture) { this.architecture = architecture; } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (!(other instanceof PlatformParameters)) { + return false; + } + PlatformParameters otherPlatform = (PlatformParameters) other; + return architecture.equals(otherPlatform.getArchitecture()) && os.equals(otherPlatform.getOs()); + } + + @Override + public int hashCode() { + return Objects.hash(architecture, os); + } } 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 a909394bc2..153fd47d86 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 @@ -72,13 +72,12 @@ public void testFrom() { from.auth(auth -> auth.setUsername("some username")); from.auth(auth -> auth.setPassword("some password")); from.platforms( - platformSpec -> { - platformSpec.platform( - platform -> { - platform.setArchitecture("arm"); - platform.setOs("windows"); - }); - }); + platformSpec -> + platformSpec.platform( + platform -> { + platform.setArchitecture("arm"); + platform.setOs("windows"); + })); }); assertThat(testJibExtension.getFrom().getImage()).isEqualTo("some image"); assertThat(testJibExtension.getFrom().getCredHelper()).isEqualTo("some cred helper"); @@ -262,11 +261,10 @@ public void testExtraDirectories_stringListForPaths() { @Test public void testExtraDirectories_fileListForPaths() { testJibExtension.extraDirectories( - extraDirectories -> { - extraDirectories.setPaths( - Arrays.asList( - Paths.get("test", "path").toFile(), Paths.get("another", "path").toFile())); - }); + extraDirectories -> + extraDirectories.setPaths( + Arrays.asList( + Paths.get("test", "path").toFile(), Paths.get("another", "path").toFile()))); assertThat(testJibExtension.getExtraDirectories().getPaths()).hasSize(2); assertThat(testJibExtension.getExtraDirectories().getPaths().get(0).getFrom()) @@ -342,13 +340,12 @@ public void testProperties() { assertThat(testJibExtension.getFrom().getCredHelper()).isEqualTo("credHelper"); System.setProperty("jib.from.platforms", "linux/amd64,darwin/arm64"); - assertThat(testJibExtension.getFrom().getPlatforms().get()).hasSize(2); - PlatformParameters platform1 = testJibExtension.getFrom().getPlatforms().get().get(0); - assertThat(platform1.getOs()).isEqualTo("linux"); - assertThat(platform1.getArchitecture()).isEqualTo("amd64"); - PlatformParameters platform2 = testJibExtension.getFrom().getPlatforms().get().get(1); - assertThat(platform2.getOs()).isEqualTo("darwin"); - assertThat(platform2.getArchitecture()).isEqualTo("arm64"); + List platforms = testJibExtension.getFrom().getPlatforms().get(); + assertThat(platforms).hasSize(2); + assertThat(platforms.get(0).getOs()).isEqualTo("linux"); + assertThat(platforms.get(0).getArchitecture()).isEqualTo("amd64"); + assertThat(platforms.get(1).getOs()).isEqualTo("darwin"); + assertThat(platforms.get(1).getArchitecture()).isEqualTo("arm64"); System.setProperty("jib.to.image", "toImage"); assertThat(testJibExtension.getTo().getImage()).isEqualTo("toImage"); @@ -456,10 +453,7 @@ public void testPropertiesOutputPaths() { private TargetImageParameters generateTargetImageParametersWithTags(String... tags) { HashSet set = new HashSet<>(Arrays.asList(tags)); - testJibExtension.to( - to -> { - to.setTags(set); - }); + testJibExtension.to(to -> to.setTags(set)); return testJibExtension.getTo(); } } diff --git a/jib-maven-plugin/CHANGELOG.md b/jib-maven-plugin/CHANGELOG.md index 186864933d..aac0b2571f 100644 --- a/jib-maven-plugin/CHANGELOG.md +++ b/jib-maven-plugin/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file. ### Added +- [``](https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#from-object) parameter for multi-architecture image building can now be configured through Maven and system properties (for example, `-Djib.from.platforms=linux/amd64,linux/arm64` on the command-line). ([#2742](https://github.com/GoogleContainerTools/jib/pull/2742)) + ### Changed - Changed the default base image from the `adoptopenjdk` images to the [`eclipse-temurin`](https://hub.docker.com/_/eclipse-temurin) (for Java 8 and 11) and [`azul/zulu-openjdk`](https://hub.docker.com/r/azul/zulu-openjdk) (for Java 17) images on Docker Hub. Note that Temurin (by Adoptium) is the new name of AdoptOpenJDK. ([#3491](https://github.com/GoogleContainerTools/jib/pull/3491)) diff --git a/jib-maven-plugin/README.md b/jib-maven-plugin/README.md index c98badc425..b812bb60fb 100644 --- a/jib-maven-plugin/README.md +++ b/jib-maven-plugin/README.md @@ -263,7 +263,7 @@ Property | Type | Default | Description `image` | string | `adoptopenjdk:{8,11}-jre` (or `jetty` for WAR) | The image reference for the base image. The source type can be specified using a [special type prefix](#setting-the-base-image). `auth` | [`auth`](#auth-object) | *None* | Specifies credentials directly (alternative to `credHelper`). `credHelper` | string | *None* | Specifies a credential helper that can authenticate pulling the base image. This parameter can either be configured as an absolute path to the credential helper executable or as a credential helper suffix (following `docker-credential-`). -`platforms` | list | See [`platform`](#platform-object) | _Incubating feature_: Configures platforms of base images to select from a manifest list. +`platforms` | list | See [`platform`](#platform-object) | Configures platforms of base images to select from a manifest list. `to` is an object with the following properties: diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/JibPluginConfiguration.java index 195d1e33c2..8b643c7197 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 @@ -136,7 +136,7 @@ Optional getMode() { /** Configuration for {@code platform} parameter. */ public static class PlatformParameters implements PlatformConfiguration { - private static PlatformParameters ofString(String osArchitecture) { + private static PlatformParameters of(String osArchitecture) { Matcher matcher = Pattern.compile("([^/ ]+)/([^/ ]+)").matcher(osArchitecture); if (!matcher.matches()) { throw new IllegalArgumentException("Platform must be of form os/architecture."); @@ -171,7 +171,7 @@ public static class FromConfiguration { /** Constructor for defaults. */ public FromConfiguration() { - platforms = Collections.singletonList(PlatformParameters.ofString("linux/amd64")); + platforms = Collections.singletonList(PlatformParameters.of("linux/amd64")); } } @@ -367,7 +367,7 @@ List getPlatforms() { String property = getProperty(PropertyNames.FROM_PLATFORMS); if (property != null) { return ConfigurationPropertyValidator.parseListProperty(property).stream() - .map(PlatformParameters::ofString) + .map(PlatformParameters::of) .collect(Collectors.toList()); } return from.platforms; diff --git a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java index 943e9f731a..78ef0ec617 100644 --- a/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java +++ b/jib-maven-plugin/src/test/java/com/google/cloud/tools/jib/maven/JibPluginConfigurationTest.java @@ -16,10 +16,13 @@ package com.google.cloud.tools.jib.maven; +import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth8.assertThat; +import static org.junit.Assert.assertThrows; +import static org.mockito.Mockito.when; + import com.google.cloud.tools.jib.maven.JibPluginConfiguration.PermissionConfiguration; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; +import com.google.cloud.tools.jib.maven.JibPluginConfiguration.PlatformParameters; import java.io.File; import java.nio.file.Paths; import java.util.List; @@ -28,12 +31,10 @@ import org.apache.maven.model.Build; import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; -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 JibPluginConfiguration}. */ @@ -49,8 +50,8 @@ public class JibPluginConfigurationTest { @Before public void setup() { - Mockito.when(session.getSystemProperties()).thenReturn(sessionProperties); - Mockito.when(build.getDirectory()).thenReturn("/test/directory"); + when(session.getSystemProperties()).thenReturn(sessionProperties); + when(build.getDirectory()).thenReturn("/test/directory"); testPluginConfiguration = new JibPluginConfiguration() { @Override @@ -69,249 +70,253 @@ public Log getLog() { @Test public void testDefaults() { - Assert.assertEquals("linux", testPluginConfiguration.getPlatforms().get(0).getOsName().get()); - Assert.assertEquals( - "amd64", testPluginConfiguration.getPlatforms().get(0).getArchitectureName().get()); - Assert.assertEquals("", testPluginConfiguration.getAppRoot()); - Assert.assertNull(testPluginConfiguration.getWorkingDirectory()); - Assert.assertTrue(testPluginConfiguration.getExtraClasspath().isEmpty()); - Assert.assertFalse(testPluginConfiguration.getExpandClasspathDependencies()); - Assert.assertEquals("exploded", testPluginConfiguration.getContainerizingMode()); - Assert.assertEquals("EPOCH_PLUS_SECOND", testPluginConfiguration.getFilesModificationTime()); - Assert.assertEquals("EPOCH", testPluginConfiguration.getCreationTime()); - Assert.assertTrue(testPluginConfiguration.getInjectedPluginExtensions().isEmpty()); + assertThat(testPluginConfiguration.getPlatforms().get(0).getOsName()).hasValue("linux"); + assertThat(testPluginConfiguration.getPlatforms().get(0).getArchitectureName()) + .hasValue("amd64"); + assertThat(testPluginConfiguration.getAppRoot()).isEmpty(); + assertThat(testPluginConfiguration.getWorkingDirectory()).isNull(); + assertThat(testPluginConfiguration.getExtraClasspath()).isEmpty(); + assertThat(testPluginConfiguration.getExpandClasspathDependencies()).isFalse(); + assertThat(testPluginConfiguration.getContainerizingMode()).isEqualTo("exploded"); + assertThat(testPluginConfiguration.getFilesModificationTime()).isEqualTo("EPOCH_PLUS_SECOND"); + assertThat(testPluginConfiguration.getCreationTime()).isEqualTo("EPOCH"); + assertThat(testPluginConfiguration.getInjectedPluginExtensions()).isEmpty(); } @Test public void testSystemProperties() { sessionProperties.put("jib.from.image", "fromImage"); - Assert.assertEquals("fromImage", testPluginConfiguration.getBaseImage()); + assertThat(testPluginConfiguration.getBaseImage()).isEqualTo("fromImage"); sessionProperties.put("jib.from.credHelper", "credHelper"); - Assert.assertEquals("credHelper", testPluginConfiguration.getBaseImageCredentialHelperName()); + assertThat(testPluginConfiguration.getBaseImageCredentialHelperName()).isEqualTo("credHelper"); sessionProperties.put("jib.from.platforms", "linux/amd64,darwin/arm64"); - Assert.assertEquals(2, testPluginConfiguration.getPlatforms().size()); - assertPlatformIs("linux", "amd64", testPluginConfiguration.getPlatforms().get(0)); - assertPlatformIs("darwin", "arm64", testPluginConfiguration.getPlatforms().get(1)); + List platforms = testPluginConfiguration.getPlatforms(); + assertThat(platforms).hasSize(2); + assertThat(platforms.get(0).getOsName()).hasValue("linux"); + assertThat(platforms.get(0).getArchitectureName()).hasValue("amd64"); + assertThat(platforms.get(1).getOsName()).hasValue("darwin"); + assertThat(platforms.get(1).getArchitectureName()).hasValue("arm64"); sessionProperties.put("image", "toImage"); - Assert.assertEquals("toImage", testPluginConfiguration.getTargetImage()); + assertThat(testPluginConfiguration.getTargetImage()).isEqualTo("toImage"); sessionProperties.remove("image"); sessionProperties.put("jib.to.image", "toImage2"); - Assert.assertEquals("toImage2", testPluginConfiguration.getTargetImage()); + assertThat(testPluginConfiguration.getTargetImage()).isEqualTo("toImage2"); sessionProperties.put("jib.to.tags", "tag1,tag2,tag3"); - Assert.assertEquals( - ImmutableSet.of("tag1", "tag2", "tag3"), - testPluginConfiguration.getTargetImageAdditionalTags()); + assertThat(testPluginConfiguration.getTargetImageAdditionalTags()) + .containsExactly("tag1", "tag2", "tag3"); sessionProperties.put("jib.to.credHelper", "credHelper"); - Assert.assertEquals("credHelper", testPluginConfiguration.getTargetImageCredentialHelperName()); + assertThat(testPluginConfiguration.getTargetImageCredentialHelperName()) + .isEqualTo("credHelper"); sessionProperties.put("jib.container.appRoot", "appRoot"); - Assert.assertEquals("appRoot", testPluginConfiguration.getAppRoot()); + assertThat(testPluginConfiguration.getAppRoot()).isEqualTo("appRoot"); sessionProperties.put("jib.container.args", "arg1,arg2,arg3"); - Assert.assertEquals( - ImmutableList.of("arg1", "arg2", "arg3"), testPluginConfiguration.getArgs()); + assertThat(testPluginConfiguration.getArgs()).containsExactly("arg1", "arg2", "arg3").inOrder(); sessionProperties.put("jib.container.entrypoint", "entry1,entry2,entry3"); - Assert.assertEquals( - ImmutableList.of("entry1", "entry2", "entry3"), testPluginConfiguration.getEntrypoint()); + assertThat(testPluginConfiguration.getEntrypoint()) + .containsExactly("entry1", "entry2", "entry3") + .inOrder(); sessionProperties.put("jib.container.environment", "env1=val1,env2=val2"); - Assert.assertEquals( - ImmutableMap.of("env1", "val1", "env2", "val2"), testPluginConfiguration.getEnvironment()); + assertThat(testPluginConfiguration.getEnvironment()) + .containsExactly("env1", "val1", "env2", "val2") + .inOrder(); sessionProperties.put("jib.container.format", "format"); - Assert.assertEquals("format", testPluginConfiguration.getFormat()); + assertThat(testPluginConfiguration.getFormat()).isEqualTo("format"); sessionProperties.put("jib.container.jvmFlags", "flag1,flag2,flag3"); - Assert.assertEquals( - ImmutableList.of("flag1", "flag2", "flag3"), testPluginConfiguration.getJvmFlags()); + assertThat(testPluginConfiguration.getJvmFlags()) + .containsExactly("flag1", "flag2", "flag3") + .inOrder(); sessionProperties.put("jib.container.labels", "label1=val1,label2=val2"); - Assert.assertEquals( - ImmutableMap.of("label1", "val1", "label2", "val2"), testPluginConfiguration.getLabels()); + assertThat(testPluginConfiguration.getLabels()) + .containsExactly("label1", "val1", "label2", "val2") + .inOrder(); sessionProperties.put("jib.container.mainClass", "main"); - Assert.assertEquals("main", testPluginConfiguration.getMainClass()); + assertThat(testPluginConfiguration.getMainClass()).isEqualTo("main"); sessionProperties.put("jib.container.ports", "port1,port2,port3"); - Assert.assertEquals( - ImmutableList.of("port1", "port2", "port3"), testPluginConfiguration.getExposedPorts()); + assertThat(testPluginConfiguration.getExposedPorts()) + .containsExactly("port1", "port2", "port3") + .inOrder(); + ; sessionProperties.put("jib.container.user", "myUser"); - Assert.assertEquals("myUser", testPluginConfiguration.getUser()); + assertThat(testPluginConfiguration.getUser()).isEqualTo("myUser"); sessionProperties.put("jib.container.workingDirectory", "/working/directory"); - Assert.assertEquals("/working/directory", testPluginConfiguration.getWorkingDirectory()); + assertThat(testPluginConfiguration.getWorkingDirectory()).isEqualTo("/working/directory"); sessionProperties.put("jib.container.filesModificationTime", "2011-12-03T22:42:05Z"); - Assert.assertEquals("2011-12-03T22:42:05Z", testPluginConfiguration.getFilesModificationTime()); + assertThat(testPluginConfiguration.getFilesModificationTime()) + .isEqualTo("2011-12-03T22:42:05Z"); sessionProperties.put("jib.container.creationTime", "2011-12-03T22:42:05Z"); - Assert.assertEquals("2011-12-03T22:42:05Z", testPluginConfiguration.getCreationTime()); + assertThat(testPluginConfiguration.getCreationTime()).isEqualTo("2011-12-03T22:42:05Z"); sessionProperties.put("jib.container.extraClasspath", "/foo,/bar"); - Assert.assertEquals( - ImmutableList.of("/foo", "/bar"), testPluginConfiguration.getExtraClasspath()); + assertThat(testPluginConfiguration.getExtraClasspath()) + .containsExactly("/foo", "/bar") + .inOrder(); sessionProperties.put("jib.container.expandClasspathDependencies", "true"); - Assert.assertTrue(testPluginConfiguration.getExpandClasspathDependencies()); + assertThat(testPluginConfiguration.getExpandClasspathDependencies()).isTrue(); sessionProperties.put("jib.containerizingMode", "packaged"); - Assert.assertEquals("packaged", testPluginConfiguration.getContainerizingMode()); + assertThat(testPluginConfiguration.getContainerizingMode()).isEqualTo("packaged"); sessionProperties.put("jib.dockerClient.executable", "test-exec"); - Assert.assertEquals( - Paths.get("test-exec"), testPluginConfiguration.getDockerClientExecutable()); + assertThat(testPluginConfiguration.getDockerClientExecutable()) + .isEqualTo(Paths.get("test-exec")); sessionProperties.put("jib.dockerClient.environment", "env1=val1,env2=val2"); - Assert.assertEquals( - ImmutableMap.of("env1", "val1", "env2", "val2"), - testPluginConfiguration.getDockerClientEnvironment()); - } - - private void assertPlatformIs( - String osName, - String architecture, - JibPluginConfiguration.PlatformParameters platformParameters) { - Assert.assertTrue(platformParameters.getOsName().isPresent()); - Assert.assertEquals(osName, platformParameters.getOsName().get()); - Assert.assertTrue(platformParameters.getArchitectureName().isPresent()); - Assert.assertEquals(architecture, platformParameters.getArchitectureName().get()); + assertThat(testPluginConfiguration.getDockerClientEnvironment()) + .containsExactly("env1", "val1", "env2", "val2") + .inOrder(); } @Test public void testSystemPropertiesWithInvalidPlatform() { sessionProperties.put("jib.from.platforms", "linux /amd64"); - Assert.assertThrows(IllegalArgumentException.class, testPluginConfiguration::getPlatforms); + assertThrows(IllegalArgumentException.class, testPluginConfiguration::getPlatforms); } @Test public void testSystemPropertiesExtraDirectories() { sessionProperties.put("jib.extraDirectories.paths", "custom-jib"); - Assert.assertEquals(1, testPluginConfiguration.getExtraDirectories().size()); - Assert.assertEquals( - Paths.get("custom-jib"), testPluginConfiguration.getExtraDirectories().get(0).getFrom()); - Assert.assertEquals("/", testPluginConfiguration.getExtraDirectories().get(0).getInto()); + assertThat(testPluginConfiguration.getExtraDirectories()).hasSize(1); + assertThat(testPluginConfiguration.getExtraDirectories().get(0).getFrom()) + .isEqualTo(Paths.get("custom-jib")); + assertThat(testPluginConfiguration.getExtraDirectories().get(0).getInto()).isEqualTo("/"); sessionProperties.put("jib.extraDirectories.permissions", "/test/file1=123,/another/file=456"); List permissions = testPluginConfiguration.getExtraDirectoryPermissions(); - Assert.assertEquals("/test/file1", permissions.get(0).getFile().get()); - Assert.assertEquals("123", permissions.get(0).getMode().get()); - Assert.assertEquals("/another/file", permissions.get(1).getFile().get()); - Assert.assertEquals("456", permissions.get(1).getMode().get()); + assertThat(permissions.get(0).getFile()).hasValue("/test/file1"); + assertThat(permissions.get(0).getMode()).hasValue("123"); + assertThat(permissions.get(1).getFile()).hasValue("/another/file"); + assertThat(permissions.get(1).getMode()).hasValue("456"); } @Test public void testSystemPropertiesOutputPaths() { // Absolute paths sessionProperties.put("jib.outputPaths.digest", "/digest/path"); - Assert.assertEquals(Paths.get("/digest/path"), testPluginConfiguration.getDigestOutputPath()); + assertThat(testPluginConfiguration.getDigestOutputPath()).isEqualTo(Paths.get("/digest/path")); sessionProperties.put("jib.outputPaths.imageId", "/id/path"); - Assert.assertEquals(Paths.get("/id/path"), testPluginConfiguration.getImageIdOutputPath()); + assertThat(testPluginConfiguration.getImageIdOutputPath()).isEqualTo(Paths.get("/id/path")); sessionProperties.put("jib.outputPaths.tar", "/tar/path"); - Assert.assertEquals(Paths.get("/tar/path"), testPluginConfiguration.getTarOutputPath()); + assertThat(testPluginConfiguration.getTarOutputPath()).isEqualTo(Paths.get("/tar/path")); // Relative paths sessionProperties.put("jib.outputPaths.digest", "digest/path"); - Assert.assertEquals( - Paths.get("/repository/project/digest/path"), - testPluginConfiguration.getDigestOutputPath()); + assertThat(testPluginConfiguration.getDigestOutputPath()) + .isEqualTo(Paths.get("/repository/project/digest/path")); sessionProperties.put("jib.outputPaths.imageId", "id/path"); - Assert.assertEquals( - Paths.get("/repository/project/id/path"), testPluginConfiguration.getImageIdOutputPath()); + assertThat(testPluginConfiguration.getImageIdOutputPath()) + .isEqualTo(Paths.get("/repository/project/id/path")); sessionProperties.put("jib.outputPaths.imageJson", "json/path"); - Assert.assertEquals( - Paths.get("/repository/project/json/path"), - testPluginConfiguration.getImageJsonOutputPath()); + assertThat(testPluginConfiguration.getImageJsonOutputPath()) + .isEqualTo(Paths.get("/repository/project/json/path")); sessionProperties.put("jib.outputPaths.tar", "tar/path"); - Assert.assertEquals( - Paths.get("/repository/project/tar/path"), testPluginConfiguration.getTarOutputPath()); + assertThat(testPluginConfiguration.getTarOutputPath()) + .isEqualTo(Paths.get("/repository/project/tar/path")); } @Test public void testPomProperties() { project.getProperties().setProperty("jib.from.image", "fromImage"); - Assert.assertEquals("fromImage", testPluginConfiguration.getBaseImage()); + assertThat(testPluginConfiguration.getBaseImage()).isEqualTo("fromImage"); project.getProperties().setProperty("jib.from.credHelper", "credHelper"); - Assert.assertEquals("credHelper", testPluginConfiguration.getBaseImageCredentialHelperName()); + assertThat(testPluginConfiguration.getBaseImageCredentialHelperName()).isEqualTo("credHelper"); project.getProperties().setProperty("image", "toImage"); - Assert.assertEquals("toImage", testPluginConfiguration.getTargetImage()); + assertThat(testPluginConfiguration.getTargetImage()).isEqualTo("toImage"); project.getProperties().remove("image"); project.getProperties().setProperty("jib.to.image", "toImage2"); - Assert.assertEquals("toImage2", testPluginConfiguration.getTargetImage()); + assertThat(testPluginConfiguration.getTargetImage()).isEqualTo("toImage2"); project.getProperties().setProperty("jib.to.tags", "tag1,tag2,tag3"); - Assert.assertEquals( - ImmutableSet.of("tag1", "tag2", "tag3"), - testPluginConfiguration.getTargetImageAdditionalTags()); + assertThat(testPluginConfiguration.getTargetImageAdditionalTags()) + .containsExactly("tag1", "tag2", "tag3"); project.getProperties().setProperty("jib.to.credHelper", "credHelper"); - Assert.assertEquals("credHelper", testPluginConfiguration.getTargetImageCredentialHelperName()); + assertThat(testPluginConfiguration.getTargetImageCredentialHelperName()) + .isEqualTo("credHelper"); project.getProperties().setProperty("jib.container.appRoot", "appRoot"); - Assert.assertEquals("appRoot", testPluginConfiguration.getAppRoot()); + assertThat(testPluginConfiguration.getAppRoot()).isEqualTo("appRoot"); project.getProperties().setProperty("jib.container.args", "arg1,arg2,arg3"); - Assert.assertEquals( - ImmutableList.of("arg1", "arg2", "arg3"), testPluginConfiguration.getArgs()); + assertThat(testPluginConfiguration.getArgs()).containsExactly("arg1", "arg2", "arg3").inOrder(); project.getProperties().setProperty("jib.container.entrypoint", "entry1,entry2,entry3"); - Assert.assertEquals( - ImmutableList.of("entry1", "entry2", "entry3"), testPluginConfiguration.getEntrypoint()); + assertThat(testPluginConfiguration.getEntrypoint()) + .containsExactly("entry1", "entry2", "entry3") + .inOrder(); project.getProperties().setProperty("jib.container.environment", "env1=val1,env2=val2"); - Assert.assertEquals( - ImmutableMap.of("env1", "val1", "env2", "val2"), testPluginConfiguration.getEnvironment()); + assertThat(testPluginConfiguration.getEnvironment()) + .containsExactly("env1", "val1", "env2", "val2") + .inOrder(); project.getProperties().setProperty("jib.container.format", "format"); - Assert.assertEquals("format", testPluginConfiguration.getFormat()); + assertThat(testPluginConfiguration.getFormat()).isEqualTo("format"); project.getProperties().setProperty("jib.container.jvmFlags", "flag1,flag2,flag3"); - Assert.assertEquals( - ImmutableList.of("flag1", "flag2", "flag3"), testPluginConfiguration.getJvmFlags()); + assertThat(testPluginConfiguration.getJvmFlags()) + .containsExactly("flag1", "flag2", "flag3") + .inOrder(); project.getProperties().setProperty("jib.container.labels", "label1=val1,label2=val2"); - Assert.assertEquals( - ImmutableMap.of("label1", "val1", "label2", "val2"), testPluginConfiguration.getLabels()); + assertThat(testPluginConfiguration.getLabels()) + .containsExactly("label1", "val1", "label2", "val2") + .inOrder(); project.getProperties().setProperty("jib.container.mainClass", "main"); - Assert.assertEquals("main", testPluginConfiguration.getMainClass()); + assertThat(testPluginConfiguration.getMainClass()).isEqualTo("main"); project.getProperties().setProperty("jib.container.ports", "port1,port2,port3"); - Assert.assertEquals( - ImmutableList.of("port1", "port2", "port3"), testPluginConfiguration.getExposedPorts()); + assertThat(testPluginConfiguration.getExposedPorts()) + .containsExactly("port1", "port2", "port3") + .inOrder(); project.getProperties().setProperty("jib.container.user", "myUser"); - Assert.assertEquals("myUser", testPluginConfiguration.getUser()); + assertThat(testPluginConfiguration.getUser()).isEqualTo("myUser"); project.getProperties().setProperty("jib.container.workingDirectory", "/working/directory"); - Assert.assertEquals("/working/directory", testPluginConfiguration.getWorkingDirectory()); + assertThat(testPluginConfiguration.getWorkingDirectory()).isEqualTo("/working/directory"); project .getProperties() .setProperty("jib.container.filesModificationTime", "2011-12-03T22:42:05Z"); - Assert.assertEquals("2011-12-03T22:42:05Z", testPluginConfiguration.getFilesModificationTime()); + assertThat(testPluginConfiguration.getFilesModificationTime()) + .isEqualTo("2011-12-03T22:42:05Z"); project.getProperties().setProperty("jib.container.creationTime", "2011-12-03T22:42:05Z"); - Assert.assertEquals("2011-12-03T22:42:05Z", testPluginConfiguration.getCreationTime()); + assertThat(testPluginConfiguration.getCreationTime()).isEqualTo("2011-12-03T22:42:05Z"); project.getProperties().setProperty("jib.container.extraClasspath", "/foo,/bar"); - Assert.assertEquals( - ImmutableList.of("/foo", "/bar"), testPluginConfiguration.getExtraClasspath()); + assertThat(testPluginConfiguration.getExtraClasspath()) + .containsExactly("/foo", "/bar") + .inOrder(); project.getProperties().setProperty("jib.container.expandClasspathDependencies", "true"); - Assert.assertTrue(testPluginConfiguration.getExpandClasspathDependencies()); + assertThat(testPluginConfiguration.getExpandClasspathDependencies()).isTrue(); project.getProperties().setProperty("jib.containerizingMode", "packaged"); - Assert.assertEquals("packaged", testPluginConfiguration.getContainerizingMode()); + assertThat(testPluginConfiguration.getContainerizingMode()).isEqualTo("packaged"); project.getProperties().setProperty("jib.dockerClient.executable", "test-exec"); - Assert.assertEquals( - Paths.get("test-exec"), testPluginConfiguration.getDockerClientExecutable()); + assertThat(testPluginConfiguration.getDockerClientExecutable()) + .isEqualTo(Paths.get("test-exec")); project.getProperties().setProperty("jib.dockerClient.environment", "env1=val1,env2=val2"); - Assert.assertEquals( - ImmutableMap.of("env1", "val1", "env2", "val2"), - testPluginConfiguration.getDockerClientEnvironment()); + assertThat(testPluginConfiguration.getDockerClientEnvironment()) + .containsExactly("env1", "val1", "env2", "val2") + .inOrder(); } @Test public void testPomPropertiesExtraDirectories() { project.getProperties().setProperty("jib.extraDirectories.paths", "custom-jib"); - Assert.assertEquals(1, testPluginConfiguration.getExtraDirectories().size()); - Assert.assertEquals( - Paths.get("custom-jib"), testPluginConfiguration.getExtraDirectories().get(0).getFrom()); - Assert.assertEquals("/", testPluginConfiguration.getExtraDirectories().get(0).getInto()); + assertThat(testPluginConfiguration.getExtraDirectories()).hasSize(1); + assertThat(testPluginConfiguration.getExtraDirectories().get(0).getFrom()) + .isEqualTo(Paths.get("custom-jib")); + assertThat(testPluginConfiguration.getExtraDirectories().get(0).getInto()).isEqualTo("/"); project .getProperties() .setProperty("jib.extraDirectories.permissions", "/test/file1=123,/another/file=456"); List permissions = testPluginConfiguration.getExtraDirectoryPermissions(); - Assert.assertEquals("/test/file1", permissions.get(0).getFile().get()); - Assert.assertEquals("123", permissions.get(0).getMode().get()); - Assert.assertEquals("/another/file", permissions.get(1).getFile().get()); - Assert.assertEquals("456", permissions.get(1).getMode().get()); + assertThat(permissions.get(0).getFile()).hasValue("/test/file1"); + assertThat(permissions.get(0).getMode()).hasValue("123"); + assertThat(permissions.get(1).getFile()).hasValue("/another/file"); + assertThat(permissions.get(1).getMode()).hasValue("456"); } @Test public void testPomPropertiesOutputPaths() { project.getProperties().setProperty("jib.outputPaths.digest", "/digest/path"); - Assert.assertEquals(Paths.get("/digest/path"), testPluginConfiguration.getDigestOutputPath()); + assertThat(testPluginConfiguration.getDigestOutputPath()).isEqualTo(Paths.get("/digest/path")); project.getProperties().setProperty("jib.outputPaths.imageId", "/id/path"); - Assert.assertEquals(Paths.get("/id/path"), testPluginConfiguration.getImageIdOutputPath()); + assertThat(testPluginConfiguration.getImageIdOutputPath()).isEqualTo(Paths.get("/id/path")); project.getProperties().setProperty("jib.outputPaths.imageJson", "/json/path"); - Assert.assertEquals(Paths.get("/json/path"), testPluginConfiguration.getImageJsonOutputPath()); + assertThat(testPluginConfiguration.getImageJsonOutputPath()).isEqualTo(Paths.get("/json/path")); project.getProperties().setProperty("jib.outputPaths.tar", "tar/path"); - Assert.assertEquals( - Paths.get("/repository/project/tar/path"), testPluginConfiguration.getTarOutputPath()); + assertThat(testPluginConfiguration.getTarOutputPath()) + .isEqualTo(Paths.get("/repository/project/tar/path")); } @Test @@ -319,12 +324,11 @@ public void testEmptyOrNullTags() { // https://github.com/GoogleContainerTools/jib/issues/1534 // Maven turns empty tags into null entries, and its possible to have empty tags in jib.to.tags sessionProperties.put("jib.to.tags", "a,,b"); - try { - testPluginConfiguration.getTargetImageAdditionalTags(); - Assert.fail(); - } catch (IllegalArgumentException ex) { - Assert.assertEquals("jib.to.tags has empty tag", ex.getMessage()); - } + Exception ex = + assertThrows( + IllegalArgumentException.class, + () -> testPluginConfiguration.getTargetImageAdditionalTags()); + assertThat(ex.getMessage()).isEqualTo("jib.to.tags has empty tag"); } @Test @@ -332,10 +336,10 @@ public void testIsContainerizable_noProperty() { Properties projectProperties = project.getProperties(); projectProperties.remove("jib.containerize"); - Assert.assertTrue(testPluginConfiguration.isContainerizable()); + assertThat(testPluginConfiguration.isContainerizable()).isTrue(); projectProperties.setProperty("jib.containerize", ""); - Assert.assertTrue(testPluginConfiguration.isContainerizable()); + assertThat(testPluginConfiguration.isContainerizable()).isTrue(); } @Test @@ -345,10 +349,10 @@ public void testIsContainerizable_artifactId() { Properties projectProperties = project.getProperties(); projectProperties.setProperty("jib.containerize", ":artifact"); - Assert.assertTrue(testPluginConfiguration.isContainerizable()); + assertThat(testPluginConfiguration.isContainerizable()).isTrue(); projectProperties.setProperty("jib.containerize", ":artifact2"); - Assert.assertFalse(testPluginConfiguration.isContainerizable()); + assertThat(testPluginConfiguration.isContainerizable()).isFalse(); } @Test @@ -358,10 +362,10 @@ public void testIsContainerizable_groupAndArtifactId() { Properties projectProperties = project.getProperties(); projectProperties.setProperty("jib.containerize", "group:artifact"); - Assert.assertTrue(testPluginConfiguration.isContainerizable()); + assertThat(testPluginConfiguration.isContainerizable()).isTrue(); projectProperties.setProperty("jib.containerize", "group:artifact2"); - Assert.assertFalse(testPluginConfiguration.isContainerizable()); + assertThat(testPluginConfiguration.isContainerizable()).isFalse(); } @Test @@ -371,9 +375,9 @@ public void testIsContainerizable_directory() { Properties projectProperties = project.getProperties(); projectProperties.setProperty("jib.containerize", "project"); - Assert.assertTrue(testPluginConfiguration.isContainerizable()); + assertThat(testPluginConfiguration.isContainerizable()).isTrue(); projectProperties.setProperty("jib.containerize", "project2"); - Assert.assertFalse(testPluginConfiguration.isContainerizable()); + assertThat(testPluginConfiguration.isContainerizable()).isFalse(); } } From ecd28d9dab05089561c099258c4767923b5068f1 Mon Sep 17 00:00:00 2001 From: Chanseok Oh Date: Thu, 16 Dec 2021 12:55:37 -0500 Subject: [PATCH 7/7] Fix null comparison --- .../com/google/cloud/tools/jib/gradle/PlatformParameters.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java index 909cf946b3..7b65978e59 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/PlatformParameters.java @@ -83,7 +83,8 @@ public boolean equals(Object other) { return false; } PlatformParameters otherPlatform = (PlatformParameters) other; - return architecture.equals(otherPlatform.getArchitecture()) && os.equals(otherPlatform.getOs()); + return Objects.equals(architecture, otherPlatform.getArchitecture()) + && Objects.equals(os, otherPlatform.getOs()); } @Override