diff --git a/doc/changelog.md b/doc/changelog.md index 1b42ffd04..69f179658 100644 --- a/doc/changelog.md +++ b/doc/changelog.md @@ -1,6 +1,7 @@ # ChangeLog * **0.44-SNAPSHOT**: + - Make `--config` from buildx command string generation optional ([1673](https://github.com/fabric8io/docker-maven-plugin/pull/1673)) @robfrank * **0.43.1** (2023-07-28): - Resolve registry auth URL by registry ID ([1688](https://github.com/fabric8io/docker-maven-plugin/issues/1688)) @wajda diff --git a/src/main/java/io/fabric8/maven/docker/service/BuildXService.java b/src/main/java/io/fabric8/maven/docker/service/BuildXService.java index d55b89568..f9a32dc34 100644 --- a/src/main/java/io/fabric8/maven/docker/service/BuildXService.java +++ b/src/main/java/io/fabric8/maven/docker/service/BuildXService.java @@ -63,7 +63,14 @@ protected void useBuilder(ProjectPaths projectPaths, ImageConfiguration imag BuildDirs buildDirs = new BuildDirs(projectPaths, imageConfig.getName()); Path configPath = getDockerStateDir(imageConfig.getBuildConfiguration(), buildDirs); - List buildX = Arrays.asList("docker", "buildx"); + File[] configDirFiles = configPath.toFile().listFiles(); + List buildX = new ArrayList<>(); + buildX.add("docker"); + if (configDirFiles != null && configDirFiles.length > 0) { + buildX.add("--config"); + buildX.add(configPath.toString()); + } + buildX.add("buildx"); String builderName = createBuilder(configPath, buildX, imageConfig, buildDirs); Path configJson = configPath.resolve("config.json"); diff --git a/src/test/java/io/fabric8/maven/docker/service/BuildXServiceTest.java b/src/test/java/io/fabric8/maven/docker/service/BuildXServiceTest.java index bba8f2d07..13fbdf05b 100644 --- a/src/test/java/io/fabric8/maven/docker/service/BuildXServiceTest.java +++ b/src/test/java/io/fabric8/maven/docker/service/BuildXServiceTest.java @@ -1,16 +1,19 @@ package io.fabric8.maven.docker.service; +import java.io.IOException; +import java.nio.file.Files; import java.util.Arrays; import java.util.List; import java.io.File; -import java.nio.file.Path; import java.nio.file.Paths; -import org.junit.jupiter.api.Assertions; +import org.apache.maven.plugin.MojoExecutionException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.io.TempDir; +import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -28,6 +31,11 @@ import io.fabric8.maven.docker.config.BuildImageConfiguration; import io.fabric8.maven.docker.config.ImageConfiguration; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; + @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.WARN) class BuildXServiceTest { @@ -103,14 +111,55 @@ void testBuildForeignPlatforms() throws Exception { Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()); } - private void givenAnImageConfiguration(String... platforms) { + @Test + void useBuilder_whenConfigProvided_thenAddConfigOptionToBuildX(@TempDir File temporaryFolder) throws MojoExecutionException, IOException { + // Given + File dockerBuildKitToml = new File(temporaryFolder, "buildkitd.toml"); + Files.createFile(dockerBuildKitToml.toPath()); + BuildXService.Builder builder = Mockito.mock(BuildXService.Builder.class); + Mockito.doReturn(temporaryFolder.toPath()).when(buildx).getDockerStateDir(Mockito.any(), Mockito.any()); + givenAnImageConfiguration(new BuildXConfiguration.Builder() + .dockerStateDir(temporaryFolder.getAbsolutePath()) + .platforms(Arrays.asList(FOREIGN1, FOREIGN2)) + .build()); + + // When + buildx.useBuilder(projectPaths, imageConfig, configuredRegistry, authConfig, buildArchive, builder); + + // Then + ArgumentCaptor> buildXArgCaptor = ArgumentCaptor.forClass(List.class); + Mockito.verify(builder).useBuilder(buildXArgCaptor.capture(), anyString(), any(), eq(imageConfig), eq(configuredRegistry), eq(buildArchive)); + assertEquals(Arrays.asList("docker", "--config", temporaryFolder.getAbsolutePath(), "buildx"), buildXArgCaptor.getValue()); + } + + @Test + void useBuilder_whenNoConfigProvided_thenDoNotAddConfigOptionToBuildX() throws MojoExecutionException { + // Given + BuildXService.Builder builder = Mockito.mock(BuildXService.Builder.class); + givenAnImageConfiguration(new BuildXConfiguration.Builder() + .platforms(Arrays.asList(FOREIGN1, FOREIGN2)) + .build()); + + // When + buildx.useBuilder(projectPaths, imageConfig, configuredRegistry, authConfig, buildArchive, builder); + + // Then + ArgumentCaptor> buildXArgCaptor = ArgumentCaptor.forClass(List.class); + Mockito.verify(builder).useBuilder(buildXArgCaptor.capture(), anyString(), any(), eq(imageConfig), eq(configuredRegistry), eq(buildArchive)); + assertEquals(Arrays.asList("docker", "buildx"), buildXArgCaptor.getValue()); + } + private void givenAnImageConfiguration(String... platforms) { final BuildXConfiguration buildxConfig = new BuildXConfiguration.Builder() .platforms(Arrays.asList(platforms)) .build(); + givenAnImageConfiguration(buildxConfig); + } + + private void givenAnImageConfiguration(BuildXConfiguration buildXConfiguration) { final BuildImageConfiguration buildImageConfig = new BuildImageConfiguration.Builder() - .buildx(buildxConfig) + .buildx(buildXConfiguration) .build(); imageConfig = new ImageConfiguration.Builder()