Skip to content

Commit

Permalink
feat (jkube-kit): add configuration option for overriding buildpack b…
Browse files Browse the repository at this point in the history
…uilder image

Add a field in ImageConfiguration's Build named `buildpacksBuilderImage`
that can be used by the user for configuring buildpack builder image.
This field would also be exposed via `jkube.generator.buildpacksBuilderImage` property and
generators `buildpacksBuilderImage` config
  • Loading branch information
rohanKanojia committed Apr 24, 2024
1 parent f9b57bc commit d9d630b
Show file tree
Hide file tree
Showing 10 changed files with 66 additions and 14 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Usage:
* Fix #2335: Add support for configuring nodeSelector spec for controller via xml/groovy DSL configuration
* Fix #2459: Allow configuring Buildpacks build via ImageConfiguration
* Fix #2462: `k8s:debug` throws error when using `buildpacks` build strategy
* Fix #2470: Add configuration option for overriding buildpack builder image
* Fix #2662: Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation
* Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,13 @@ public class BuildConfiguration implements Serializable {
@Singular("addCacheFrom")
private List<String> cacheFrom;

/**
* Configure BuildPack <a href="https://buildpacks.io/docs/for-platform-operators/concepts/builder/">builder</a> OCI image for BuildPack Build.
* <p>
* This field is applicable for only <code>buildpacks</code> build strategy.
*/
private String buildpacksBuilderImage;

public boolean isDockerFileMode() {
return dockerFile != null || contextDir != null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ void rawDeserialization() throws IOException {
.hasFieldOrPropertyWithValue("filter", "@")
.hasFieldOrPropertyWithValue("from", "jkube-images/image:1337")
.hasFieldOrPropertyWithValue("fromExt", Collections.singletonMap("name", "jkube-images/image:ext"))
.hasFieldOrPropertyWithValue("buildpacksBuilderImage", "paketobuildpacks/builder:tiny")
.hasFieldOrPropertyWithValue("maintainer", "A-Team")
.hasFieldOrPropertyWithValue("ports", Collections.singletonList("8080"))
.hasFieldOrPropertyWithValue("shell.shell", "java -version")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"fromExt": {
"name": "jkube-images/image:ext"
},
"buildpacksBuilderImage": "paketobuildpacks/builder:tiny",
"maintainer": "A-Team",
"ports": ["8080"],
"shell": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.eclipse.jkube.kit.common.KitLogger;
import org.eclipse.jkube.kit.common.RegistryConfig;
import org.eclipse.jkube.kit.config.image.ImageConfiguration;
import org.eclipse.jkube.kit.config.image.build.BuildConfiguration;
import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy;
import org.eclipse.jkube.kit.config.service.AbstractImageBuildService;
import org.eclipse.jkube.kit.config.service.BuildServiceConfig;
Expand Down Expand Up @@ -69,14 +70,8 @@ protected void buildSingleImage(ImageConfiguration imageConfiguration) {
kitLogger.info("Delegating container image building process to BuildPacks");
final File packCli = buildPackCliDownloader.getPackCLIIfPresentOrDownload();
kitLogger.info("Using pack %s", packCli.getAbsolutePath());
final String builderImage;
final Properties localPackConfig =
readProperties(getUserHome().toPath().resolve(PACK_CONFIG_DIR).resolve(PACK_CONFIG_FILE));
if (localPackConfig.get("default-builder-image") != null) {
builderImage = strip(localPackConfig.getProperty("default-builder-image"), "\"");
} else {
builderImage = DEFAULT_BUILDER_IMAGE;
}
final String builderImage = getApplicableBuildPackBuilderImage(imageConfiguration.getBuild());

BuildPackBuildOptions.BuildPackBuildOptionsBuilder buildPackBuildOptionsBuilder = BuildPackBuildOptions.builder()
.imageName(imageConfiguration.getName())
.builderImage(builderImage)
Expand Down Expand Up @@ -114,4 +109,16 @@ public boolean isApplicable() {
public void postProcess() {
// NOOP
}

private String getApplicableBuildPackBuilderImage(BuildConfiguration buildConfiguration) {
final Properties localPackConfig =
readProperties(getUserHome().toPath().resolve(PACK_CONFIG_DIR).resolve(PACK_CONFIG_FILE));
if (buildConfiguration != null && StringUtils.isNotBlank(buildConfiguration.getBuildpacksBuilderImage())) {
return buildConfiguration.getBuildpacksBuilderImage();
} else if (localPackConfig.get("default-builder-image") != null) {
return strip(localPackConfig.getProperty("default-builder-image"), "\"");
} else {
return DEFAULT_BUILDER_IMAGE;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ void whenImageConfigurationContainsPackBuildArguments_thenArgumentsPassedToBuild
// Given
imageConfiguration = imageConfiguration.toBuilder()
.build(imageConfiguration.getBuild().toBuilder()
.buildpacksBuilderImage("paketobuildpacks/builder:tiny")
.imagePullPolicy("IfNotPresent")
.volumes(Collections.singletonList("/tmp/volume:/platform/volume:ro"))
.tags(Arrays.asList("t1", "t2", "t3"))
Expand All @@ -216,7 +217,7 @@ void whenImageConfigurationContainsPackBuildArguments_thenArgumentsPassedToBuild
buildPackBuildService.buildSingleImage(imageConfiguration);

// Then
verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder paketobuildpacks/builder:base --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true");
verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder paketobuildpacks/builder:tiny --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true");
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@ ifeval::["{goal-prefix}" == "oc"]
In case of an <<build-openshift,S2I Binary build>> this parameter specifies the S2I Builder Image to use, which by default is `fabric8/s2i-java:latest`. See also <<build-config-from-ext,from-ext>> how to add additional properties for the base image.
endif::[]

| *buildpacksBuilderImage*
| Configure https://buildpacks.io/docs/for-platform-operators/concepts/builder/[BuildPack builder] OCI image for BuildPack Build. This field is applicable only in `buildpacks` build strategy. This overrides builder image specified in local `~/.pack/config.toml`. If not specified this defaults to `null`.

This field is only applicable for `buildpacks` build strategy.

| [[build-config-from-ext]]**fromExt**
a| Extended definition for a base image. This field holds a map of defined in `key = "value"` format. The known keys are:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ or already added by a generator which has been run previously.
| *tags*
| A comma separated list of additional tags you want to tag your image with
| `jkube.generator.tags`

| *buildpacksBuilderImage*
| Configure https://buildpacks.io/docs/for-platform-operators/concepts/builder/[BuildPack builder] OCI image for BuildPack Build. This field is applicable only in `buildpacks` build strategy.
Defaults to `paketobuildpacks/builder:base`
| `jkube.generator.buildpacksBuilderImage`
|===

When used as properties they can be directly referenced with the property names above.
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ enum Config implements Configs.Config {

// Base image mode (only relevant for OpenShift)
FROM_MODE("fromMode", null),
BUILDPACKS_BUILDER_IMAGE("buildpacksBuilderImage", null),

// Optional registry
REGISTRY("registry", null),
Expand Down Expand Up @@ -133,6 +134,10 @@ protected String getFromAsConfigured() {
return getConfigWithFallback(Config.FROM, "jkube.generator.from", null);
}

protected String getBuildpacksBuilderImageAsConfigured() {
return getConfigWithFallback(Config.BUILDPACKS_BUILDER_IMAGE, "jkube.generator.buildpacksBuilderImage", null);
}

/**
* Add the base image either from configuration or from a given selector
*
Expand All @@ -141,6 +146,7 @@ protected String getFromAsConfigured() {
protected void addFrom(BuildConfiguration.BuildConfigurationBuilder builder) {
String fromMode = getConfigWithFallback(Config.FROM_MODE, "jkube.generator.fromMode", "docker");
String from = getFromAsConfigured();
builder.buildpacksBuilderImage(getBuildpacksBuilderImageAsConfigured());
if ("docker".equalsIgnoreCase(fromMode)) {
String fromImage = from;
if (fromImage == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@
*/
package org.eclipse.jkube.generator.api.support;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
Expand All @@ -35,7 +31,6 @@
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
import static org.assertj.core.api.AssertionsForClassTypes.entry;
Expand Down Expand Up @@ -96,6 +91,29 @@ void fromAsConfiguredWithPropertiesShouldReturnValueInProperties() {
assertThat(result).isEqualTo("fromInProperties");
}

@Test
@DisplayName("get buildpacksBuilderImageAsConfigured as configured with properties and configuration, should return configured")
void buildpacksBuilderImageConfiguredWithPropertiesAndConfigurationShouldReturnConfig() {
// Given
properties.put("jkube.generator.buildpacksBuilderImage", "buildPackBuilderViaProperties");
config.getConfig().put("test-generator", Collections.singletonMap("buildpacksBuilderImage", "buildPackBuilderViaConfig"));
// When
final String result = new TestBaseGenerator(ctx, "test-generator").getBuildpacksBuilderImageAsConfigured();
// Then
assertThat(result).isEqualTo("buildPackBuilderViaConfig");
}

@Test
@DisplayName("get buildpacksBuilderImage as configured with properties, should return value in properties")
void buildpacksBuilderImageAsConfiguredAsConfiguredWithPropertiesShouldReturnValueInProperties() {
// Given
properties.put("jkube.generator.buildpacksBuilderImage", "buildPackBuilderViaProperties");
// When
final String result = new TestBaseGenerator(ctx, "test-generator").getBuildpacksBuilderImageAsConfigured();
// Then
assertThat(result).isEqualTo("buildPackBuilderViaProperties");
}

@Test
@DisplayName("get image name with properties and configuration, should return configured")
void getImageNameWithPropertiesAndConfigurationShouldReturnConfigured() {
Expand Down

0 comments on commit d9d630b

Please sign in to comment.