8000 Distribution SBOM generation by aloubyansky · Pull Request #51743 · keycloak/keycloak · GitHub
[go: up one dir, main page]

Skip to content

Distribution SBOM generation - #51743

Open
aloubyansky wants to merge 1 commit into
keycloak:mainfrom
aloubyansky:sbom
Open

aloubyansky wants to merge 1 commit into
keycloak:mainfrom
aloubyansky:sbom

Conversation

@aloubyansky
Copy link
Copy Markdown

This PR adds SBOM generation to the Keycloak distribution.
Fixes #9448

Given the distribution is assembled from builds of different modules, SBOM generation also consists of a few steps.

PNPM

The js module produces an SBOM using pnpm sbom. AFAICT, that's one of the best SBOM generators in the Node.js ecosystem.
I added --prod argument to exclude non-prod dependencies. Although it could be omitted, in which case non-prod dependencies will be added with scope excluded, which should indicate to the scanners that a package is not a part of runtime.

Quarkus

Given it's a Quarkus application, to get it accurately manifested, quarkus-cyclonedx extension was added as a dependency. It is however disabled in application.properties to not generate SBOMs on re-augmentation. But it is enabled for the Keycloak build itself.

The purpose of the Quarkus SBOM generator is to properly identify all the Maven artifacts that make up the Quarkus app.
Refer to https://quarkus.io/guides/cyclonedx for options but it should be good as-is.

Maven assembly

This is where the distribution is finalized. The SBOM here is generated with assembly-sbom-handler configured as a plugin into the assembly Maven plugin.
This SBOM generator tracks everything that gets packaged and takes the js and the quarkus SBOMs as extra sources of component information.

I added some comments on a few most relevant configuration options. Refer to https://github.com/cyberstamp/maven-assembly-sbom#assembly-handler for more.

I am not sure generating both embedded and external SBOMs at the same time is necessary but it was easy to check the results.

@aloubyansky
aloubyansky requested a review from a team as a code owner August 14, 2026 19:25
Copilot AI balanced review requested due to automatic review settings August 14, 2026 19:25
@aloubyansky
aloubyansky requested review from a team as code owners August 14, 2026 19:25
Comment thread js/package.json
@@ -2,7 +2,7 @@
"name": "root",
"private": true,
"type": "module",
"packageManager": "pnpm@11.1.1",
"packageManager": "pnpm@11.21.0",
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was necessary to get the latest pnpm sbom generator.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was necessary to get the latest pnpm sbom generator.

@edewit is this fine, please?

Copilot AI left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds CycloneDX SBOM generation to the Keycloak distribution.

Changes:

  • Generates JavaScript and Quarkus SBOM inputs.
  • Merges SBOM data while assembling distribution archives.
  • Updates pnpm to support SBOM generation.

Reviewed changes

Copilot reviewed 4 out of 6 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
quarkus/server/src/main/resources/application.properties Configures re-augmentation SBOM behavior.
quarkus/server/pom.xml Adds Quarkus CycloneDX generation.
quarkus/dist/pom.xml Registers the assembly SBOM handler.
quarkus/dist/assembly.xml Merges and packages SBOM data.
js/pom.xml Generates the JavaScript SBOM and updates pnpm.
js/package.json Updates the pinned pnpm version.
Suppressed comments (1)

quarkus/server/pom.xml:90

  • Pass the supported quarkus.cyclonedx.skip system property to override the true value in application.properties; enabled is ignored by the extension.
                        <quarkus.cyclonedx.enabled>${quarkus.cyclonedx.enabled}</quarkus.cyclonedx.enabled>

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.


# disable Quarkus SBOM generation by default, for re-augmentation specifically
quarkus.cyclonedx.enabled=false
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread quarkus/server/pom.xml
</dependencies>

<properties>
<!-- define this as a property, so it can still be overwritten on the CLI -->
<!-- direct the auto-created files to the target folder, so they are cleaned by "mvn clean" -->
<kc.home.dir>${project.build.directory}/kc</kc.home.dir>
<!-- Enable Quarkus SBOM generation for this build -->
<quarkus.cyclonedx.enabled>true</quarkus.cyclonedx.enabled>
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread js/pom.xml Outdated
<!-- Generate an SBOM for the NPM packages.
-prod argument excludes non-production dependencies. W/o it non-production dependencies
will be appear with scope 'excluded', meaning excluded from runtime -->
<arguments>sbom --sbom-format cyclonedx --prod --out ${project.build.directory}/js-sbom.cdx.json</arguments>
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Filtered those out

