Downloads SBOMs from GitHub, Mend, and Wiz, or generates them from container images with Trivy. Normalizes between CycloneDX and SPDX, optionally merges SBOMs stored in S3, and uploads the result to S3 and ClickHouse.
Versioning.
v1.0.xtags are the retired bash implementation. The Go implementation is released asv2.xtags (v2.0.0and later); pin a tag, for exampleClickHouse/ClickBOM@v2.0.0, and bump it to pick up fixes. Never pin to a feature branch — branches are deleted after merge and the workflow fails withUnable to resolve action.
| Name | Description | Default | Required | Sensitive |
|---|---|---|---|---|
| github-token | GitHub Token | false | true | |
| repository | Repository to download SBOM from | false | false |
github-tokencan be the built-in${{ secrets.GITHUB_TOKEN }}or a token generated by a GitHub App. If you use a GitHub App, see Creating a GitHub App.- ClickBOM obtains the SBOM through GitHub's asynchronous SBOM export: it requests a report, polls until GitHub has generated it, then downloads the document. The token needs
contents: readon the repository, and the repository must have the dependency graph enabled. Large repositories take longer to generate; ClickBOM waits up to 10 minutes per report and makes up to 3 attempts when GitHub fails transiently. GitHub is removing the older synchronous export on 2026-11-13; ClickBOM releases up to v2.0.0 use that endpoint and will stop working withsbom-source: githubon that date, so upgrade to a newer release.
| Name | Description | Default | Required | Sensitive |
|---|---|---|---|---|
| mend-email | Mend user email address | false | true | |
| mend-org-uuid | Mend organization UUID | false | true | |
| mend-user-key | Mend user key | false | true | |
| mend-base-url | Mend base URL | https://api-saas.mend.io | false | false |
| mend-product-uuid | Mend product UUID for product-scoped SBOM | false | true | |
| mend-project-uuid | Mend project UUID for project-scoped SBOM | false | true | |
| mend-org-scope-uuid | Deprecated / no-op (Mend API 3.0 has no org-level SBOM export) | false | true | |
| mend-project-uuids | Comma-separated list of specific project UUIDs to include | false | true | |
| mend-max-wait-time | Maximum time to wait for Mend report generation (seconds) | 1800 | false | false |
| mend-poll-interval | Polling interval for Mend report status (seconds) | 30 | false | false |
- Scope precedence: if
mend-project-uuidis set the export is project-scoped (/api/v3.0/projects/{uuid}/dependencies/reports/SBOM); otherwisemend-product-uuidgives a product-scoped export (/api/v3.0/applications/{uuid}/dependencies/reports/SBOM, optionally narrowed tomend-project-uuids). One of the two is required. mend-org-scope-uuidis accepted for backward compatibility but cannot be used on its own: Mend API 3.0 offers dependency SBOM exports only at project and application (product) scope.- ClickBOM only supports downloading SBOMs from Mend in the CycloneDX v1.5 format. If you need to convert the SBOM to SPDX, you can use the
sbom-formatinput.
| Name | Description | Default | Required | Sensitive |
|---|---|---|---|---|
| wiz-auth-endpoint | Wiz Auth Endpoint | false | true | |
| wiz-api-endpoint | Wiz API Endpoint | false | true | |
| wiz-client-id | Wiz Client ID | false | true | |
| wiz-client-secret | Wiz Client Secret | false | true | |
| wiz-report-id | Wiz Report ID | false | true |
| Name | Description | Default | Required | Sensitive |
|---|---|---|---|---|
| trivy-image | Container image to scan (registry/repo:tag or an ECR URI) |
false | false | |
| trivy-ecr-account-id | AWS account ID that owns the ECR repository (enables ECR auth handling) | false | false | |
| trivy-ecr-region | AWS region of the ECR repository | us-east-1 | false | false |
| trivy-ecr-role-arn | IAM role to assume for cross-account ECR access | false | false | |
| trivy-ecr-external-id | External ID to present when assuming trivy-ecr-role-arn (only if its trust policy requires one) |
false | true | |
| trivy-format | SBOM format Trivy emits: cyclonedx or spdxjson |
cyclonedx | false | false |
- Images are scanned at the registry (
--image-src remote); nothing is pulled through Docker. - For ECR images set
trivy-ecr-account-id; when the repository lives in another account also settrivy-ecr-role-arnand ClickBOM assumes it via STS before invoking Trivy.
| Name | Description | Default | Required | Sensitive |
|---|---|---|---|---|
| aws-access-key-id | AWS Access Key ID. Deprecated — prefer OIDC (see examples below). | false | true | |
| aws-secret-access-key | AWS Secret Access Key. Deprecated — prefer OIDC (see examples below). | false | true | |
| aws-region | AWS Region. Deprecated — prefer OIDC (set via configure-aws-credentials). | us-east-1 | false | false |
| s3-bucket | S3 Bucket Name (always required, even when ClickHouse output is the goal) | true | false | |
| s3-key | S3 object key of the uploaded SBOM (in merge mode: the merged output object) | sbom.json | false | false |
- It is recommended that an S3 bucket be created for the purposes of ClickBOM.
- The
aws-*inputs are kept for backward compatibility with the bash version of this action. The recommended path is to useaws-actions/configure-aws-credentialswith GitHub OIDC; that action exportsAWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY/AWS_SESSION_TOKEN/AWS_REGIONas job-level env vars, and the Actions runner passes job env through to the ClickBOM container unchanged, so nothing needs to be passed as an input. (Do not passsteps.<id>.outputs.aws-access-key-id: those outputs are empty unlessoutput-credentials: trueis set.) - The bucket does not have to be in the job's
aws-region. ClickBOM resolves each bucket's home region up front (viaHeadBucket'sx-amz-bucket-regionheader) and talks to the right regional endpoint, so a mismatch no longer fails with301 PermanentRedirect. - Setting
AWS_ENDPOINT_URL(e.g. to MinIO or LocalStack) switches the client to path-style addressing and disables region discovery.
| Name | Description | Default | Required | Sensitive |
|---|---|---|---|---|
| clickhouse-url | ClickHouse URL | false | true | |
| clickhouse-database | ClickHouse Database Name | default | false | false |
| clickhouse-username | ClickHouse Username | default | false | false |
| clickhouse-password | ClickHouse Password | (empty) | false | true |
| truncate-table | Truncate table before insert | false | false | false |
- At the moment, ClickHouse ingestion is only supported over HTTP.
| Name | Description | Default | Required | Sensitive |
|---|---|---|---|---|
| sbom-source | Source of SBOM (github, mend, wiz, trivy) | github | false | false |
| sbom-format | SBOM format (spdxjson or cyclonedx) | cyclonedx | false | false |
| merge | Merge SBOMs stored in S3 | false | false | false |
| include | Comma-separated list of filenames or patterns to include when merging | (empty) | false | false |
| exclude | Comma-separated list of filenames or patterns to exclude when merging | (empty) | false | false |
| debug | Enable debug logging | false | false | false |
sbom-formatspecifies the format you want the final SBOM to be in. For example, GitHub only supports SPDX, settings this input tocyclonedxwill convert the SBOM to CycloneDX format.includeandexcludeare only used whenmergeis set totrue. They allow you to filter which files from the S3 bucket should be included in the merge operation.- Both
includeandexcludesupport exact filename matching and wildcard patterns (e.g.,file*.json,*-prod.json). - If
includeis specified, only files matching the include patterns will be processed. - If
excludeis specified, files matching the exclude patterns will be skipped. excludeis applied afterinclude, so a file that matches both an include and exclude pattern will be excluded.
Simple example of downloading the SBOM from the same repository and uploading it to S3. Converts the SBOM to CycloneDX format.
name: Upload SBOM
on:
push:
branches:
- main
jobs:
clickbom:
name: ClickBOM
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Configure AWS Credentials
id: aws-creds
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::012345678912:role/GitHubOIDCRole
role-session-name: clickbom-session
aws-region: us-east-1
- name: Upload SBOM
uses: ClickHouse/ClickBOM@main
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
s3-bucket: my-sbom-bucket
s3-key: clickbom.json
repository: ${{ github.repository }}Downloads the SBOM from the same repository and uploads it to S3. Converts the SBOM to CycloneDX format. Also uploads the SBOM to ClickHouse.
name: Upload SBOM
on:
push:
branches:
- main
jobs:
clickbom:
name: ClickBOM
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Configure AWS Credentials
id: aws-creds
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::012345678912:role/GitHubOIDCRole
role-session-name: clickbom-session
aws-region: us-east-1
- name: Upload SBOM
uses: ClickHouse/ClickBOM@main
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
s3-bucket: my-sbom-bucket
s3-key: clickbom.json
repository: ${{ github.repository }}
clickhouse-url: ${{ secrets.CLICKHOUSE_URL }}
clickhouse-database: ${{ secrets.CLICKHOUSE_DATABASE }}
clickhouse-username: ${{ secrets.CLICKHOUSE_USERNAME }}
clickhouse-password: ${{ secrets.CLICKHOUSE_PASSWORD }}Downloads the SBOM from the same repository and uploads it to S3. Keeps the SBOM in SPDX format. Authenticates using a GitHub App. See Creating a GitHub App.
name: Upload SBOM
on:
push:
branches:
- main
jobs:
clickbom:
name: ClickBOM
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Generate Token
id: generate-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.CLICKBOM_AUTH_APP_ID }}
private-key: ${{ secrets.CLICKBOM_AUTH_PRIVATE_KEY }}
- name: Configure AWS Credentials
id: aws-creds
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::012345678912:role/GitHubOIDCRole
role-session-name: clickbom-session
aws-region: us-east-1
- name: Upload SBOM
uses: ClickHouse/ClickBOM@main
with:
github-token: ${{ steps.generate-token.outputs.token }}
sbom-format: spdxjson
s3-bucket: my-sbom-bucket
s3-key: clickbom.json
repository: ${{ github.repository }}
clickhouse-url: ${{ secrets.CLICKHOUSE_URL }}
clickhouse-database: ${{ secrets.CLICKHOUSE_DATABASE }}
clickhouse-username: ${{ secrets.CLICKHOUSE_USERNAME }}
clickhouse-password: ${{ secrets.CLICKHOUSE_PASSWORD }}Downloads SBOMs from multiple repositories (must have GitHub App installed), Converts SBOMs to CycloneDX format, and uploads them to S3 and ClickHouse.
name: Upload SBOM
on:
push:
branches:
- main
jobs:
clickbom:
strategy:
fail-fast: false
matrix:
repository: [
"repository-one",
"repository-two",
"repository-three"
]
name: ClickBOM
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Generate Token
id: generate-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.CLICKBOM_AUTH_APP_ID }}
private-key: ${{ secrets.CLICKBOM_AUTH_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
repositories: ${{ matrix.repository }}
- name: Configure AWS Credentials
id: aws-creds
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::012345678912:role/GitHubOIDCRole
role-session-name: clickbom-session
aws-region: us-east-1
- name: Upload SBOM
uses: ClickHouse/ClickBOM@main
with:
github-token: ${{ steps.generate-token.outputs.token }}
s3-bucket: my-sbom-bucket
s3-key: ${{ matrix.repository }}.json
repository: ${{ github.repository_owner }}/${{ matrix.repository }}
clickhouse-url: ${{ secrets.CLICKHOUSE_URL }}
clickhouse-database: ${{ secrets.CLICKHOUSE_DATABASE }}
clickhouse-username: ${{ secrets.CLICKHOUSE_USERNAME }}
clickhouse-password: ${{ secrets.CLICKHOUSE_PASSWORD }}This example adds to the previous one by merging SBOMs stored in S3. It downloads the SBOMs from S3, merges them, and uploads the merged SBOM back to S3 and ClickHouse. Only the CycloneDX format is supported for merging.
name: Upload SBOM
on:
push:
branches:
- main
jobs:
clickbom:
strategy:
fail-fast: false
matrix:
repository: [
"repository-one",
"repository-two",
"repository-three"
]
name: ClickBOM
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Generate Token
id: generate-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.CLICKBOM_AUTH_APP_ID }}
private-key: ${{ secrets.CLICKBOM_AUTH_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
repositories: ${{ matrix.repository }}
- name: Configure AWS Credentials
id: aws-creds
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::012345678912:role/GitHubOIDCRole
role-session-name: clickbom-session
aws-region: us-east-1
- name: Upload SBOM
uses: ClickHouse/ClickBOM@main
with:
github-token: ${{ steps.generate-token.outputs.token }}
s3-bucket: my-sbom-bucket
s3-key: ${{ matrix.repository }}.json
repository: ${{ github.repository_owner }}/${{ matrix.repository }}
clickhouse-url: ${{ secrets.CLICKHOUSE_URL }}
clickhouse-database: ${{ secrets.CLICKHOUSE_DATABASE }}
clickhouse-username: ${{ secrets.CLICKHOUSE_USERNAME }}
clickhouse-password: ${{ secrets.CLICKHOUSE_PASSWORD }}
clickbom_merge:
needs: clickbom
name: ClickBOM Merge
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Generate Token
id: generate-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.CLICKBOM_AUTH_APP_ID }}
private-key: ${{ secrets.CLICKBOM_AUTH_PRIVATE_KEY }}
- name: Configure AWS Credentials
id: aws-creds
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::012345678912:role/GitHubOIDCRole
role-session-name: clickbom-session
aws-region: us-east-1
- name: Upload SBOM
uses: ClickHouse/ClickBOM@main
with:
github-token: ${{ steps.generate-token.outputs.token }}
s3-bucket: my-sbom-bucket
s3-key: clickbom.json
clickhouse-url: ${{ secrets.CLICKHOUSE_URL }}
clickhouse-database: ${{ secrets.CLICKHOUSE_DATABASE }}
clickhouse-username: ${{ secrets.CLICKHOUSE_USERNAME }}
clickhouse-password: ${{ secrets.CLICKHOUSE_PASSWORD }}
merge: trueThis example shows how to use the include and exclude filters when merging SBOMs. This is useful when you want to merge only specific files from your S3 bucket.
name: Upload SBOM
on:
push:
branches:
- main
jobs:
clickbom_merge:
name: ClickBOM Merge with Filters
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Generate Token
id: generate-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.CLICKBOM_AUTH_APP_ID }}
private-key: ${{ secrets.CLICKBOM_AUTH_PRIVATE_KEY }}
- name: Configure AWS Credentials
id: aws-creds
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::012345678912:role/GitHubOIDCRole
role-session-name: clickbom-session
aws-region: us-east-1
- name: Merge Production SBOMs Only
uses: ClickHouse/ClickBOM@main
with:
github-token: ${{ steps.generate-token.outputs.token }}
s3-bucket: my-sbom-bucket
s3-key: production-merged.json
clickhouse-url: ${{ secrets.CLICKHOUSE_URL }}
clickhouse-database: ${{ secrets.CLICKHOUSE_DATABASE }}
clickhouse-username: ${{ secrets.CLICKHOUSE_USERNAME }}
clickhouse-password: ${{ secrets.CLICKHOUSE_PASSWORD }}
merge: true
include: "*-prod.json,production-*.json"
exclude: "*-test.json,*-dev.json"In this example:
include: "*-prod.json,production-*.json"will only process files that match these patternsexclude: "*-test.json,*-dev.json"will skip any files that match these patterns- The result is that only production-related SBOMs will be merged, excluding test and development SBOMs
If you want to download an SBOM from Mend, you can use the following example. This example assumes you have the necessary Mend credentials set up in your GitHub Secrets.
name: Upload SBOM
on:
push:
branches:
- main
jobs:
clickbom:
name: ClickBOM
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Configure AWS Credentials
id: aws-creds
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::012345678912:role/GitHubOIDCRole
role-session-name: clickbom-session
aws-region: us-east-1
- name: Upload SBOM from Mend
uses: ClickHouse/ClickBOM@main
with:
s3-bucket: my-sbom-bucket
s3-key: clickbom.json
sbom-source: mend
mend-email: ${{ secrets.CLICKBOM_MEND_EMAIL }}
mend-org-uuid: ${{ secrets.CLICKBOM_MEND_ORG_UUID }}
mend-user-key: ${{ secrets.CLICKBOM_MEND_USER_KEY }}
mend-product-uuid: ${{ secrets.CLICKBOM_MEND_PRODUCT_UUID }}
mend-project-uuid: ${{ secrets.CLICKBOM_MEND_PROJECT_UUID }}
clickhouse-url: ${{ secrets.CLICKHOUSE_URL }}
clickhouse-database: ${{ secrets.CLICKHOUSE_DATABASE }}
clickhouse-username: ${{ secrets.CLICKHOUSE_USERNAME }}
clickhouse-password: ${{ secrets.CLICKHOUSE_PASSWORD }}If you want to download an SBOM from Wiz, you can use the following example. This example assumes you have the necessary Wiz credentials set up in your GitHub Secrets.
name: Upload SBOM
on:
push:
branches:
- main
jobs:
clickbom:
name: ClickBOM
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Configure AWS Credentials
id: aws-creds
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::012345678912:role/GitHubOIDCRole
role-session-name: clickbom-session
aws-region: us-east-1
- name: Upload SBOM from Wiz
uses: ClickHouse/ClickBOM@main
with:
s3-bucket: my-sbom-bucket
s3-key: clickbom.json
sbom-source: wiz
wiz-auth-endpoint: ${{ secrets.CLICKBOM_WIZ_AUTH_ENDPOINT }}
wiz-api-endpoint: ${{ secrets.CLICKBOM_WIZ_API_ENDPOINT }}
wiz-client-id: ${{ secrets.CLICKBOM_WIZ_CLIENT_ID }}
wiz-client-secret: ${{ secrets.CLICKBOM_WIZ_CLIENT_SECRET }}
wiz-report-id: ${{ secrets.CLICKBOM_WIZ_REPORT_ID }}
clickhouse-url: ${{ secrets.CLICKHOUSE_URL }}
clickhouse-database: ${{ secrets.CLICKHOUSE_DATABASE }}
clickhouse-username: ${{ secrets.CLICKHOUSE_USERNAME }}
clickhouse-password: ${{ secrets.CLICKHOUSE_PASSWORD }}Scans an image in a (possibly cross-account) ECR repository with Trivy, uploads the CycloneDX SBOM to S3 and ClickHouse. The job's OIDC role must be allowed to assume trivy-ecr-role-arn.
name: Upload SBOM
on:
push:
branches:
- main
jobs:
clickbom:
name: ClickBOM
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: arn:aws:iam::012345678912:role/GitHubOIDCRole
role-session-name: clickbom-session
aws-region: us-east-1
- name: Upload SBOM from Container Image
uses: ClickHouse/ClickBOM@main
with:
s3-bucket: my-sbom-bucket
s3-key: clickhouse-keeper.json
sbom-source: trivy
trivy-image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/clickhouse-keeper:25.2.1.30176
trivy-ecr-account-id: "123456789012"
trivy-ecr-region: us-east-1
trivy-ecr-role-arn: arn:aws:iam::123456789012:role/ECRPullRole
trivy-format: cyclonedx
clickhouse-url: ${{ secrets.CLICKHOUSE_URL }}
clickhouse-database: ${{ secrets.CLICKHOUSE_DATABASE }}
clickhouse-username: ${{ secrets.CLICKHOUSE_USERNAME }}
clickhouse-password: ${{ secrets.CLICKHOUSE_PASSWORD }}The action runs as a Docker container built from this repository's Dockerfile: a static Go binary plus two external tools, cyclonedx (format conversion) and trivy (image scanning), on gcr.io/distroless/cc-debian12:nonroot. The cc variant is required because cyclonedx-cli is a dynamically linked .NET application; on distroless/static it cannot execute at all. CI builds the image and runs a conversion inside it on every push.
- Follow the instructions here to create a GitHub App.
- Make sure to give the app
Read accesstoContentsandMetadata. - Install the app on the repositories you want to use it with.
- Generate a private key for the app and save it somewhere secure, i.e. GitHub Secrets.