CI/CD-Integration

Eine manuell gepflegte SBOM ist in dem Moment veraltet, in dem sie entsteht. Das Multi-Arch-Docker-Image (amd64/arm64) bringt kunnus in jede Pipeline, sodass jedes Release mit einer aktuellen SBOM erscheint.

GitHub Actions

.github/workflows/sbom.yml
- name: Generate SBOM
  run: |
    docker run --rm -v ${{ github.workspace }}:/src \
      ghcr.io/think-ahead-technologies/kunnus-scanner:latest \
      sbom repo /src --output /src/sbom.cdx.json

- name: Upload to kunnus platform
  env:
    KUNNUS_API_KEY: ${{ secrets.KUNNUS_API_KEY }}
    KUNNUS_COMPONENT_ID: ${{ vars.KUNNUS_COMPONENT_ID }}
  run: |
    docker run --rm -v ${{ github.workspace }}:/src \
      -e KUNNUS_API_KEY -e KUNNUS_COMPONENT_ID \
      ghcr.io/think-ahead-technologies/kunnus-scanner:latest \
      upload /src/sbom.cdx.json

GitLab CI

.gitlab-ci.yml
sbom:
  image:
    name: ghcr.io/think-ahead-technologies/kunnus-scanner:latest
    entrypoint: [""]
  script:
    - /kunnus sbom repo . --output sbom.cdx.json
    - /kunnus upload sbom.cdx.json
  variables:
    KUNNUS_API_KEY: $KUNNUS_API_KEY
    KUNNUS_COMPONENT_ID: $KUNNUS_COMPONENT_ID
  artifacts:
    paths: [sbom.cdx.json]

Exit-Codes: vollständige vs. unvollständige SBOMs

Exit 0 bedeutet: Jeder Extraktor lief sauber durch. Schließt der Scan ab, aber einzelne Plugins sind fehlgeschlagen, wird die SBOM trotzdem geschrieben und kunnus beendet sich mit Exit 1 und einer Liste der fehlgeschlagenen Plugins — die Pipeline kann eine vollständige SBOM von einer mit Lücken unterscheiden, statt Letztere stillschweigend auszuliefern. --verbosity info (oder KUNNUS_VERBOSITY=info) liefert Details pro Plugin.

Upload-Konfiguration

kunnus upload liest seine Flags aus Umgebungsvariablen — KUNNUS_API_KEY (erforderlich), KUNNUS_COMPONENT_ID und KUNNUS_UPLOAD_URL — die natürliche Form für CI-Secrets. Die Server-Antwort geht nach stdout.

Supply-Chain-Härtung: Release-Images sind mit cosign signiert und tragen SLSA-Build-L3-Provenance. Das Image per Digest pinnen und verifizieren — SECURITY.md im Repository zeigt wie.