From 0bbe9ba8e0866a378c4eb86157a130a8c06f0efe Mon Sep 17 00:00:00 2001 From: NathanFallet Date: Tue, 1 Jul 2025 16:06:24 +0200 Subject: [PATCH 1/3] Configurable Gradle SourceSet --- .../tools/jib/gradle/BuildDockerTask.java | 3 ++- .../tools/jib/gradle/BuildImageTask.java | 3 ++- .../cloud/tools/jib/gradle/BuildTarTask.java | 8 +++++-- .../jib/gradle/GradleProjectProperties.java | 23 +++++++++++-------- .../cloud/tools/jib/gradle/JibExtension.java | 9 ++++++++ .../cloud/tools/jib/gradle/JibPlugin.java | 2 +- .../jib/gradle/skaffold/FilesTaskV2.java | 5 +++- .../jib/gradle/skaffold/SyncMapTask.java | 3 ++- .../GradleProjectPropertiesExtensionTest.java | 4 +++- .../gradle/GradleProjectPropertiesTest.java | 12 +++++++--- .../jib/plugins/common/PropertyNames.java | 1 + 11 files changed, 53 insertions(+), 20 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildDockerTask.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildDockerTask.java index 692449db03..99ae393dab 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildDockerTask.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildDockerTask.java @@ -111,7 +111,8 @@ public void buildDocker() getProject(), getLogger(), tempDirectoryProvider, - jibExtension.getConfigurationName().get()); + jibExtension.getConfigurationName().get(), + jibExtension.getSourceSetName().get()); GlobalConfig globalConfig = GlobalConfig.readConfig(); Future> updateCheckFuture = TaskCommon.newUpdateChecker(projectProperties, globalConfig, getLogger()); diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildImageTask.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildImageTask.java index 49265559a6..d4a317fad2 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildImageTask.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildImageTask.java @@ -99,7 +99,8 @@ public void buildImage() getProject(), getLogger(), tempDirectoryProvider, - jibExtension.getConfigurationName().get()); + jibExtension.getConfigurationName().get(), + jibExtension.getSourceSetName().get()); GlobalConfig globalConfig = GlobalConfig.readConfig(); Future> updateCheckFuture = TaskCommon.newUpdateChecker(projectProperties, globalConfig, getLogger()); diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildTarTask.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildTarTask.java index 1a77856b6b..d770b92832 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildTarTask.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/BuildTarTask.java @@ -94,7 +94,10 @@ public FileCollection getInputFiles() { .map(ExtraDirectoryParameters::getFrom) .collect(Collectors.toList()); return GradleProjectProperties.getInputFiles( - getProject(), extraDirectories, jibExtension.getConfigurationName().get()); + getProject(), + extraDirectories, + jibExtension.getConfigurationName().get(), + jibExtension.getSourceSetName().get()); } /** @@ -130,7 +133,8 @@ public void buildTar() getProject(), getLogger(), tempDirectoryProvider, - jibExtension.getConfigurationName().get()); + jibExtension.getConfigurationName().get(), + jibExtension.getSourceSetName().get()); GlobalConfig globalConfig = GlobalConfig.readConfig(); Future> updateCheckFuture = TaskCommon.newUpdateChecker(projectProperties, globalConfig, getLogger()); diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java index 6a1978fe19..28ce73a8ef 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/GradleProjectProperties.java @@ -94,9 +94,6 @@ public class GradleProjectProperties implements ProjectProperties { /** Used for logging during main class inference. */ private static final String JAR_PLUGIN_NAME = "'jar' task"; - /** Name of the `main` {@link SourceSet} to use as source files. */ - private static final String MAIN_SOURCE_SET_NAME = "main"; - private static final Duration LOGGING_THREAD_SHUTDOWN_TIMEOUT = Duration.ofSeconds(1); /** @@ -107,13 +104,15 @@ public class GradleProjectProperties implements ProjectProperties { * @param tempDirectoryProvider for scratch space during the build * @param configurationName the configuration of which the dependencies should be packed into the * container + * @param sourceSetName the name of the source set which should be packed into the container * @return a GradleProjectProperties instance to use in a jib build */ public static GradleProjectProperties getForProject( Project project, Logger logger, TempDirectoryProvider tempDirectoryProvider, - String configurationName) { + String configurationName, + String sourceSetName) { Supplier>> extensionLoader = () -> { List> extensions = new ArrayList<>(); @@ -124,7 +123,7 @@ public static GradleProjectProperties getForProject( return extensions; }; return new GradleProjectProperties( - project, logger, tempDirectoryProvider, extensionLoader, configurationName); + project, logger, tempDirectoryProvider, extensionLoader, configurationName, sourceSetName); } String getWarFilePath() { @@ -163,6 +162,7 @@ private static boolean isProgressFooterEnabled(Project project) { private final TempDirectoryProvider tempDirectoryProvider; private final Supplier>> extensionLoader; private final String configurationName; + private final String sourceSetName; @VisibleForTesting GradleProjectProperties( @@ -170,11 +170,13 @@ private static boolean isProgressFooterEnabled(Project project) { Logger logger, TempDirectoryProvider tempDirectoryProvider, Supplier>> extensionLoader, - String configurationName) { + String configurationName, + String sourceSetName) { this.project = project; this.tempDirectoryProvider = tempDirectoryProvider; this.extensionLoader = extensionLoader; this.configurationName = configurationName; + this.sourceSetName = sourceSetName; ConsoleLoggerBuilder consoleLoggerBuilder = (isProgressFooterEnabled(project) ? ConsoleLoggerBuilder.rich(singleThreadedExecutor, false) @@ -409,14 +411,17 @@ public boolean isWarProject() { */ @VisibleForTesting static FileCollection getInputFiles( - Project project, List extraDirectories, String configurationName) { + Project project, + List extraDirectories, + String configurationName, + String sourceSetName) { List dependencyFileCollections = new ArrayList<>(); dependencyFileCollections.add(project.getConfigurations().getByName(configurationName)); // Output directories (classes and resources) from main SourceSet are added // so that BuildTarTask picks up changes in these and do not skip task SourceSetContainer sourceSetContainer = project.getExtensions().getByType(SourceSetContainer.class); - SourceSet mainSourceSet = sourceSetContainer.getByName(MAIN_SOURCE_SET_NAME); + SourceSet mainSourceSet = sourceSetContainer.getByName(sourceSetName); dependencyFileCollections.add(mainSourceSet.getOutput()); extraDirectories.stream() @@ -547,6 +552,6 @@ private JibGradlePluginExtension findConfiguredExtension( private SourceSet getMainSourceSet() { SourceSetContainer sourceSetContainer = project.getExtensions().getByType(SourceSetContainer.class); - return sourceSetContainer.getByName(MAIN_SOURCE_SET_NAME); + return sourceSetContainer.getByName(sourceSetName); } } diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index fbcea4c006..5e04eef447 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -27,6 +27,7 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Nested; import org.gradle.api.tasks.Optional; +import org.gradle.api.tasks.SourceSet; /** * Plugin extension for {@link JibPlugin}. @@ -96,6 +97,7 @@ public class JibExtension { private final Property allowInsecureRegistries; private final Property containerizingMode; private final Property configurationName; + private final Property sourceSetName; private final ListProperty pluginExtensions; private final ExtensionParametersSpec extensionParametersSpec; @@ -126,6 +128,7 @@ public JibExtension(Project project) { objectFactory .property(String.class) .convention(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME); + sourceSetName = objectFactory.property(String.class).convention(SourceSet.MAIN_SOURCE_SET_NAME); } public void from(Action action) { @@ -241,6 +244,12 @@ public Property getConfigurationName() { return configurationName; } + @Input + @Optional + public Property getSourceSetName() { + return sourceSetName; + } + @Nested @Optional public ListProperty getPluginExtensions() { diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibPlugin.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibPlugin.java index 6f2d9d16d1..904b649f9c 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibPlugin.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibPlugin.java @@ -186,7 +186,7 @@ public void apply(Project project) { projectAfterEvaluation .getExtensions() .getByType(SourceSetContainer.class) - .getByName(SourceSet.MAIN_SOURCE_SET_NAME); + .getByName(jibExtension.getSourceSetName().get()); jibDependencies.add(mainSourceSet.getRuntimeClasspath()); jibDependencies.add( projectAfterEvaluation diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2.java index fc15b021cf..80900e30e7 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2.java @@ -158,14 +158,17 @@ private void addGradleFiles(Project project) { * @param project the project */ private void addProjectFiles(Project project) { + Preconditions.checkNotNull(jibExtension); + // Add build config, settings, etc. addGradleFiles(project); // Add sources + resources SourceSetContainer sourceSetContainer = project.getExtensions().findByType(SourceSetContainer.class); + String sourceSetName = jibExtension.getSourceSetName().get(); if (sourceSetContainer != null) { - SourceSet mainSourceSet = sourceSetContainer.findByName(SourceSet.MAIN_SOURCE_SET_NAME); + SourceSet mainSourceSet = sourceSetContainer.findByName(sourceSetName); if (mainSourceSet != null) { mainSourceSet .getAllSource() diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/SyncMapTask.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/SyncMapTask.java index 7d8d9e4b02..df2fd7a2bf 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/SyncMapTask.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/SyncMapTask.java @@ -55,7 +55,8 @@ public void listFilesAndTargets() { getProject(), getLogger(), tempDirectoryProvider, - jibExtension.getConfigurationName().get()); + jibExtension.getConfigurationName().get(), + jibExtension.getSourceSetName().get()); GradleRawConfiguration configuration = new GradleRawConfiguration(jibExtension); diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java index 63718ce0e5..6959fe7f7d 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesExtensionTest.java @@ -40,6 +40,7 @@ import org.gradle.api.logging.configuration.ConsoleOutput; import org.gradle.api.model.ObjectFactory; import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.tasks.SourceSet; import org.hamcrest.CoreMatchers; import org.hamcrest.MatcherAssert; import org.junit.Assert; @@ -238,7 +239,8 @@ public void setUp() { mockLogger, mockTempDirectoryProvider, () -> loadedExtensions, - JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME); + JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME, + SourceSet.MAIN_SOURCE_SET_NAME); } @Test diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesTest.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesTest.java index 7698228ab0..7618e8a5c9 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesTest.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/GradleProjectPropertiesTest.java @@ -69,6 +69,7 @@ import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.provider.Property; +import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.bundling.War; import org.gradle.jvm.tasks.Jar; import org.gradle.testfixtures.ProjectBuilder; @@ -168,7 +169,8 @@ public void setUp() throws URISyntaxException, IOException { mockLogger, mockTempDirectoryProvider, mockExtensionLoader, - JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME); + JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME, + SourceSet.MAIN_SOURCE_SET_NAME); } @Test @@ -219,7 +221,10 @@ public void testGetInputFiles() throws URISyntaxException { List extraDirectories = Arrays.asList(applicationDirectory.resolve("extra-directory")); FileCollection fileCollection = GradleProjectProperties.getInputFiles( - project, extraDirectories, JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME); + project, + extraDirectories, + JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME, + SourceSet.MAIN_SOURCE_SET_NAME); assertThat(fileCollection) .comparingElementsUsing(FILE_PATH_OF) @@ -341,7 +346,8 @@ public void testCreateContainerBuilder_noClassesFiles() mockLogger, mockTempDirectoryProvider, mockExtensionLoader, - JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME); + JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME, + SourceSet.MAIN_SOURCE_SET_NAME); gradleProjectProperties.createJibContainerBuilder( JavaContainerBuilder.from(RegistryImage.named("base")), ContainerizingMode.EXPLODED); diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java index 14e27c2ed3..e660da5d7c 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/PropertyNames.java @@ -59,6 +59,7 @@ public class PropertyNames { public static final String OUTPUT_PATHS_TAR = "jib.outputPaths.tar"; public static final String CONTAINERIZING_MODE = "jib.containerizingMode"; public static final String CONFIGURATION_NAME = "jib.configurationName"; + public static final String SOURCE_SET_NAME = "jib.sourceSetName"; public static final String SKIP = "jib.skip"; public static final String CONTAINERIZE = "jib.containerize"; From 80e175e4ae1a7c28d0292219ccdf0f628909ff94 Mon Sep 17 00:00:00 2001 From: Nathan Fallet Date: Tue, 1 Jul 2025 16:11:48 +0200 Subject: [PATCH 2/3] fix: check for property value for sourceSet name Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../com/google/cloud/tools/jib/gradle/JibExtension.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index 5e04eef447..7591939cdd 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -244,9 +244,15 @@ public Property getConfigurationName() { return configurationName; } + @Input + @Optional @Input @Optional public Property getSourceSetName() { + String property = System.getProperty(PropertyNames.SOURCE_SET_NAME); + if (property != null && !property.equals(sourceSetName.get())) { + sourceSetName.set(property); + } return sourceSetName; } From 993b12d25c25759f5b4756ba2617452da0685968 Mon Sep 17 00:00:00 2001 From: NathanFallet Date: Tue, 1 Jul 2025 16:13:01 +0200 Subject: [PATCH 3/3] fix: removed double annotations added by gemini --- .../java/com/google/cloud/tools/jib/gradle/JibExtension.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java index 7591939cdd..7089cc39e6 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/JibExtension.java @@ -244,8 +244,6 @@ public Property getConfigurationName() { return configurationName; } - @Input - @Optional @Input @Optional public Property getSourceSetName() {