Skip to content

Commit b6c9914

Browse files
committed
Configure Gradle's processResources to include the SBOM
This also configures the BootWar task to add the SBOM location to the manifest. Closes gh-40890
1 parent 87094ed commit b6c9914

File tree

1 file changed

+74
-9
lines changed
  • spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin

1 file changed

+74
-9
lines changed

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/CycloneDxPluginAction.java

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,17 @@
2121
import org.gradle.api.Action;
2222
import org.gradle.api.Plugin;
2323
import org.gradle.api.Project;
24+
import org.gradle.api.Task;
25+
import org.gradle.api.plugins.JavaPlugin;
26+
import org.gradle.api.plugins.JavaPluginExtension;
27+
import org.gradle.api.provider.Provider;
28+
import org.gradle.api.tasks.Copy;
29+
import org.gradle.api.tasks.SourceSet;
2430
import org.gradle.api.tasks.TaskProvider;
31+
import org.gradle.api.tasks.bundling.Jar;
2532

2633
import org.springframework.boot.gradle.tasks.bundling.BootJar;
34+
import org.springframework.boot.gradle.tasks.bundling.BootWar;
2735

2836
/**
2937
* {@link Action} that is executed in response to the {@link CycloneDxPlugin} being
@@ -40,24 +48,69 @@ public Class<? extends Plugin<? extends Project>> getPluginClass() {
4048

4149
@Override
4250
public void execute(Project project) {
43-
TaskProvider<CycloneDxTask> cyclonedxBom = project.getTasks().named("cyclonedxBom", CycloneDxTask.class);
44-
cyclonedxBom.configure((task) -> {
51+
TaskProvider<CycloneDxTask> cycloneDxTaskProvider = project.getTasks()
52+
.named("cyclonedxBom", CycloneDxTask.class);
53+
configureCycloneDxTask(cycloneDxTaskProvider);
54+
configureJavaPlugin(project, cycloneDxTaskProvider);
55+
configureSpringBootPlugin(project, cycloneDxTaskProvider);
56+
}
57+
58+
private void configureCycloneDxTask(TaskProvider<CycloneDxTask> taskProvider) {
59+
taskProvider.configure((task) -> {
4560
task.getProjectType().convention("application");
4661
task.getOutputFormat().convention("json");
4762
task.getOutputName().convention("application.cdx");
4863
task.getIncludeLicenseText().convention(false);
4964
});
50-
project.getTasks().named(SpringBootPlugin.BOOT_JAR_TASK_NAME, BootJar.class).configure((bootJar) -> {
51-
CycloneDxTask cycloneDxTask = cyclonedxBom.get();
52-
String sbomFileName = cycloneDxTask.getOutputName().get() + getSbomExtension(cycloneDxTask);
53-
bootJar.from(cycloneDxTask, (spec) -> spec.include(sbomFileName).into("META-INF/sbom"));
54-
bootJar.manifest((manifest) -> {
55-
manifest.getAttributes().put("Sbom-Format", "CycloneDX");
56-
manifest.getAttributes().put("Sbom-Location", "META-INF/sbom/" + sbomFileName);
65+
}
66+
67+
private void configureJavaPlugin(Project project, TaskProvider<CycloneDxTask> cycloneDxTaskProvider) {
68+
configurePlugin(project, JavaPlugin.class, (javaPlugin) -> {
69+
JavaPluginExtension javaPluginExtension = project.getExtensions().getByType(JavaPluginExtension.class);
70+
SourceSet main = javaPluginExtension.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME);
71+
configureTask(project, main.getProcessResourcesTaskName(), Copy.class, (copy) -> {
72+
copy.dependsOn(cycloneDxTaskProvider);
73+
Provider<String> sbomFileName = cycloneDxTaskProvider
74+
.map((cycloneDxTask) -> cycloneDxTask.getOutputName().get() + getSbomExtension(cycloneDxTask));
75+
copy.from(cycloneDxTaskProvider, (spec) -> spec.include(sbomFileName.get()).into("META-INF/sbom"));
5776
});
5877
});
5978
}
6079

80+
private void configureSpringBootPlugin(Project project, TaskProvider<CycloneDxTask> cycloneDxTaskProvider) {
81+
configurePlugin(project, SpringBootPlugin.class, (springBootPlugin) -> {
82+
configureBootJarTask(project, cycloneDxTaskProvider);
83+
configureBootWarTask(project, cycloneDxTaskProvider);
84+
});
85+
}
86+
87+
private void configureBootJarTask(Project project, TaskProvider<CycloneDxTask> cycloneDxTaskProvider) {
88+
configureTask(project, SpringBootPlugin.BOOT_JAR_TASK_NAME, BootJar.class,
89+
(bootJar) -> configureBootJarTask(bootJar, cycloneDxTaskProvider));
90+
}
91+
92+
private void configureBootWarTask(Project project, TaskProvider<CycloneDxTask> cycloneDxTaskProvider) {
93+
configureTask(project, SpringBootPlugin.BOOT_WAR_TASK_NAME, BootWar.class,
94+
(bootWar) -> configureBootWarTask(bootWar, cycloneDxTaskProvider));
95+
}
96+
97+
private void configureBootJarTask(BootJar task, TaskProvider<CycloneDxTask> cycloneDxTaskProvider) {
98+
configureJarTask(task, cycloneDxTaskProvider);
99+
}
100+
101+
private void configureBootWarTask(BootWar task, TaskProvider<CycloneDxTask> cycloneDxTaskProvider) {
102+
configureJarTask(task, cycloneDxTaskProvider);
103+
}
104+
105+
private void configureJarTask(Jar task, TaskProvider<CycloneDxTask> cycloneDxTaskProvider) {
106+
Provider<String> sbomFileName = cycloneDxTaskProvider.map((cycloneDxTask) -> "META-INF/sbom/"
107+
+ cycloneDxTask.getOutputName().get() + getSbomExtension(cycloneDxTask));
108+
task.manifest((manifest) -> {
109+
manifest.getAttributes().put("Sbom-Format", "CycloneDX");
110+
manifest.getAttributes().put("Sbom-Location", sbomFileName);
111+
});
112+
}
113+
61114
private String getSbomExtension(CycloneDxTask task) {
62115
String format = task.getOutputFormat().get();
63116
if ("all".equals(format)) {
@@ -66,4 +119,16 @@ private String getSbomExtension(CycloneDxTask task) {
66119
return "." + format;
67120
}
68121

122+
private <T extends Task> void configureTask(Project project, String name, Class<T> type, Action<T> action) {
123+
project.getTasks().withType(type).configureEach((task) -> {
124+
if (task.getName().equals(name)) {
125+
action.execute(task);
126+
}
127+
});
128+
}
129+
130+
private <T extends Plugin<?>> void configurePlugin(Project project, Class<T> plugin, Action<T> action) {
131+
project.getPlugins().withType(plugin, action);
132+
}
133+
69134
}

0 commit comments

Comments
 (0)