Skip to content

Commit

Permalink
Allow having build args with same name but different value in various…
Browse files Browse the repository at this point in the history
… sources, which are overriden in the order of precedence in resulting build args map
  • Loading branch information
pavelsmolensky authored and rohanKanojia committed Sep 22, 2022
1 parent 694b146 commit 79a4a33
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 8 deletions.
1 change: 1 addition & 0 deletions doc/changelog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# ChangeLog
* **0.41-SNAPSHOT** :
- image/squash option is taken into account when using buildx ([1605](https://github.com/fabric8io/docker-maven-plugin/pull/1605)) @kevinleturc
- Allow having build args with same name but different value in various sources, which are overriden in the order of precedence in resulting build args map ([1407](https://github.com/fabric8io/docker-maven-plugin/issues/1407)) @pavelsmolensky

* **0.40.2** (2022-07-31):
- Plugin doesn't abort building an image in case Podman is used and Dockerfile can't be processed ([1562](https://github.com/fabric8io/docker-maven-plugin/issues/1512)) @jh-cd
Expand Down
15 changes: 9 additions & 6 deletions src/main/java/io/fabric8/maven/docker/service/BuildService.java
Original file line number Diff line number Diff line change
Expand Up @@ -298,12 +298,15 @@ private Map<String, String> addBuildArgs(BuildContext buildContext) {
Map<String, String> buildArgsFromProject = addBuildArgsFromProperties(buildContext.getMojoParameters().getProject().getProperties());
Map<String, String> buildArgsFromSystem = addBuildArgsFromProperties(System.getProperties());
Map<String, String> buildArgsFromDockerConfig = addBuildArgsFromDockerConfig();
return ImmutableMap.<String, String>builder()
.putAll(buildArgsFromDockerConfig)
.putAll(buildContext.getBuildArgs() != null ? buildContext.getBuildArgs() : Collections.<String, String>emptyMap())
.putAll(buildArgsFromProject)
.putAll(buildArgsFromSystem)
.build();

//merge build args from all the sources into one map. Different sources maps are allowed to contain duplicate keys between them
Map<String, String> mergedBuildArgs = new HashMap<>();
mergedBuildArgs.putAll(buildArgsFromDockerConfig);
mergedBuildArgs.putAll(buildContext.getBuildArgs() != null ? buildContext.getBuildArgs() : Collections.<String, String>emptyMap());
mergedBuildArgs.putAll(buildArgsFromProject);
mergedBuildArgs.putAll(buildArgsFromSystem);

return ImmutableMap.copyOf(mergedBuildArgs);
}

private Map<String, String> addBuildArgsFromProperties(Properties properties) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.maven.plugin.MojoExecutionException;
Expand All @@ -19,12 +21,10 @@
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;

import io.fabric8.maven.docker.access.BuildOptions;
import io.fabric8.maven.docker.access.DockerAccess;
import io.fabric8.maven.docker.access.DockerAccessException;
import io.fabric8.maven.docker.assembly.DockerAssemblyManager;
import io.fabric8.maven.docker.config.AssemblyConfiguration;
import io.fabric8.maven.docker.config.BuildImageConfiguration;
import io.fabric8.maven.docker.config.CleanupMode;
import io.fabric8.maven.docker.config.ImageConfiguration;
Expand Down Expand Up @@ -298,6 +298,37 @@ void tagImage_whenForceFalseAndNoDanglingTags_thenImageRemoved() throws DockerAc
verifyRemove("oldimage");
}

@Test
void testBuildArgsFromDifferentSources() throws MojoExecutionException, DockerAccessException {
//takes precedence over others
System.setProperty("docker.buildArg.http_proxy", "http://system-props.com");

Properties mavenProjectProps = new Properties();
mavenProjectProps.setProperty("docker.buildArg.http_proxy", "http://project-props.com");
Mockito.doReturn(mavenProjectProps).when(mavenProject).getProperties();
Mockito.doReturn(mavenProject).when(mojoParameters).getProject();

BuildImageConfiguration buildConfig = new BuildImageConfiguration.Builder().build();

imageConfig = new ImageConfiguration.Builder()
.name("build-image")
.alias("build-alias")
.buildConfig(buildConfig)
.build();

Map<String, String> buildArgs = new HashMap<>();
buildArgs.put("http_proxy", "http://build-context.com");

final BuildService.BuildContext buildContext = new BuildService.BuildContext.Builder()
.mojoParameters(mojoParameters).buildArgs(buildArgs)
.build();

File buildArchive = buildService.buildArchive(imageConfig, buildContext, "");
buildService.buildImage(imageConfig, null, buildContext, buildArchive);
Mockito.verify(docker).buildImage(Mockito.any(), Mockito.any(),
Mockito.argThat((BuildOptions options) -> options.getOptions().get("buildargs").equals("{\"http_proxy\":\"http://system-props.com\"}")));
}

private void givenAnImageConfiguration(String cleanup) {
BuildImageConfiguration buildConfig = new BuildImageConfiguration.Builder()
.cleanup(cleanup)
Expand Down

0 comments on commit 79a4a33

Please sign in to comment.