Copilot AI review requested due to automatic review settings August 15, 2026 20:12
Copilot AI left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 6 changed files in this pull request and generated no new comments.

Suppressed comments (2)

js/pom.xml:136

  • Grammar fix in comment: change 'will be appear' to 'will appear' for clarity.
                            <!-- Generate an SBOM for the NPM packages.
                                 -prod argument excludes non-production dependencies. W/o it non-production dependencies
                                 will be appear with scope 'excluded', meaning excluded from runtime -->

quarkus/server/src/main/resources/application.properties:10

  • This sets a module-wide default disabling CycloneDX in application.properties, while quarkus/server/pom.xml enables it via a Maven property/system property for the build. To avoid surprises for anyone invoking different build entrypoints (or re-augmentation flows) consider scoping the disable/enable to an explicit Maven/Quarkus profile (e.g., enable only in a dedicated build profile) rather than having conflicting defaults in resources vs. build configuration.
# disable Quarkus SBOM generation by default, for re-augmentation specifically
quarkus.cyclonedx.enabled=false

Copilot AI review requested due to automatic review settings August 15, 2026 20:13
Copilot AI left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 6 changed files in this pull request and generated no new comments.

Suppressed comments (1)

js/pom.xml:136

  • Grammar issue in the comment: will be appear should be will appear.
                                 -prod argument excludes non-production dependencies. W/o it non-production dependencies
                                 will be appear with scope 'excluded', meaning excluded from runtime -->

@VinodAnandan
Copy link
Copy Markdown
Contributor

@aloubyansky Thank you very much for the PR, much appreciated! Could you please sign off your commit correctly? It looks like the DCO check is currently failing. You can see the details here: https://github.com/keycloak/keycloak/pull/51743/checks?check_run_id=95063951285

@mabartos could you please start the action workflows ?

@mabartos
Copy link
Copy Markdown
Member

@keycloak/cloud-native Could you please check this? Thanks!

@michalvavrik michalvavrik left a comment
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you very much @aloubyansky . In order to pass DCO you need to sign-off the commit as mentioned above.

