16 Commits

Author SHA1 Message Date
294f30eb38 fix image name confusion
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-07-15 15:32:53 +02:00
5af202469c fix start script, add port 2025-07-15 15:26:10 +02:00
81bd403069 fix start script 2025-07-15 15:20:26 +02:00
93222237ee adjust ci rules, fix 2025-07-15 15:18:46 +02:00
d5bda1c2d4 adjust ci rules 2025-07-15 15:16:54 +02:00
b430afcfef add deploy stage, fix 3 2025-07-15 15:10:24 +02:00
3ce0b0a4cf add deploy stage, fix 2 2025-07-15 15:09:50 +02:00
c88a74daa3 add deploy stage, fix 2025-07-15 15:09:05 +02:00
10d14d87fb add deploy stage
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-07-15 15:07:53 +02:00
58795aca81 rename dockerfiles, fix 2 2025-07-15 14:45:32 +02:00
13271a6d5e rename dockerfiles, fix 2025-07-15 14:44:18 +02:00
5a9493fe32 rename dockerfiles
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-07-15 14:42:53 +02:00
708b99852f add second dockerfile, add ci snippet
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-07-15 14:40:40 +02:00
e15973db53 add second dockerfile 2025-07-15 14:40:06 +02:00
b2db5b35ad prepare second dockerfile
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2025-07-15 14:33:07 +02:00
b21bd408f7 there is still an error
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-07-14 23:13:30 +02:00
7 changed files with 177 additions and 45 deletions

View File

