
В моих предыдущих статьях о качестве кода я писал о моем опыте настройки detekt для получения отчетов о качестве кода в Android проектах и о моем плагине danger-detekt-kotlin для доставки нарушений разработчикам в комментариях merge request. На самом деле, там почти нет ничего специфичного для Android, так что эти статьи можно использовать как руководство для реализации таких вещей в любых проектах на Kotlin с Gradle.
В этой статье мы поговорим о GitLab. Мы используем GitLab как основную платформу для хранения git репозиториев и CI/CD. При внедрении CI мы добавили detekt, чтобы каждый merge request анализировался с использованием четко определенных правил. Это используется для поддержания качества нашего кода в допустимых границах, так как мы запрещаем введение новых нарушений в новых MR. В конце концов, это создает отчет о качестве кода.
Но как работать с этим отчетом? Конечно, любое найденное нарушение - это причина для прерывания pipeline. Но как сказать разработчику, что пошло не так? Мы же не хотим, чтобы наши разработчики делали checkout и запускали те же проверки на своих локальных машинах, верно?
Danger
Danger (danger-kotlin в частности) - это многоцелевая штука. Это просто утилита, которая может комментировать в Merge Requests. Это одновременно и плюс, и минус. Мы ограничены форматом комментариев, но мы действительно гибки в плане конфигурации. Я уже писал шаги по настройке Danger в моих предыдущих статьях, так что вы можете найти их там. Давайте не будем повторяться. Какие есть альтернативы?
Code Quality Reports
GitLab поддерживает отчеты о качестве кода в формате Code Climate из коробки. К сожалению, других форматов не поддерживается. Есть трехлетний issue о добавлении поддержки SARIF, так что есть надежда, но пока нет вариантов. Теоретически, это самый удобный вариант, потому что у него могут быть хорошие интеграции с платформой. Вот документация GitLab на эту тему. Имейте в виду, что доступность подфункций зависит от ценовой категории. GitLab имеет уровни Free < Premium < Ultimate. Давайте посмотрим, какие функции они могут предложить.
Функции
Code Quality Widget
Доступен для всех на уровне Free.
Вот виджет, который показывается в Merge Requests под описанием по завершении pipeline.

Code Quality
Доступен для всех, если ваш уровень как минимум Premium.
GitLab имеет отдельную страницу для деталей pipeline, неважно, запущен ли pipeline из Merge Request или нет. Так что эта функция касается вкладки Code Quality на этой странице pipeline. Это практически то же самое, что и Widget, но для любого pipeline.

Code Quality в diff view
Доступно только для уровня Ultimate.
Вот о чем мы говорим. Нарушения качества кода могут быть показаны инлайн в представлении diff Merge Request, прямо под строкой, где они найдены.

Варианты
Кастомный reporter для Detekt
Существует GitLab Report Detekt Plugin, который реализует кастомный reporter Code Climate прямо из detekt. Вы можете использовать его в конфигурации detekt вот так.
repositories {
maven(url = "https://gitlab.com/api/v4/projects/25796063/packages/maven")
}
dependencies {
detektPlugins("com.gitlab.cromefire:detekt-gitlab-report:0.3.1")
}
tasks.withType<Detekt> {
reports {
custom {
reportId = "DetektGitlabReport"
outputLocation.set(file("$buildDir/reports/detekt/code-climate.json"))
}
}
}
Или используйте ту же идею, чтобы написать свой собственный reporter, это довольно просто.
Чтобы использовать его в нашем CI pipeline, мы просто вызываем detekt как раньше.
Также не забудьте изменить keywords для сбора artifacts в этой задаче GitLab CI.
check:
script:
- ./gradlew detekt
artifacts:
reports:
codequality: build/reports/detekt/code-climate.json
У этого подхода есть один большой недостаток. Он подразумевает, что у нас есть один отчет на модуль, а не один объединенный отчет на проект. Detekt имеет встроенную поддержку объединения форматов XML и SARIF, но не для любого кастомного reporter.
Конвертация
Другой вариант - конвертировать вывод detekt из его форматов Checkstyle XML или SARIF JSON в CodeClimate JSON. Есть библиотека tomasbjerre/violations-lib, которая может парсить отчеты о качестве кода из десятков форматов и получать SARIF или CodeClimate на выходе.
Я написал небольшой плагин convention.violations.gradle.kts для настройки этой логики. Вы можете получить больше информации о convention плагинах здесь в официальной документации Gradle или здесь, например, в моей первой статье.
import se.bjurr.violations.gradle.plugin.ViolationsTask
plugins {
id("se.bjurr.violations.violations-gradle-plugin")
}
val outputReportFile = file("$buildDir/reports/detekt/code-climate.json")
tasks.register<ViolationsTask>("violations") {
doFirst {
outputReportFile.parentFile.mkdirs()
}
codeClimateFile = outputReportFile
violations = listOf(
listOf("SARIF", buildDir.path, ".*/reports/detekt/report.sarif", "sarif"),
)
}
По сути, таким образом я просто зарегистрировал Gradle задачу violations для получения SARIF отчетов из вывода detekt и установил code climate файл в качестве финального вывода.
Я использовал Gradle плагин этой библиотеки se.bjurr.violations:violations-gradle-plugin:1.52.2 в этом примере.
Конечно, чтобы использовать эту задачу, вам нужно применить этот convention плагин. Вы можете использовать блок plugins в корневом build.gradle.
plugins {
id("convention.violations")
}
Использование простое. Просто вызовите задачу gradle violations после gradle detekt.
check:
script:
- ./gradlew detekt
- ./gradlew violations
artifacts:
reports:
codequality: build/reports/detekt/code-climate.json
Заключение
Я верю, что настанет время, когда мы будем жить в мире, где все такие сервисы будут использовать один стандарт для отчетов о качестве кода. Но пока нам нужно немного помочь им, чтобы получить такой потрясающий результат.