diff --git a/CHANGELOG.md b/CHANGELOG.md index 22727fe760..378616ddc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Usage: * 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 +* Fix #2885: Provide a way to set labels on images defined by Generators * Fix #2901: Ensure Docker build arguments from properties are used during images pre-pulling ### 1.16.2 (2024-03-27) diff --git a/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc b/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc index 6d58940670..00c82f9776 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc @@ -35,6 +35,10 @@ or already added by a generator which has been run previously. The mode takes only effect when running in OpenShift mode. | `jkube.generator.fromMode` +| *labels* +| A comma separated list of additional labels you want to set on your image with +| `jkube.generator.labels` + | *name* | The Docker image name used when doing Docker builds. For OpenShift S2I builds its the name of the image stream. This can be a pattern as described in <>. The default is `%g/%a:%l`. Note that this flag would only work diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java index 07c21b54d1..4be4af3815 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java @@ -80,6 +80,9 @@ enum Config implements Configs.Config { FROM_MODE("fromMode", null), BUILDPACKS_BUILDER_IMAGE("buildpacksBuilderImage", null), + // Labels + LABELS("labels", null), + // Optional registry REGISTRY("registry", null), @@ -254,6 +257,18 @@ private boolean containsBuildConfiguration(List configs) { return false; } + + protected void addLabelsFromConfig(Map labels) { + String commaSeparatedLabels = getConfigWithFallback(Config.LABELS, "jkube.generator.labels", null); + if (StringUtils.isNotBlank(commaSeparatedLabels)) { + Map configLabels = Arrays.stream(commaSeparatedLabels.split(",")) + .map(envNameValue -> envNameValue.split("=")) + .filter(e -> e.length == 2) + .collect(Collectors.toMap(e -> e[0].trim(), e -> e[1].trim())); + labels.putAll(configLabels); + } + } + protected void addSchemaLabels(BuildConfiguration.BuildConfigurationBuilder buildBuilder, PrefixedLogger log) { final JavaProject project = getProject(); String docURL = project.getDocumentationUrl(); @@ -274,6 +289,8 @@ protected void addSchemaLabels(BuildConfiguration.BuildConfigurationBuilder buil labels.put(BuildLabelAnnotations.VERSION.value(), project.getVersion()); labels.put(BuildLabelAnnotations.SCHEMA_VERSION.value(), LABEL_SCHEMA_VERSION); + addLabelsFromConfig(labels); + try { Repository repository = GitUtil.getGitRepository(project.getBaseDirectory()); if (repository != null) { diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java index 67cbf7b5d7..13dce83ed5 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java @@ -17,6 +17,8 @@ import java.util.Collections; import java.util.List; import java.util.Properties; +import java.util.Map; +import java.util.LinkedHashMap; import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.generator.api.FromSelector; @@ -420,6 +422,23 @@ void addTagsFromProperty() { .containsExactlyInAnyOrder("tag-1", "tag-2", "other-tag"); } + @Test + @DisplayName("add labels from property") + void addLabelsFromProperty() { + when(ctx.getProject()).thenReturn(project); + BuildConfiguration.BuildConfigurationBuilder builder = BuildConfiguration.builder(); + properties.put("jkube.generator.labels", " label-1=a, label-2=b , invalid-label"); + Map extractedLabels = new LinkedHashMap<>(); + BaseGenerator generator = createGenerator(null); + generator.addLabelsFromConfig(extractedLabels); + assertThat(extractedLabels) + .hasSize(2) + .contains( + entry("label-1", "a"), + entry("label-2", "b") + ); + } + private void inKubernetes() { when(ctx.getRuntimeMode()).thenReturn(RuntimeMode.KUBERNETES); }