I was thinking if we need to follow-up (doesn't necessarily needs to be you) by publishing this SBOM somewhere, maybe as release artifact in GitHub?

I have also mentioned that the final SBOM has only 13 components with the scope, I am totally guessing, but maybe assembly-sbom-handler is dropping them?

I also found it tiny bit confusing calling a build-time dependencies "development". I kept thinking about DEV mode.

Comment thread js/pom.xml Resolved
Comment thread quarkus/server/pom.xml
@@ -50,12 +50,18 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-cyclonedx</artifactId>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@aloubyansky do I understand it right that this extension is not supported downstream https://code.quarkus.redhat.com/?e=cyclonedx&extension-search=cyclo ? Is there any plan to support it, maybe in 3.40 or 4.0?

@aloubyansky aloubyansky Aug 17, 2026 •
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question. I thought it had some support scope but apparently it doesn't. Probably because it's "build time only", which shouldn't matter.
It's been rebuilt from source though since 3.15
https://maven.repository.redhat.com/ga/io/quarkus/quarkus-cyclonedx/
https://maven.repository.redhat.com/ga/io/quarkus/quarkus-cyclonedx-deployment/

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question. I thought it had some support scope but apparently it doesn't. Probably because it's "build time only", which shouldn't matter. It's been rebuilt from source though since 3.15 https://maven.repository.redhat.com/ga/io/quarkus/quarkus-cyclonedx/ https://maven.repository.redhat.com/ga/io/quarkus/quarkus-cyclonedx-deployment/

Ok, thanks. I think it should be fine, but we need to hear from others or I'll ask around.

Comment thread quarkus/dist/pom.xml Outdated
<dependency>
<groupId>dev.cyberstamp.maven.assembly.sbom</groupId>
<artifactId>assembly-sbom-handler</artifactId>
<version>0.1.1</version>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know what is policy on this, so asking others here.

It seems very early dependency 0.1.1, but it was written by @aloubyansky https://github.com/cyberstamp/maven-assembly-sbom and it is only build time dependency for plugin, so it should be alright.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, I intend to support it. There are other projects, such as Artemis, that will integrate it.

@aloubyansky
Copy link
Copy Markdown
Author

Thank you very much @aloubyansky . In order to pass DCO you need to sign-off the commit as mentioned above.

Will do.

I was thinking if we need to follow-up (doesn't necessarily needs to be you) by publishing this SBOM somewhere, maybe as release artifact in GitHub?

There are a few options you can consider:

  • embed in the archive (enabled in this PR);
  • deploy as a Maven artifact (attach option in the handler) - it will be deployed along the distribution with the SBOM file extension as the artifact type;
  • as release artifact on GitHub, as you say, etc.

I have also mentioned that the final SBOM has only 13 components with the scope, I am totally guessing, but maybe assembly-sbom-handler is dropping them?
I also found it tiny bit confusing calling a build-time dependencies "development". I kept thinking about DEV mode.

That's a good observation, I'll look into that. FYI, Quarkus is moving away from custom scope properties in favor of CycloneDX excluded scope. It was released in 3.39.0.CR1 (quarkusio/quarkus#55668).
I'll look into properties merging anyway.

I'll generate and share a report of the resulting SBOM analysis

@michalvavrik
Copy link
Copy Markdown
Member

Alright, thanks for the context.

Copilot AI review requested due to automatic review settings August 17, 2026 13:38
Copilot AI left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 6 changed files in this pull request and generated no new comments.

@aloubyansky
Copy link
Copy Markdown
Author

The property merging is fixed now.

@aloubyansky
Copy link
Copy Markdown
Author

Keycloak Distribution SBOM Review

Overview

Field Value
Format CycloneDX 1.6
Main component org.keycloak:keycloak-quarkus-dist:999.0.0-SNAPSHOT (type: application)
Generator assembly-sbom-core:0.1.2
SBOM size 1,306 KB
Archives .zip.cdx.json, .tar.gz.cdx.json (external), bom.cdx.json (embedded in each archive)

The zip and tar.gz SBOMs have identical component sets; only the main component purl type qualifier differs (?type=zip vs ?type=tar.gz).

Component Inventory

Totals

Top-level Nested Total
Maven (pkg:maven) 533 35 568
NPM (pkg:npm) 192 0 192
Generic (pkg:generic) 22 0 22
Total 747 35 782

By CycloneDX type: 760 library, 21 file, 1 application.

Maven Groups (top 10)

Group Count
io.quarkus 132
org.keycloak 39
org.wildfly.security 29
io.netty 18
io.smallrye 17
io.opentelemetry 14
io.smallrye.common 14
org.apache.maven 14
io.smallrye.reactive 12
io.vertx 11

NPM Package Scopes

Scope Count
(unscoped) 124
@types 40
@patternfly 7
@microsoft 6
@reactFlow 6
@dagrejs 2
other (@babel, @noble, @opentelemetry, @remix-run, @std-uritemplate, @uiw, @ungap) 7

Distribution Layout

Maven JARs by Location and Scope

Location Count quarkus:component:scope Purpose
lib/lib/main/ 355 runtime Server runtime libraries
lib/lib/deployment/ 157 development Quarkus augmentation / build-step libraries
lib/lib/boot/ 18 runtime Classloader bootstrap
bin/client/ 4 runtime (3) + none (1) CLI tools (kcadm, kcreg)

All deployment JARs carry development scope; all main/boot JARs carry runtime.

Scope Summary (all components)

Scope Maven NPM Generic Total
runtime 374 - 4 378
development 157 - 3 160
(none) 37 192 15 244

The 37 Maven components without scope are: 35 nested (shaded inside parent JARs) + 2 assembly-added (keycloak-admin-cli, keycloak-client-cli-dist) not present in the Quarkus SBOM. NPM components originate from the JS SBOM, which does not carry Quarkus scope information.

Nested Components

35 components nested inside 6 parent JARs, representing libraries shaded or embedded inside uber JARs:

Parent Nested Content
keycloak-admin-cli@999.0.0-SNAPSHOT 18 Uber JAR shading jackson, httpclient, smallrye-open-api, jandex, etc.
narayana-jta@7.3.4.Final 7 Transaction manager modules (common, arjuna, txoj, cdi, jdbc, jms, jta)
angus-mail@2.0.5 5 Mail protocol modules (angus-core, imap, pop3, smtp, logging-mailhandler)
woodstox-core@7.2.0 2 XML validation libraries (isorelax, xsdlib)
keycloak-sssd-federation@999.0.0-SNAPSHOT 2 dbus-java-core, dbus-java-transport-native-unixsocket
netty-common@4.1.136.Final 1 jctools-core

21 of the 35 also exist as top-level components (the same library appears both standalone and shaded). The #2 bom-ref suffix disambiguates them in the dependency graph.

License Analysis

Coverage

774 out of 782 components have license information (99.0%).

8 components without license:

  • 7 Quarkus build artifacts (appmodel.dat, build-system.properties, deployment-class-path.dat, generated-bytecode.jar, quarkus-application.dat, quarkus-run.jar, transformed-bytecode.jar) — internal project artifacts
  • 1 legacy library (isorelax@20090621) — nested inside woodstox-core, predates standard Maven license metadata

License Distribution

License Count
Apache-2.0 522
MIT 175
BSD-3-Clause 30
EPL-2.0 22
GPL-2.0-with-classpath-exception 19
ISC 12
EPL-1.0 9
BSD-2-Clause 5
Bouncy Castle Licence 3
UPL-1.0 2
CC0-1.0 2
Public Domain 2
Others (MPL-2.0, LGPL-2.1-only, LGPL-2.1-or-later, GPL-2.0-only, MIT-0, 0BSD, BSD-4-Clause) 7 each 1

License Families

Family Count Share
Permissive (Apache, MIT, BSD, ISC, CC0, UPL, 0BSD, MIT-0) 756 96.8%
Weak copyleft (EPL, LGPL, MPL) 35 4.5%
GPL (with or without Classpath Exception) 20 2.6%

Note: some components are dual-licensed, so percentages sum to more than 100%.

GPL Components

The 19 GPL-2.0-with-classpath-exception components are Jakarta EE specification APIs and reference implementations (jakarta.annotation-api, jakarta.el-api, jakarta.interceptor-api, jakarta.json-api, jakarta.mail-api, jakarta.resource-api, jakarta.servlet-api, jakarta.transaction-api, jakarta.ws.rs-api, angus-mail modules, parsson, expressly, nashorn-core, jdk-classfile-backport). The Classpath Exception permits linking without GPL obligations.

The single GPL-2.0-only component is mysql-connector-j@9.7.0 — an optional JDBC driver.

Dual-Licensed Components (28)

  • Vert.x (12 components): Apache-2.0 + EPL-1.0 or EPL-2.0
  • Jakarta APIs (12 components): EPL-2.0 + GPL-2.0-with-classpath-exception
  • jakarta.mail-api: EPL-2.0 + GPL-2.0-with-classpath-exception + BSD-3-Clause
  • jakarta.persistence-api: EPL-2.0 + BSD-3-Clause
  • H2 database: MPL-2.0 + EPL 1.0
  • jakarta.ws.rs-api: EPL-2.0 + GPL-2.0-with-classpath-exception

Non-SPDX License Identifiers (6 components)

Identifier Component Suggested SPDX
Bouncy Castle Licence bcprov, bcpkix, bcutil LicenseRef-BouncyCastle or MIT (the BC licence is MIT-like)
EPL 1.0 H2 database EPL-1.0
Public Domain aopalliance, jboss-transaction-spi No standard SPDX ID exists; blessing or LicenseRef-PublicDomain

These originate from the Quarkus SBOM source and would ideally use SPDX IDs for tooling compatibility.

Hash Coverage

Level Direct hashes Via externalReferences No hash
Top-level Maven (533) 531 with 8 algorithms, 2 with 1 - 0
Top-level NPM (192) 0 192 (SHA-512 registry tarball) 0
Top-level generic (22) 22 (SHA-256) - 0
Nested (35) 0 0 35

The 531 Maven components from the Quarkus SBOM carry 8 hash algorithms each: MD5, SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384, SHA3-512.

The 2 Maven components with only SHA-256 are keycloak-admin-cli and keycloak-client-cli-dist — assembly-added components not present in the Quarkus SBOM; they only have the archive-scanned hash.

The 35 nested components have no hashes — by design, since the hash belongs to the parent JAR.

Evidence and File Traceability

File Coverage

Metric Value
Files in distribution archive 558
Files tracked via evidence.occurrences 557
Untracked files 1 (bom.cdx.json — the SBOM itself)
Phantom SBOM entries (no matching file) 0

Components Without Occurrences (228)

Category Count Reason
NPM 192 Compiled into theme JS bundles; no 1:1 file mapping
Nested Maven 35 Shaded inside parent JARs
keycloak-client-cli-dist 1 Zip dependency unpacked during assembly; contents tracked individually

External References

Reference type Maven (531 components) NPM (192 components)
website 531 191
vcs 480 191
issue-tracker 412 191
distribution / distribution-intake 375 (Maven Central) 192 (npm registry, with SHA-512 hash)
mailing-list 339 -
build-system 39 -

2 Maven components have no external references: keycloak-admin-cli and keycloak-client-cli-dist (assembly-added, not from the Quarkus SBOM).

Duplicate Versions

Maven

io.netty:netty-transport-native-epoll@4.1.136.Final appears twice with different classifiers (linux-x86_64, linux-aarch_64). These are separate native binary JARs for different architectures — distinct artifacts, correctly tracked with different purls.

NPM (6 packages)

Package Versions Reason
@patternfly/patternfly 4.224.5, 5.4.2 Admin console (PF5) + account console (PF4) use different PatternFly major versions
@types/hast 2.3.10, 3.0.4 Type definitions for different hast major versions
@types/unist 2.0.11, 3.0.3 Type definitions for different unist major versions
hast-util-parse-selector 3.1.1, 4.0.0 Transitive dep pulled at two majors by hast ecosystem
hastscript 7.2.0, 9.0.1 Same — hast ecosystem version spread
property-information 6.5.0, 7.1.0 Same — hast ecosystem version spread

All are legitimate: the admin and account console themes use different PatternFly generations (PF5 and PF4), which pull different versions of the underlying hast/unist Markdown-to-HTML ecosystem.

Dependency Graph

Metric Value
Total dependency entries 783
Total dependsOn edges 1,929
Main component direct dependencies 95
Internal nodes (with children) 426
Leaf nodes (no children) 357
Orphan entries (no matching component) 0

Every component bom-ref — including nested #2 variants — has a matching dependency entry. The graph is structurally complete.

SBOM Generation Pipeline

The distribution SBOM is assembled from three sources:

  1. Quarkus SBOM (quarkus/server/target/lib/quarkus-run-cyclonedx.json) — generated by the quarkus-cyclonedx extension. Provides Maven components with full metadata: 8 hash algorithms, quarkus:component:scope properties, external references, and a dependency graph.

  2. JS SBOM (js/target/js-sbom.cdx.json) — generated by pnpm sbom --prod. Provides NPM components with licenses, external references (including SHA-512 registry tarball hashes), but no file-level occurrences.

  3. Archive file catalog — the assembly-sbom-handler scans the archive, identifies Maven artifacts by content hash, and catalogs non-Maven files (scripts, configs, Quarkus internal files).

The handler merges these sources, deduplicating by purl, and produces both an external SBOM file and an embedded bom.cdx.json inside each archive.

Items Worth Attention

  1. mysql-connector-j is GPL-2.0-only — the only strict GPL component in the distribution. It is an optional JDBC driver, but its presence should be noted for license compliance reviews.

  2. 6 non-SPDX license identifiers — "Bouncy Castle Licence", "EPL 1.0", "Public Domain" should use SPDX IDs or LicenseRef-* for tooling compatibility. These originate from the Quarkus SBOM.

  3. 1 missing license — isorelax@20090621 (nested inside woodstox-core). Very old artifact with no POM license metadata.

  4. 35 nested components have no hashes — by design (the parent JAR carries the hash), but SBOM consumers that flatten the hierarchy may flag these.

  5. NPM components have no file-level traceability — they're compiled into theme bundles, so there's no 1:1 file mapping. The tarball hashes in externalReferences prove registry provenance but do not directly verify what's deployed.

  6. 157 deployment JARs in the distribution — Quarkus build-step libraries needed for augmentation at first startup, correctly scoped as development. They increase the distribution's size and license footprint but are not loaded at runtime after the initial build.

@aloubyansky
Copy link
Copy Markdown
Author
8 components without license:

* 7 Quarkus build artifacts (appmodel.dat, build-system.properties, deployment-class-path.dat, generated-bytecode.jar, quarkus-application.dat, quarkus-run.jar, transformed-bytecode.jar) — internal project artifacts
* 1 legacy library (isorelax@20090621) — nested inside woodstox-core, predates standard Maven license metadata

The first 7 would need to be fixed in quarkus-cyclonedx, i'll look into that.

For isorelax I guess I could add an option to provide missing information in a config.

Non-SPDX License Identifiers (6 components)

I could look into "normalizing" what's straightforward to normalize, otherwise, i guess the same as above.

@michalvavrik michalvavrik left a comment
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thank you very much. I am not the logic owner though. We shall need reviews from @shawkins / @edewit / @Pepo48 / @vmuzikar .

@michalvavrik
Copy link
Copy Markdown
Member

@aloubyansky I think review may take a while, so if you plan some improvements upstream, that can be done in parallel. let see

@VinodAnandan
Copy link
Copy Markdown
Contributor

@shawkins / @edewit / @Pepo48 / @vmuzikar / @stianst Could you please help with reviewing this PR when you get a chance? I believe it would provide significant value to the Keycloak community, as it would allow Keycloak users to access and make better use of third-party component information and the associated licence details in a more structured and usable format than HTML.

@shawkins shawkins added this to the 27.0 Development Milestone milestone Sep 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature - Include sbom for KeyCloak release

6 participants

0