Detekt potential-bugs 그리고 Gradle

fobidlim
4 min readMay 13, 2020

--

코틀린은 null safety(?.), not null operator(!!)를 지원합니다.

불필요한 null safety, not null operator을 사용하면, 안드로이드 스튜디오에서 이를 감지하고 알려주죠.

최근 이를 인지하지 못한 채 앱을 배포했다가, 핫픽스를 한 사례가 발생했습니다.

코드를 수정할 때 마다 수백개에 달하는 파일과 7만줄이 넘어가는 코드를 하나씩 찾아보기에는 시간과 비용이 너무 많이 듭니다.

CI가 이미 구축되어있는 프로젝트이기때문에, 파이프라인에 코드 분석을 끼워넣기 위해 SonarQube, CODEBEAT, ktlint, detekt를 모두 비교해보았고, 위 사례를 검출해주는건 detekt 뿐이었습니다.

detekt는 comments, complexity, coroutines, empty-blocks, exceptions, formatting, naming, performance, potential-bugs, style 항목의 룰이 있고, 불필요한 null safety, not null operator는 potential-bugs에 포함됩니다.

detekt를 사용하는 방법은 gradle task, detekt cli를 사용하는 방법으로 두가지가 있습니다.

하지만 gradle task로는 제가 원하는 UnnecessaryNotNullOperator , UnnecessarySafeCall을 검출하지 하고, detekt cli를 사용하되, --classpath, -cp 옵션을 추가해야만 검출됩니다.

안타깝게도 gradle task에는 cli 옵션을 추가할 수 없습니다.

따라서, detekt cli를 gradle task로 수행하는 task를 직접 만들게 되었습니다.

configurations {
detekt
}

task detekt(type: JavaExec) {
main = "io.gitlab.arturbosch.detekt.cli.Main"
classpath = configurations.detekt
def classpath = "$rootDir/app/src/main/kotlin"
def input = "$rootDir/app/src/main/kotlin"
def config = "$rootDir/detekt/config/detekt.yml"
def report = "xml:$rootDir/detekt/detekt.xml"
def params = ['-cp ', classpath, '-i', input, '-c', config, '-r', report]
args(params)
}

dependencies {
detekt("io.gitlab.arturbosch.detekt:detekt-cli:1.8.0")
}

cli가 있는데 왜 굳이 gradle을 사용하냐고 물으신다면, Jenkins로 보고서를 확인하기 위함입니다.

Jenkins 서버에 detekt cli를 설치하면 되지 않냐고 물으신다면, 어차피 안드로이드는 gradle에 의존하기 때문에, 의존성을 더 추가해서 버전에 구속받고싶지 않았습니다.

보다 정확한 cli 사용법은 아래 문서를 참고하시길 바랍니다.

--

--