Skip to content

Commit 4e5d068

Browse files
fabric8io#1804 support buildx use of default builder
1 parent e980189 commit 4e5d068

File tree

2 files changed

+64
-32
lines changed

2 files changed

+64
-32
lines changed

src/main/java/io/fabric8/maven/docker/service/BuildXService.java

+23-19
Original file line numberDiff line numberDiff line change
@@ -245,27 +245,31 @@ protected void createDirectory(Path cachePath) {
245245
protected String createBuilder(Path configPath, List<String> buildX, ImageConfiguration imageConfig, BuildDirs buildDirs) throws MojoExecutionException {
246246
BuildXConfiguration buildXConfiguration = imageConfig.getBuildConfiguration().getBuildX();
247247
String builderName = Optional.ofNullable(buildXConfiguration.getBuilderName()).orElse("maven");
248-
String nodeName = buildXConfiguration.getNodeName();
249-
Path builderPath = configPath.resolve(Paths.get("buildx", "instances", builderName));
250-
if(Files.notExists(builderPath)) {
251-
List<String> cmds = new ArrayList<>(buildX);
252-
append(cmds, "create", "--driver", "docker-container", "--name", builderName);
253-
if (nodeName != null) {
254-
append(cmds, "--node", nodeName);
255-
}
248+
if ("default".equals(builderName)) {
249+
logger.info("Using default builder with buildx - only single platforms will be supported");
250+
} else {
251+
String nodeName = buildXConfiguration.getNodeName();
252+
Path builderPath = configPath.resolve(Paths.get("buildx", "instances", builderName));
253+
if(Files.notExists(builderPath)) {
254+
List<String> cmds = new ArrayList<>(buildX);
255+
append(cmds, "create", "--driver", "docker-container", "--name", builderName);
256+
if (nodeName != null) {
257+
append(cmds, "--node", nodeName);
258+
}
256259

257-
if (buildXConfiguration.getDriverOpts() != null && !buildXConfiguration.getDriverOpts().isEmpty()) {
258-
buildXConfiguration.getDriverOpts().forEach((key, value) -> append(cmds, "--driver-opt", key + '=' + value));
259-
}
260+
if (buildXConfiguration.getDriverOpts() != null && !buildXConfiguration.getDriverOpts().isEmpty()) {
261+
buildXConfiguration.getDriverOpts().forEach((key, value) -> append(cmds, "--driver-opt", key + '=' + value));
262+
}
260263

261-
String buildConfig = buildXConfiguration.getConfigFile();
262-
if(buildConfig != null) {
263-
append(cmds, "--config",
264-
buildDirs.getProjectPath(EnvUtil.resolveHomeReference(buildConfig)).toString());
265-
}
266-
int rc = exec.process(cmds);
267-
if (rc != 0) {
268-
throw new MojoExecutionException("Error status (" + rc + ") while creating builder " + builderName);
264+
String buildConfig = buildXConfiguration.getConfigFile();
265+
if (buildConfig != null) {
266+
append(cmds, "--config",
267+
buildDirs.getProjectPath(EnvUtil.resolveHomeReference(buildConfig)).toString());
268+
}
269+
int rc = exec.process(cmds);
270+
if (rc != 0) {
271+
throw new MojoExecutionException("Error status (" + rc + ") while creating builder " + builderName);
272+
}
269273
}
270274
}
271275
return builderName;

src/test/java/io/fabric8/maven/docker/BuildMojoTest.java

+41-13
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ void noSkipWhenNotPom() throws IOException, MojoExecutionException {
8686
}
8787

8888
@Test
89-
void buildUsingBuildx() throws IOException, MojoExecutionException {
89+
void buildUsingBuildxWithDockerContainerDriver() throws IOException, MojoExecutionException {
9090
givenBuildXService();
9191

9292
givenMavenProject(buildMojo);
@@ -98,6 +98,20 @@ void buildUsingBuildx() throws IOException, MojoExecutionException {
9898
thenBuildxRun(null, null, true, null );
9999
}
100100

101+
@Test
102+
void buildUsingBuildxWithDefaultDriver() throws IOException, MojoExecutionException {
103+
givenBuildXService();
104+
105+
givenMavenProject(buildMojo);
106+
ImageConfiguration imageConfiguration = singleBuildXImageWithDefaultBuilderName(null);
107+
givenResolvedImages(buildMojo, Collections.singletonList(imageConfiguration));
108+
givenPackaging("jar");
109+
110+
whenMojoExecutes();
111+
112+
thenBuildxRun(null, null, true, null, Collections.emptyList(), false);
113+
}
114+
101115
@Test
102116
void buildUsingConfiguredBuildx() throws IOException, MojoExecutionException {
103117
givenBuildXService();
@@ -269,7 +283,7 @@ void buildWithTagByBuildx(boolean skipTag) throws IOException, MojoExecutionExce
269283
List<String> fullTags = skipTag ? Collections.emptyList() : tags.stream()
270284
.map(tag -> new ImageName(imageConfiguration.getName(), tag).getFullName())
271285
.collect(Collectors.toList());
272-
thenBuildxRun(null, null, true, null, fullTags);
286+
thenBuildxRun(null, null, true, null, fullTags, true);
273287
}
274288

275289
@ParameterizedTest
@@ -348,30 +362,39 @@ private void verifyBuild(int wantedNumberOfInvocations) throws DockerAccessExcep
348362

349363
private void thenBuildxRun(String relativeConfigFile, String contextDir, boolean nativePlatformIncluded,
350364
String attestation) throws MojoExecutionException {
351-
thenBuildxRun(relativeConfigFile, contextDir, nativePlatformIncluded, attestation, Collections.emptyList());
365+
thenBuildxRun(relativeConfigFile, contextDir, nativePlatformIncluded, attestation, Collections.emptyList(), true);
352366
}
353367

354368
private void thenBuildxRun(String relativeConfigFile, String contextDir,
355-
boolean nativePlatformIncluded, String attestation, List<String> tags)
369+
boolean nativePlatformIncluded, String attestation, List<String> tags, boolean useMavenBuilder)
356370
throws MojoExecutionException {
357371
Path buildPath = projectBaseDirectory.toPath().resolve("target/docker/example/latest");
358372
String config = getOsDependentBuild(buildPath, "docker");
359373
String configFile =
360374
relativeConfigFile != null ? getOsDependentBuild(projectBaseDirectory.toPath(), relativeConfigFile) :
361375
null;
362376

363-
List<String> cmds =
364-
BuildXService.append(new ArrayList<>(), "docker", "--config", config, "buildx",
365-
"create", "--driver", "docker-container", "--name", "maven", "--node", "maven0");
366-
if (configFile != null) {
367-
BuildXService.append(cmds, "--config", configFile.replace('/', File.separatorChar));
377+
if (useMavenBuilder) {
378+
List<String> cmds =
379+
BuildXService.append(new ArrayList<>(), "docker", "--config", config, "buildx", "create",
380+
"--driver", "docker-container", "--name", "maven", "--node", "maven0");
381+
382+
if (configFile != null) {
383+
cmds = BuildXService.append(cmds, "--config", configFile.replace('/', File.separatorChar));
384+
}
385+
Mockito.verify(exec).process(cmds);
368386
}
369-
Mockito.verify(exec).process(cmds);
370387

371388
if (nativePlatformIncluded) {
372-
List<String> buildXLine = BuildXService.append(new ArrayList<>(), "docker", "--config", config, "buildx",
373-
"build", "--progress=plain", "--builder", "maven",
374-
"--platform", NATIVE_PLATFORM, "--tag", "example:latest");
389+
List<String> buildXLineInitial = BuildXService.append(new ArrayList<>(), "docker", "--config", config, "buildx",
390+
"build", "--progress=plain", "--builder");
391+
if (useMavenBuilder) {
392+
buildXLineInitial.add("maven");
393+
} else {
394+
buildXLineInitial.add("default");
395+
}
396+
397+
List<String> buildXLine = BuildXService.append(buildXLineInitial,"--platform", NATIVE_PLATFORM, "--tag", "example:latest");
375398

376399
tags.forEach(tag -> {
377400
buildXLine.add("--tag");
@@ -446,6 +469,11 @@ private ImageConfiguration singleBuildXImageWithAttestations(Boolean sbom, Strin
446469
.build(), null);
447470
}
448471

472+
private ImageConfiguration singleBuildXImageWithDefaultBuilderName(String configFile) {
473+
return singleImageConfiguration(getBuildXPlatforms(NATIVE_PLATFORM).configFile(configFile)
474+
.builderName("default").build(), null);
475+
}
476+
449477
protected ImageConfiguration singleImageWithAuthRegistry(String dockerFile) {
450478
BuildImageConfiguration buildImageConfiguration = new BuildImageConfiguration.Builder()
451479
.dockerFile(dockerFile)

0 commit comments

Comments
 (0)