Skip to content

Commit 765e1b2

Browse files
committed
Introduce ApplicationManifestsBuildItem that holds all the manifests
available in a build
1 parent 5d094fa commit 765e1b2

File tree

3 files changed

+79
-20
lines changed

3 files changed

+79
-20
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.quarkus.deployment.sbom;
2+
3+
import java.util.Collection;
4+
5+
import io.quarkus.builder.item.SimpleBuildItem;
6+
import io.quarkus.sbom.ApplicationManifest;
7+
8+
/**
9+
* Application manifests collected in a build
10+
*/
11+
public final class ApplicationManifestsBuildItem extends SimpleBuildItem {
12+
13+
private final Collection<ApplicationManifest> manifests;
14+
15+
public ApplicationManifestsBuildItem(Collection<ApplicationManifest> manifests) {
16+
this.manifests = manifests;
17+
}
18+
19+
/**
20+
* Application manifests from which SBOMs can be generated.
21+
*
22+
* @return collected application manifests
23+
*/
24+
public Collection<ApplicationManifest> getManifests() {
25+
return manifests;
26+
}
27+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.quarkus.deployment.sbom;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import io.quarkus.deployment.annotations.BuildStep;
7+
import io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem;
8+
import io.quarkus.sbom.ApplicationManifest;
9+
10+
public class ApplicationManifestsBuildStep {
11+
12+
/**
13+
* Aggregates application manifest configurations and creates application manifests from which
14+
* SBOMs could be generated by SBOM generating build steps.
15+
*
16+
* @param artifactResultBuildItems artifact results
17+
* @return application manifests for SBOM generation
18+
*/
19+
@BuildStep
20+
public ApplicationManifestsBuildItem generate(List<ArtifactResultBuildItem> artifactResultBuildItems) {
21+
final List<ApplicationManifest> manifests = new ArrayList<>(artifactResultBuildItems.size());
22+
for (var artifactResult : artifactResultBuildItems) {
23+
var manifestConfig = artifactResult.getManifestConfig();
24+
if (manifestConfig != null) {
25+
manifests.add(ApplicationManifest.fromConfig(manifestConfig));
26+
}
27+
}
28+
return new ApplicationManifestsBuildItem(List.copyOf(manifests));
29+
}
30+
}

extensions/cyclonedx/deployment/src/main/java/io/quarkus/cyclonedx/deployment/CdxSbomBuildStep.java

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,49 @@
11
package io.quarkus.cyclonedx.deployment;
22

3-
import java.util.List;
4-
53
import io.quarkus.cyclonedx.generator.CycloneDxSbomGenerator;
64
import io.quarkus.deployment.annotations.BuildProducer;
75
import io.quarkus.deployment.annotations.BuildStep;
86
import io.quarkus.deployment.builditem.AppModelProviderBuildItem;
9-
import io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem;
107
import io.quarkus.deployment.pkg.builditem.OutputTargetBuildItem;
8+
import io.quarkus.deployment.sbom.ApplicationManifestsBuildItem;
119
import io.quarkus.deployment.sbom.SbomBuildItem;
12-
import io.quarkus.sbom.ApplicationManifest;
1310

1411
/**
1512
* Generates SBOMs for packaged applications if the corresponding config is enabled.
1613
* The API around this is still in development and will likely change in the near future.
1714
*/
1815
public class CdxSbomBuildStep {
1916

17+
/**
18+
* Generates CycloneDX SBOMs from application manifests.
19+
*
20+
* @param applicationManifestsBuildItem application manifests
21+
* @param outputTargetBuildItem build output
22+
* @param appModelProviderBuildItem application model provider
23+
* @param cdxSbomConfig CycloneDX SBOM generation configuration
24+
* @param sbomProducer SBOM build item producer
25+
*/
2026
@BuildStep
21-
public void generate(List<ArtifactResultBuildItem> artifactResultBuildItems,
27+
public void generate(ApplicationManifestsBuildItem applicationManifestsBuildItem,
2228
OutputTargetBuildItem outputTargetBuildItem,
2329
AppModelProviderBuildItem appModelProviderBuildItem,
2430
CycloneDxConfig cdxSbomConfig,
2531
BuildProducer<SbomBuildItem> sbomProducer) {
26-
if (cdxSbomConfig.skip()) {
32+
if (cdxSbomConfig.skip() || applicationManifestsBuildItem.getManifests().isEmpty()) {
2733
// until there is a proper way to request the desired build items as build outcome
2834
return;
2935
}
3036
var depInfoProvider = appModelProviderBuildItem.getDependencyInfoProvider().get();
31-
for (var artifactResult : artifactResultBuildItems) {
32-
var manifestConfig = artifactResult.getManifestConfig();
33-
if (manifestConfig != null) {
34-
var manifest = ApplicationManifest.fromConfig(manifestConfig);
35-
for (var sbom : CycloneDxSbomGenerator.newInstance()
36-
.setManifest(manifest)
37-
.setOutputDirectory(outputTargetBuildItem.getOutputDirectory())
38-
.setEffectiveModelResolver(depInfoProvider == null ? null : depInfoProvider.getMavenModelResolver())
39-
.setFormat(cdxSbomConfig.format())
40-
.setSchemaVersion(cdxSbomConfig.schemaVersion().orElse(null))
41-
.setIncludeLicenseText(cdxSbomConfig.includeLicenseText())
42-
.generate()) {
43-
sbomProducer.produce(new SbomBuildItem(sbom));
44-
}
37+
for (var manifest : applicationManifestsBuildItem.getManifests()) {
38+
for (var sbom : CycloneDxSbomGenerator.newInstance()
39+
.setManifest(manifest)
40+
.setOutputDirectory(outputTargetBuildItem.getOutputDirectory())
41+
.setEffectiveModelResolver(depInfoProvider == null ? null : depInfoProvider.getMavenModelResolver())
42+
.setFormat(cdxSbomConfig.format())
43+
.setSchemaVersion(cdxSbomConfig.schemaVersion().orElse(null))
44+
.setIncludeLicenseText(cdxSbomConfig.includeLicenseText())
45+
.generate()) {
46+
sbomProducer.produce(new SbomBuildItem(sbom));
4547
}
4648
}
4749
}

0 commit comments

Comments
 (0)