Сканирование безопасности загружает в пайплайн Software Bill of Materials (SBOM) в формате CycloneDX. Две страницы проекта читают этот артефакт и показывают его содержимое:
| Страница | Адрес | Что показывает |
|---|---|---|
| «Список зависимостей» | /-/security/dependencies | Компоненты SBOM: имя, версия, тип, лицензия, идентификатор пакета |
| «Соответствие лицензий» | /-/security/licenses | Лицензии этих компонентов и количество компонентов под каждой |
Обе страницы доступны только для чтения и открываются из раздела «Безопасность» в боковом меню проекта.
Условия доступности
Обе страницы есть в разделе «Безопасность», пока выполнены все условия; иначе их адреса отвечают 404:
- в настройках проекта включена функция «Безопасность и соблюдение норм»;
- у пользователя в проекте роль Developer, Maintainer или Owner;
- на инстансе включён фича-флаг
fe_security_scan_policies; - лицензия установки включает сканирование безопасности.
Фича-флаг fe_security_scan_policies по умолчанию выключен. Пока он выключен, обе страницы скрыты вместе со страницами политик и интеграций со сканерами. Попросите администратора инстанса включить его.
Откуда берутся данные
Обе страницы читают последний пайплайн ветки по умолчанию проекта в любом его статусе: у выполняющегося пайплайна артефакта ещё нет, а у упавшего остаются отчёты, которые задания загрузили с artifacts:when: always.
Из этого пайплайна берутся все артефакты заданий с типом отчёта cyclonedx. Такой отчёт пишет сканирование codescoring: задание codescoring_sca публикует gl-sbom.cdx.json как artifacts:reports:cyclonedx. Задание из собственного .gitlab-ci.yml проекта, которое загружает отчёт того же типа, попадает на эти страницы так же.
Компоненты из всех таких артефактов объединяются в одну таблицу. Компонент остаётся в ней один раз и опознаётся по идентификатору пакета, а если идентификатора нет — по имени и версии. Поэтому обе страницы показывают всё, что сообщили анализаторы пайплайна вместе.
В базе данных ничего не хранится: каждый запрос заново читает и разбирает артефакты. Чтобы обновить данные, запустите новый пайплайн в ветке по умолчанию.
Над таблицей обе страницы показывают, откуда взят SBOM: статус пайплайна, его номер, коммит, время запуска и кнопку скачивания для каждого артефакта CycloneDX — «Скачать SBOM» или «Скачать SBOM (<имя задания>)», если в пайплайне их несколько. Пользователю без доступа к артефактам заданий проекта кнопка не показывается. Строка ниже называет ветку: «Данные взяты из последнего пайплайна в ветке main. Запустите новый пайплайн, чтобы обновить их.»
Для проекта, в ветке по умолчанию которого нет ни одного пайплайна, этого блока нет.
Список зависимостей

Столбцы таблицы:
| Столбец | Что содержит |
|---|---|
| «Компонент» | Имя компонента из SBOM |
| «Версия» | Версия компонента |
| «Тип» | Тип компонента по CycloneDX: library, application, container и другие |
| «Лицензия» | Лицензии, объявленные компонентом, через запятую; «Неизвестно», если он не объявил ни одной |
| «Идентификатор» | Идентификатор пакета в формате purl |
На страницу выводится 50 строк. Над таблицей стоит количество компонентов в SBOM, а при заданном фильтре — «Фильтрам соответствует 6 из 194 компонентов.»
Элементы управления над таблицей:
| Элемент | Что делает |
|---|---|
| «Поиск» | Оставляет компоненты, в имени которых есть введённый текст, без учёта регистра |
| «Тип» | Оставляет компоненты одного типа |
| «Лицензия» | Оставляет компоненты под одной лицензией; «Неизвестно» оставляет те, что не объявили ни одной |
| «Сортировка» | Задаёт порядок строк: «Имя, от А до Я» (по умолчанию), «Имя, от Я до А», «Тип», «Лицензия» |
Кнопка «Применить» применяет выбранные значения. Кнопка «Сбросить фильтры» появляется, когда задан хотя бы один фильтр, и возвращает полный список. Списки «Тип» и «Лицензия» строятся по всему SBOM, поэтому сужение одного из них сохраняет варианты другого.

Выбранные значения хранятся в адресе, поэтому отфильтрованный список можно сохранить в закладки или отправить коллеге: /-/security/dependencies?license=GPL-3.0-only&sort=name_desc.
Фильтр, которому ничего не соответствует, показывает «Нет зависимостей, соответствующих фильтрам» и подсказку «Измените или сбросьте фильтры, чтобы увидеть больше компонентов.»
Соответствие лицензий

Столбцы таблицы:
| Столбец | Что содержит |
|---|---|
| «Лицензия» | Идентификатор лицензии из SBOM; «Неизвестно» собирает компоненты, которые не объявили лицензию |
| «Компоненты» | Сколько компонентов под этой лицензией. Число ведёт в список зависимостей, отфильтрованный по ней |
| «Примеры» | До десяти имён компонентов; ссылка «и ещё N» ведёт в тот же отфильтрованный список |
Строки упорядочены по количеству компонентов, от большего к меньшему, а при равном количестве — по алфавиту. Компонент, объявивший несколько лицензий, посчитан под каждой из них, поэтому сумма по строкам больше количества компонентов в SBOM.
«Неизвестно» на обеих страницах содержит одни и те же компоненты, поэтому число в строке и открываемый им отфильтрованный список совпадают.
Состояния отчёта
| Что в пайплайне | Что показывают страницы |
|---|---|
| Артефакта CycloneDX нет | «Пока нет результатов SBOM» и «Запустите пайплайн с включённым сканером CodeScoring, чтобы увидеть здесь зависимости проекта.» |
| Артефакты есть, но ни один не удалось прочитать | «Не удалось прочитать отчёт SBOM» и «Не удалось прочитать последний артефакт сканирования. Проверьте логи задания CodeScoring и перезапустите пайплайн.» |
| Хотя бы один артефакт прочитан | Таблицы. Для SBOM без компонентов — «Зависимости не найдены» или «Лицензии не найдены» |
Один нечитаемый артефакт оставляет остальные на месте: страницы показывают то, что сообщили прочитанные. Блок с пайплайном и кнопками скачивания показывается во всех трёх состояниях, поэтому нечитаемый артефакт можно скачать и разобрать.
Диагностика
Страниц нет в разделе «Безопасность»
Проверьте условия из раздела «Условия доступности»: настройку проекта, свою роль в проекте, фича-флаг и лицензию установки.
«Пока нет результатов SBOM» после успешного пайплайна
Последний пайплайн ветки по умолчанию не загрузил ни одного артефакта с типом отчёта cyclonedx. Проверьте, что:
- пайплайн со сканированием запущен в ветке по умолчанию: пайплайн другой ветки или мерж-реквеста оставляет эти страницы пустыми;
- задание сканирования завершилось и загрузило артефакты — это видно на вкладке «Задания» пайплайна;
- путь в ключе
artifacts:reports:cyclonedxзадания указывает на файл, который задание записало.
«Не удалось прочитать отчёт SBOM»
Скачайте артефакт из блока с пайплайном и откройте его: страницы читают документ CycloneDX в формате JSON. Задание codescoring_sca пишет формат, заданный переменной FE_SCANS_CODESCORING_BOM_FORMAT, по умолчанию cyclonedx_v1_6_json; другой формат загружается в тот же артефакт и здесь не читается.