@@ -1,10 +1,11 @@
stages:
- generate-api-clients
- build
- deploy
variables:
REGISTRY: devnexus.krohne.com:18079/repository/docker-krohne
IMAGE_NAME: $REGISTRY/$CI_PROJECT_NAME
IMAGE_NAME_PREFIX: $REGISTRY/$CI_PROJECT_NAME
DTRACK_API_URL: https://dtrack-api-rd.krohne.com
DEFECTDOJO_API_URL: https://defectdojo-rd.krohne.com
KROHNE_CA_URL: https://devwiki.krohnegroup.com/lib/exe/fetch.php?media=krohne-ca.crt
@@ -68,7 +69,7 @@ generate-defectdojo-api:
-o defectdojo-client \
--package-name defectdojo_api
dockerize:
.dockerize:
stage: build
image: devnexus.krohne.com:18079/repository/docker-krohne/krohnedockerbash:0.5
tags:
@@ -76,51 +77,81 @@ dockerize:
- docker
- bash
rules:
- if: '$CI_COMMIT_TAG'
- if: '$CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "production_deployment"'
script:
- docker build --build-arg ADDITIONAL_CA_URL="$KROHNE_CA_URL"
--build-arg ADDITIONAL_CA_CHECKSUM=$KROHNE_CA_CHECKSUM
--tag $IMAGE_NAME:latest
--tag $IMAGE_NAME:latest-$CI_COMMIT_BRANCH
--tag $IMAGE_NAME:$CI_COMMIT_SHA
--tag $IMAGE_NAME:$CI_COMMIT_TAG
-f $DOCKERFILE
.
- docker login -u $NEXUS_USER -p $NEXUS_PASSWORD $REGISTRY
- docker push $IMAGE_NAME:latest
- docker push $IMAGE_NAME:latest-$CI_COMMIT_BRANCH
- docker push $IMAGE_NAME:$CI_COMMIT_SHA
- docker push $IMAGE_NAME:$CI_COMMIT_TAG
build-windows-binary:
stage: build
tags:
- windows
- pwsh
- python3.13
rules:
- if: '$CI_COMMIT_TAG'
artifacts:
paths:
- sbom-dt-dd.exe
dockerize-cli:
extends: .dockerize
variables:
IMAGE_NAME_SUFFIX: cli
DOCKERFILE: Dockerfile-cli
dockerize-server:
extends: .dockerize
variables:
IMAGE_NAME_SUFFIX: server
DOCKERFILE: Dockerfile-server
.deploy:
stage: deploy
image: devnexus.krohne.com:18079/repository/docker-krohne/krohnedockerbash:0.5
variables:
GIT_STRATEGY: none
SERVICE: sbom-dd-dt-integrator
script:
- IMAGE_NAME=$IMAGE_NAME_PREFIX"-server"
- VERSION=$CI_COMMIT_SHA
- CONTAINER_NAME=$SERVICE"-"$INSTANCE_SPECIFIER
- SERVICE_VOLUME=$SERVICE"-"$INSTANCE_SPECIFIER"-data"
- docker volume inspect $SERVICE_VOLUME || docker volume create $SERVICE_VOLUME
- docker stop $CONTAINER_NAME || echo "$CONTAINER_NAME not running, anyway okay"
- docker rm $CONTAINER_NAME || echo "$CONTAINER_NAME not running, anyway okay"
- docker login -u $NEXUS_USER -p $NEXUS_PASSWORD $REGISTRY
- docker pull $IMAGE_NAME:$VERSION
- |
cd src
mv ..\dependencytrack-client .
mv ..\defectdojo-client .
& 'C:\Program Files\Python313\python.exe' -m venv venv
.\venv\Scripts\pip.exe install --upgrade pip
.\venv\Scripts\pip.exe install -r requirements.txt
.\venv\Scripts\pip.exe install -r dependencytrack-client\requirements.txt
.\venv\Scripts\pip.exe install -r defectdojo-client\requirements.txt
.\venv\Scripts\pip.exe install pyinstaller
.\venv\Scripts\pyinstaller.exe --onefile `
--add-data "dependencytrack-client;dependencytrack-client" `
--add-data "defectdojo-client;defectdojo-client" `
--hidden-import pydantic `
--hidden-import dateutil.parser `
--hidden-import urllib3 `
--hidden-import regex `
--collect-data cyclonedx `
--collect-data license_experssion `
sbom-dt-dd.py
mv dist\sbom-dt-dd.exe ..
cat - > /start-scripts/${CONTAINER_NAME}.sh << EOT
docker run \
-d \
--restart always \
-p 4701:8000 \
--name $CONTAINER_NAME \
-e DTRACK_API_URL=$DTRACK_API_URL \
-e DTRACK_TOKEN=$DTRACK_TOKEN \
-e DEFECTDOJO_URL=$DEFECTDOJO_URL \
-e DEFECTDOJO_TOKEN=$DEFECTDOJO_TOKEN \
$IMAGE_NAME:$VERSION
EOT
- chmod 755 /start-scripts/${CONTAINER_NAME}.sh
- /start-scripts/${CONTAINER_NAME}.sh
deploy-test:
extends: .deploy
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
tags:
- test-deployment-de01rdtst01
variables:
INSTANCE_SPECIFIER: test
environment:
name: test
deploy-dev:
extends: .deploy
rules:
- if: '$CI_COMMIT_BRANCH == "production_deployment"'
tags:
- for-common-services-prod-deployment-only
variables:
INSTANCE_SPECIFIER: prod
environment:
name: prod

View File

@@ -34,7 +34,7 @@ COPY src/requirements.txt .
COPY src/sbom_dt_dd.py .
COPY src/sbom_dt_dd_cli.py .
COPY src/converter.py .
COPY src/entrypoint.sh .
COPY src/entrypoint-cli.sh .
COPY dependencytrack-client/ ./dependencytrack-client
COPY defectdojo-client/ ./defectdojo-client
@@ -45,7 +45,7 @@ RUN \
pip install -r dependencytrack-client/requirements.txt &&\
pip install -r defectdojo-client/requirements.txt
ENTRYPOINT [ "./entrypoint.sh" ]
ENTRYPOINT [ "./entrypoint-cli.sh" ]

52
Dockerfile-server Normal file
View File

@@ -0,0 +1,52 @@
FROM python:3.12.10-alpine3.22
ENV DTRACK_API_URL=""
ENV DTRACK_TOKEN=""
ENV DEFECTDOJO_URL=""
ENV DEFECTDOJO_TOKEN=""
ARG APP_DIR=/opt/app
ARG ADDITIONAL_CA_URL="x"
ARG ADDITIONAL_CA_CHECKSUM="y"
RUN \
set -e &&\
adduser -s /bin/sh -D user &&\
mkdir -p $APP_DIR &&\
chown user:user $APP_DIR &&\
echo $ADDITIONAL_CA_URL &&\
echo $ADDITIONAL_CA_CHECKSUM &&\
if [ "$ADDITIONAL_CA_URL" != "x" ]; then \
cd /usr/local/share/ca-certificates; \
wget --no-check-certificate -O custom-ca.crt $ADDITIONAL_CA_URL; \
echo "$ADDITIONAL_CA_CHECKSUM custom-ca.crt" | md5sum -c; \
/usr/sbin/update-ca-certificates; \
echo "custom ca added"; \
else \
echo "no additional ca"; \
fi
USER user
WORKDIR $APP_DIR
COPY src/requirements.txt .
COPY src/sbom_dt_dd.py .
COPY src/sbom_dt_dd_api.py .
COPY src/converter.py .
COPY src/entrypoint-server.sh .
COPY dependencytrack-client/ ./dependencytrack-client
COPY defectdojo-client/ ./defectdojo-client
RUN \
python -m venv .venv &&\
. ./.venv/bin/activate &&\
pip install -r requirements.txt &&\
pip install -r dependencytrack-client/requirements.txt &&\
pip install -r defectdojo-client/requirements.txt
EXPOSE 8000
ENTRYPOINT [ "./entrypoint-server.sh" ]

9
src/entrypoint-server.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/bash
source /opt/app/.venv/bin/activate
PYTHONPATH="$PYTHONPATH:/opt/app/dependencytrack-client"
PYTHONPATH="$PYTHONPATH:/opt/app/defectdojo-client"
export PYTHONPATH
gunicorn sbom_dt_dd_api:app -k uvicorn.workers.UvicornWorker -w 4 -b 0.0.0.0:8000

View File

@@ -1,4 +1,6 @@
import os
import json
import yaml
from loguru import logger
from fastapi import FastAPI, UploadFile, File, Form, HTTPException
from fastapi.responses import JSONResponse
@@ -56,17 +58,58 @@ async def uploadMinimalSBOM(
"""
Endpoint to upload a minimal SBOM definition
"""
try:
sbom = await file.read()
try:
logger.info("Start converting from minimal format into cyclonedx")
(sbom, projectName, projectVersion, projectClassifier, projectDescription) = minimalSbomFormatConverter(sbom)
logger.info("Converted")
loadToDTrackAndDefectDojo(app.state.config, projectName, projectVersion, projectClassifier, projectDescription, 1, sbom, reimport)
logger.info("Done.")
except yaml.scanner.ScannerError as e:
logger.warning(f"uploadMinimalSBOM, yaml ScannerError: {e.context=}, {e.context_mark=}, {e.problem=}, {e.problem_mark=}, {e.note=}")
raise HTTPException(status_code=400, detail=f"yaml ScannerError: {e.context=}, {e.context_mark=}, {e.problem=}, {e.problem_mark=}, {e.note=}")
except ApiException as e:
logger.warning(f"uploadMinimalSBOM, ApiException: {e.status=}, {e.reason=}, {e.body=}")
raise HTTPException(status_code=e.status, detail=f"{e.reason=}, {e.body=}, {e.data=}")
except Exception as e:
logger.warning(f"uploadMinimalSBOM, Exception: {type(e)=}, {str(e)=}, {e.msg=}")
raise HTTPException(status_code=500, detail=f"Exception: {type(e)=}, {str(e)=}, {e.msg=}")
return JSONResponse(content={
"message": "Upload successful!"
})
@app.post("/uploadSBOM/")
async def uploadSBOM(
file: UploadFile = File(...),
projectName: str = Form(...),
projectVersion: str = Form(...),
projectClassifier: str = Form(...),
projectDescription: str = Form(...),
reimport: bool = Form(...)
):
"""
Endpoint to upload a CycloneDX SBOM
"""
sbom = await file.read()
try:
sbomJson = json.loads(sbom)
sbom = json.dumps(sbomJson)
loadToDTrackAndDefectDojo(app.state.config, projectName, projectVersion, projectClassifier, projectDescription, 1, str(sbom), reimport)
logger.info("Done.")
except json.decoder.JSONDecodeError as e:
logger.warning(f"uploadSBOM, JSONDecodeError: {e.msg=}")
raise HTTPException(status_code=400, detail=f"JSON decoding error: {e.msg=}, {e.doc=}, {e.pos=}, {e.lineno=}, {e.colno=}")
except ApiException as e:
logger.warning(f"uploadSBOM, ApiException: {e.status=}, {e.reason=}, {e.body=}")
raise HTTPException(status_code=e.status, detail=f"{e.reason=}, {e.body=}, {e.data=}")
except Exception as e:
logger.warning(f"uploadSBOM, Exception: {type(e)=}, {str(e)=}, {e.msg=}")
raise HTTPException(status_code=500, detail=f"Exception: {type(e)=}, {str(e)=}, {e.msg=}")
return JSONResponse(content={
"message": "Upload successful!"

View File

@@ -1,3 +0,0 @@
#!/bin/bash
./.venv/bin/gunicorn sbom_dt_dd_api:app -k uvicorn.workers.UvicornWorker -w 4 -b 0.0.0.0:8000