Перейти к содержанию

Аналитика дубликатов кода

Модуль Аналитика дубликатов кода находит повторяющиеся фрагменты кода (клоны) в проекте и показывает, какая доля кодовой базы дублируется и как этот показатель меняется со временем. Дублирование — один из главных источников ошибок сопровождения: исправление в одном месте легко забыть продублировать в остальных. Модуль помогает контролировать уровень дублирования и отслеживать эффект от рефакторинга. Поддерживаются различные языки программирования (JavaScript, TypeScript, Java, C#, Python, Ruby, PHP, Go, C++, Swift, Kotlin, Scala, Rust и другие).

Как запускается анализ

Анализ выполняется автоматически в CI/CD-пайплайне проекта: при каждом прогоне пайплайна с подключённым шагом анализа формируется новый отчёт по текущему состоянию ветки. Каждый отчёт фиксирует ветку, коммит и автора коммита, для которых выполнялся анализ.

Отдельных действий от пользователя для построения отчёта не требуется — достаточно, чтобы шаг анализа был подключён в пайплайн проекта.

Для подключения шага поиска дубликатов в пайплайн необходимо выполнить следующие шаги:

  1. В меню проекта выберите пункт Сборка и его подпункт Редактор конвейера.

  2. На странице Редактор конвейера представлена кнопка DuplicateCheck. Она копирует шаблон для поиска дубликатов кода в буфер обмена. Шаблон включает в себя фрагмент для поиска дубликатов кода code-duplication с вызовом скрипта analyze.sh. Содержимое шаблона можно вставить в конфигурационный файл пайплайна .appsec_code-ci.yml.

  3. Результаты выполнения скрипта выводятся в лог пайплайна и сохраняются в форматах HTML, JSON и CSV. Созданные отчёты сохраняются в артефактах выполненного задания в каталоге code-duplication-reports. Там же сохраняется лог анализа.

  4. После завершения выполнения скрипта метрики по дубликатам доступны в пользовательском интерфейсе.

Где смотреть результаты

Раздел доступен на уровне проекта:

Проект → боковое меню → Анализ → Аналитика дубликатов кода

Страница называется Отчет по дубликатам и содержит:

  1. Фильтры — выбор ветки и диапазона дат.
  2. Блок Последний отчёт от {дата} — таблица показателей самого свежего отчёта по выбранной ветке. Рядом с датой выводится ссылка на детальный файл отчёта (CSV) со списком найденных дубликатов — по ней можно посмотреть, какие именно фрагменты и в каких файлах дублируются.
  3. Блок Срез — таблица изменений показателей за выбранный период дат.

Если данных нет, в таблицах отображается No data, а вместо даты последнего отчёта — сообщение Нет данных о последнем отчёте.

Метрики и как они считаются

Последний отчёт

Показатель Что показывает
Количество просканированных файлов Сколько файлов проекта попало в анализ
Количество клонов Сколько повторяющихся блоков кода найдено
Дублированные строки Сколько строк кода входит в найденные клоны
% дублирования Доля дублированных строк от общего числа строк: дублированные строки / все строки × 100
Новые клоны Сколько клонов появилось по сравнению с предыдущим анализом
Новые дублированные строки Сколько дублированных строк добавилось по сравнению с предыдущим анализом

Срез (изменения за период)

Срез рассчитывается, только когда выбран период дат и в него попадает не менее двух отчётов. Сравниваются первый и последний отчёты периода:

Показатель Как считается
Всего отчетов в выборке Число отчётов, попавших в выбранный период по выбранной ветке
Прирост/убыль клонов Количество клонов в последнем отчёте минус в первом; знак «+» — дублирование выросло, «−» — снизилось
Прирост/убыль дублированных строк Дублированные строки в последнем отчёте минус в первом
Изменение процента дублирования Процент дублирования в последнем отчёте минус в первом, с точностью до сотых
Новые клоны Сумма новых клонов по всем отчётам периода — сколько всего дублей добавлялось за период
Новые дублированные строки Сумма новых дублированных строк по всем отчётам периода

Фильтры и параметры

Фильтр Описание По умолчанию
Ветка Отчёты отбираются по ветке, для которой выполнялся анализ. Можно выбрать ветку или тег Ветка проекта по умолчанию
Период дат Диапазон с — по; влияет на блок Срез. Блок Последний отчёт всегда показывает самый свежий отчёт по ветке независимо от периода Не задан (срез не рассчитывается)

Выбранные фильтры сохраняются в адресе страницы — ссылкой можно поделиться.

Как читать результаты

  • % дублирования — главный показатель здоровья кодовой базы: следите за его трендом, а не только за абсолютным значением.
  • Отрицательный «прирост/убыль» в срезе — рефакторинг работает: дублирования стало меньше.
  • Большие «новые клоны» при стабильном итоговом проценте — дубли регулярно добавляются и удаляются; стоит обратить внимание на практики код-ревью.
  • Конкретные места дублирования смотрите в детальном файле отчёта по ссылке рядом с датой последнего отчёта.