Dependency-Track и SonarQube в GitLab CI: проверка кода и зависимостей

SonarQube ищет проблемы в вашем коде (SAST), Dependency-Track следит за уязвимостями в сторонних библиотеках (SCA) по списку компонентов SBOM. Ниже подключение обоих к GitLab CI. Предполагается, что обе системы уже развёрнуты и доступны раннеру по внутреннему адресу.
Шаг 1. Токены в переменных GitLab
В проекте откройте Settings → CI/CD → Variables и создайте:
SONAR_HOST_URL— адрес SonarQube;SONAR_TOKEN— токен проекта из SonarQube;DT_URL— адрес Dependency-Track;DT_API_KEY— ключ API команды с правомBOM_UPLOADиPROJECT_CREATION_UPLOAD.
Отметьте токены как Masked и Protected. Токены не должны попасть в репозиторий и журналы: секреты в git.
Шаг 2. SonarQube в конвейере
sonarqube:
stage: test
image:
name: sonarsource/sonar-scanner-cli:latest
entrypoint: [""]
variables:
GIT_DEPTH: "0"
script:
- sonar-scanner
-Dsonar.projectKey=$CI_PROJECT_PATH_SLUG
-Dsonar.sources=.
-Dsonar.host.url=$SONAR_HOST_URL
-Dsonar.token=$SONAR_TOKEN
-Dsonar.qualitygate.wait=true
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Параметр qualitygate.wait=true заставляет задание завершиться с ошибкой, если проект не прошёл quality gate. Без него конвейер всегда зелёный. В старых версиях сканера вместо sonar.token используется sonar.login. Закрепите версию образа вместо latest.
Шаг 3. SBOM и загрузка в Dependency-Track
Для генерации списка компонентов выберите утилиту под язык, например cdxgen (универсальная) или cyclonedx-py для Python.
dependency-track:
stage: test
image: node:20
script:
- npx @cyclonedx/cdxgen -o bom.json .
- curl -fsS -X POST "$DT_URL/api/v1/bom"
-H "X-Api-Key: $DT_API_KEY"
-F "autoCreate=true"
-F "projectName=$CI_PROJECT_PATH_SLUG"
-F "projectVersion=$CI_COMMIT_REF_SLUG"
-F "bom=@bom.json"
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Dependency-Track не заваливает конвейер сам: он принимает BOM и анализирует асинхронно. Правила (политики) и уведомления о новых уязвимостях настраиваются в его интерфейсе. Если нужна блокировка сборки, запросите метрики проекта через API и сравните с порогом в следующем шаге.
Шаг 4. Не открывайте системы наружу
- SonarQube и Dependency-Track должны быть доступны раннеру по внутренней сети, а не из интернета.
- Измените пароли по умолчанию. Дополнительно: безопасность Docker для самих контейнеров систем.
Как проверить
- В GitLab задание
sonarqubeзелёное, а на тестовой ветке с заведомой проблемой падает на quality gate. - В SonarQube появился проект с ключом из
$CI_PROJECT_PATH_SLUGи свежим анализом. - В Dependency-Track в списке проектов появился проект с компонентами и найденными уязвимостями.
- Команда
curlзавершается с кодом 0. Ошибка 401 означает неверный ключ, 403 — недостаточно прав у команды.
Общий порядок защиты узла, где работает раннер: hardening Linux.

















