Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


By SonarSource – GNU LGPL 3 – Issue Tracker  Sources 

SonarQube Scanner for Gradle 2.6.1 – Compatible with SonarQube 5.6+ (LTS)


Panel
borderColor#C3CCD7
bgColor#FCFCFC

Table of Contents

Table of Contents
maxLevel3
indent16px

Features


기능

The

SonarQube Scanner for

Gradle provides an easy way to start SonarQube analysis of a Gradle project.

The ability to execute the SonarQube analysis via a regular Gradle task makes it available anywhere Gradle is available (developer build, CI server, etc.), without the need to manually download, setup, and maintain a SonarQube Runner installation. The Gradle build already has much of the information needed for SonarQube to successfully analyze a project. By preconfiguring the analysis based on that information, the need for manual configuration is reduced significantly. 

Compatibility

The SonarQube Scanner for Gradle version 2.x is compatible with Gradle versions 1.12+ and SonarQube versions 5.6+.

Bytecode created by javac compilation is required for Java analysis, including Android projects.

Users of

Gradle를 사용하면 손쉽게 Gradle 프로젝트를 분석할 수 있습니다.

일반적인 Gradle task에서 SonarQube 분석을 수행할 수 있기 때문에, gradle을 사용할 수 있는 모든 환경(개발 빌드, CI server 등)에서 별도의 수작업(다운로드, 셋업, SonarQube Scanner 설치 등) 없이 분석이 가능합니다. Gradle 빌드에서 생성되는 정보들로 SonarQube 분석을 수행하기에 충분합니다. 해당 정보들을 기반으로 분석을 위한 설정 작업을 수행하기 때문에, 수작업을 통한 환경 설정이 현저하게 줄어듭니다.

호환성

SonarQube Scanner for Gradle v2.x는 Gradle v1.12+ 및 SonarQube v5.6+과 호환됩니다.

Java 프로젝트 및 Android 프로젝트를 분석하는 경우, javac로 컴파일 된 바이트코드가 필요합니다.

Warning
titleSonarQube Scanner for Gradle 1.x
?Module key generation strategy was changed in 2.0 to ensure unicity (see
사용자는 어떻게 하나요?

unicity를 보장하기 위해 SonarQube Scanner for gradle v2.0에서 모듈 키 생성 정책을 변경하였습니다(Image ModifiedSONARGRADL-12 - Avoid duplicate module keys CLOSED

 

 참조).

Upgrading from 1.x to 2.x without care will make all previous issues reappear as "new". You can avoid that by following this workflow:
  • Recommended: Backup your SQ database in case something goes wrong
  • Use module key update feature to change key of all modules (except root module) following this pattern: 

    v1.x에서 v2.x로 업그레드하는 경우, 모든 이슈들이 "new"로 다시 식별될 수 있습니다. 다음 워크플로우를 따라 해당 현상을 방지할 수 있습니다:

    • 권장사항: 만일을 대비해 SonarQube 데이터베이스를 백업합니다
    • module key update 기능을 사용해 모든 모듈(root 모듈 제외)의 키를 다음 패턴에 따라 변경합니다: <root module key>:<module path>
    Reminder
    • . 주의: <root module key>
    is unchanged and should be equal to
    • 는 변경되지 않으며, [<group>:]<name>
  • Update SonarQube plugin in your build.gradle to 2.x
  • Run an analysis
  • Verify issue history was preserved
  • Prerequisites

    • SonarQube is already installed
    • At least the minimal version of Java supported by your SonarQube server is in use
    • The language plugins for each of the languages you wish to analyze are installed
    • You have read Analyzing Code Source

    Configure the Scanner

    Installation is automatic, but certain global properties should still be configured. A good place to configure global properties is 
    • 과 동일해야 합니다.
    • build.gradle의 SonarQube 플러그인 버전을 2.x로 업데이트 합니다.
    • 분석을 수행합니다.
    • Issue 이력이 보존되어 있는지 확인합니다.

    사전 조건

    • SonarQube 서버를 설치합니다.
    • SonarQube 서버가 사용할 Java 버전을 하나 이상 설치합니다.
    • 분석 언어 플러그인을 설치합니다.
    • 소스 코드 분석하기를 숙지합니다.

    스캐너 설정

    설치는 자동 수행되지만, 몇가지 글로벌 속성은 사용자가 직접 설정해야 합니다. 글로벌 속성은  ~/.gradle/gradle.

    properties. Be aware that we are using System properties so all properties should be prefixed by systemProp. 

    properties에서 설정할 수 있습니다. 모든 속성은 System 속성이므로, systemProp prefix를 사용해야 합니다.

    Code Block
    titlegradle.properties
    systemProp.sonar.host.url=http://localhost:9000
     
    
     
    #----- Security (when 'sonar.forceAuthentication' is set to 'true')
    
    systemProp.sonar.login=<token>
     

    분석

    Analysis

    1 -

    Activate the scanner in your buildFor

    빌드에서 스캐너 활성화

    Gradle 2.1+:

     
    Code Block
    titlebuild.gradle
    plugins {
      id 
    
      id "org.sonarqube"
     
     version
     
     "2.6"
    
    }

     

    More details on 

    보다 자세한 내용은 https://plugins.gradle.org/plugin/org.sonarqube


    Assuming a local SonarQube server with out-of-the-box settings is up and running, no further mandatory configuration is required

    를 참조합니다.

    로컬 SonarQube 서버가 정상적으로 설치되고 실행된 상태라고 가정합니다. 별도로 추가 설정을 할 필요는 없습니다.

    2 -

    Run analysis

    분석 실행

    Execute gradle sonarqube and wait until the build has completed, then open the web page indicated at the bottom of the console output. You should now be able to browse the analysis results.

    Configure analysis properties

    The SonarQube Scanner for Gradle leverages information contained in Gradle's object model to provide smart defaults for many of the standard SonarQube properties. The defaults are summarized in the tables below.

     

    Gradle defaults for standard SonarQube properties

     

    gradle sonarqube 명령어를 실행합니다. 분석이 완료되면 로그 하단에 표시되는 웹페이지에서 결과를 확인할 수 있습니다. 별도의 작업이 분석 결과를 정상 확인할 수 있어야 합니다.

    분석 속성 설정하기

    SonarQube Scanner for Gradle은 Gradle의 객체 모델에 포함된 정보를 활용해 SonarQube 표준 속성을 설정합니다. 기본 속값은 아래 테이블에 표시되어 있습니다.

    표준 SonarQube 속성 Gradle 기본값

    PropertyGradle default
    sonar.projectKey

    [${project.group}:]${project.name} for root module

    <root module key>:<module path> for submodules 

    sonar.projectName
    ${project.name}
    sonar.projectDescription
    ${project.description}
    sonar.projectVersion
    ${project.version}
    sonar.projectBaseDir
    ${project.projectDir}
    sonar.working.directory
    ${project.buildDir}/sonar
    Notice that additional defaults are provided for projects that have the 

    추가 속성의 기본값은 java-base

     or java plugin applied:

     

    Additional defaults for Java projects

     

    혹은 java 플러그인이 적용된 프로젝트에 한해 제공합니다:

    Java 프로젝트에 대한 추가 속성의 Gradle 기본값

    PropertyGradle
    default
    dafault
    sonar.sourceEncoding
    ${project.compileJava.options.encoding}
    sonar.java.source
    ${project.sourceCompatibility}
    sonar.java.target
    ${project.targetCompatibility}
    sonar.sources
    ${sourceSets.main.allSource.srcDirs} (filtered to only include existing directories)
    sonar.tests
    ${sourceSets.test.allSource.srcDirs} (filtered to only include existing directories)
    sonar.java.binaries
    ${sourceSets.main.output.classesDir}
    sonar.java.libraries
    ${sourceSets.main.compileClasspath} (filtering to only include files; rt.jar and jfxrt.jar added if necessary)
    sonar.java.test.binaries
    ${sourceSets.test.output.classeDir}
    sonar.java.test.libraries
    ${sourceSets.test.compileClasspath} (filtering to only include files; rt.jar and jfxrt.jar added if necessary)
    sonar.junit.reportPaths
    ${test.testResultsDir} (if the directory exists)

    Additional defaults for Groovy projects

    Same settings than for Java projects plus

    Groovy 프로젝트에 대한 추가 속성의 Gradle 기본값

    Java 프로젝트의 추가 속성에 다음 속성이 추가됩니다:

    PropertyGradle default
    sonar.groovy.binaries
    ${sourceSets.main.output.classesDir}
    Additional defaults when JaCoCo plugin is applied

    JaCoCo 플러그인 적용시, 추가 속성의 Gradle 기본값

    PropertyGradle default
    sonar.jacoco.reportPaths${jacoco.destinationFile}
    sonar.groovy.jacoco.reportPath${jacoco.destinationFile}

     

    Additional defaults for Android projects

    Android 프로젝트에 대한 추가 속성의 Gradle 기본값
    (com.android.application,

     com

    com.android.library

    or com

    혹은 com.android.test)

    By default the first variant of type

    기본적으로 "debug"

    will be used to configure the analysis. You can override the name of the variant to be used using the parameter 'androidVariant': 

    타입의 첫 번쨔 variant를 활용해 분석 환경을 설정합니다. variant를 지정하고자 하는 경우, androidVariant 파라미터를 사용합니다:

    Code Block
    languagebash
    titlebuild.gradle
    sonarqube
    {    androidVariant 
     {
        androidVariant 'fullDebug'
    
    }


    PropertyGradle default

    sonar.sources (for non test variants)

    ${variant.sourcesets.map} (ManifestFile/CDirectories/AidlDirectories/AssetsDirectories/CppDirectories/JavaDirectories/RenderscriptDirectories/ResDirectories/ResourcesDirectories)

    sonar.tests (for test variants)

    ${variant.sourcesets.map} (ManifestFile/CDirectories/AidlDirectories/AssetsDirectories/CppDirectories/JavaDirectories/RenderscriptDirectories/ResDirectories/ResourcesDirectories)
    sonar.java[.test].binaries${variant.destinationDir}
    sonar.java[.test].libraries${variant.javaCompile.classpath} + ${bootclasspath}
    sonar.java.source${variant.javaCompile.sourceCompatibility}
    sonar.java.target${variant.javaCompile.targetCompatibility}

    Passing manual properties / overriding defaults

    The SonarQube Scanner for Gradle adds a SonarQubeExtension extension to project and its subprojects, which allows you to configure/override the analysis properties.

    수동으로 속성 파라미터 및 속성값 설정하기

    Gradle 프로젝트 및 하위프로젝트에 SonrQubeExtention 확장어를 추가해 분석 파라미터를 설정/오버라이딩 할 수 있습니다:

    Code Block
    languagebash
    titlebuild.gradle
    sonarqube
    {
        properties {
            property 
     {
        properties {
            property "sonar.exclusions",
     
     "**/*Generated.java"
        }
    }
    Alternatively, SonarQube properties can be set from the command line. See 
    
        }
    }

    속성 파라미터 및 속성값은 커맨드 라인에서도 입력할 수 있습니다. 더 자세한 정보는 "Configuring properties from the command line"

     for more information

    를 참조합니다.

     

    Analyzing Multi-Project Builds

    To analyze a project hierarchy, apply the SonarQube plugin to the root project of the hierarchy. Typically (but not necessarily) this will be the root project of the Gradle build. Information pertaining to the analysis as a whole has to be configured in the sonarqube block of this project. Any properties set on the command line also apply to this project.

    Global configuration settings

    멀티 프로젝트 빌드 분석하기

    계층구조를 가진 프로젝트를 분석하고자 하는 경우, SonarQube 플러그인은 해당 계층의 루트 프로젝트에 적용해야합니다. 일반적으로(꼭 그런것은 아니지만), 이 위치가 Gradle 빌드의 루트 프로젝트가 됩니다. 분석을 위해 전달하는 모든 정보는 sonarqube 블록에서 설정합니다. 커맨드 라인에서 입력한 모든 속성들도 이 프로젝트에 적용됩니다:

    Global configuration 설정

    Code Block
    languagebash
    titlebuild.gradle
    sonarqube
    {
        properties {
            property 
     {
        properties {
            property "sonar.sourceEncoding",
     
     "UTF-8"
        }
    }
     
    
        }
    }

    Shared configuration

    settingsConfiguration shared between subprojects can be configured in a subprojects block.

    설정

    하위 프로젝트들이 공유하는 설정은 subprojects 블럭에 정의합니다:

    Code Block
    languagebash
    titlebuild.gradle
    subprojects
    {
        sonarqube {
            properties {
                property 
     {
        sonarqube {
            properties {
                property "sonar.sources",
     
     "src"
            }
        }
    }
     
    
            }
        }
    }

    Individual configuration

    settingsProject-specific information is configured in the sonarqube block of the corresponding project. 

    설정

    특정 프로젝트 범위로 제한되는 설정은 해당 프로젝트의 sonarqube 블록에서 정의합니다:

    Code Block
    languagebash
    titlebuild.gradle
    project(":project1")
    {
        sonarqube {
            properties {
                property 
     {
        sonarqube {
            properties {
                property "sonar.branch",
     
     "Foo"
            }
        
    
            }
        }}

     

    Skipping analysis of a project

    To skip SonarQube analysis for a particular subproject, set sonarqube.skipProject to true.

     

    특정 프로젝트를 분석에서 제외하기

    특정 프로젝트를 분석 대상에서 제외하고자 하는 경우, sonarqube.skipProject 값을 true로 설정합니다:

    Code Block
    languagebash
    titlebuild.gradle
    project(":project2")
    {
        sonarqube {
            skipProject = true
        }
    }

     

    Analyzing Custom Source Sets

    By default, the SonarQube Scanner for Gradle passes on the project's main source set as production sources, and the project's test source set as test sources. This works regardless of the project's source directory layout. Additional source sets can be added as needed.

    Analyzing custom source sets
     {
        sonarqube {
            skipProject = true
        }
    }


    커스텀 소스 셋 분석하기

    기본적으로 SonarQube Scanner for Gradle은 분석 대상 프로젝트의 디렉토리 레이아웃과 관계없이 main source set을 프로덕션 소스로, test source set을 테스트 소스로 전달합니다. 추가 source set 설정이 필요한 경우 아래와 같이 설정합니다.

    Analyzing custom source set
    Code Block
    languagebash
    titlebuild.gradle
    sonarqube
    {
        properties {
            
     {
        properties {
            properties["sonar.sources"] += sourceSets.custom.allSource.srcDirs
            
    
            properties["sonar.tests"] += sourceSets.integTest.allSource.srcDirs
        }
    }

     

    More on configuring SonarQube properties

    Let's take a closer look at the sonarqube.properties {} block. As we have already seen in the examples, the property() method allows you to set new properties or override existing ones. Furthermore, all properties that have been configured up to this point, including all properties preconfigured by Gradle, are available via the properties accessor.

    Entries in the properties map can be read and written with the usual Groovy syntax. To facilitate their manipulation, values still have their “idiomatic” type (FileList, etc.). After the sonarProperties block has been evaluated, values are converted to Strings as follows: Collection values are (recursively) converted to comma-separated Strings, and all other values are converted by calling their toString() method.

    Because the sonarProperties block is evaluated lazily, properties of Gradle's object model can be safely referenced from within the block, without having to fear that they have not yet been set.

    Setting properties from the Command Line

    SonarQube properties can also be set from the command line, by setting a system property named exactly like the SonarQube property in question. This can be useful when dealing with sensitive information (e.g. credentials), environment information, or for ad-hoc configuration.
     
    
        }
    }

    SonarQube 속성 설정

    sonarqube.properties {} 블록을 조금 더 살펴보도록 하겠습니다. 예제에서 이미 본 바와 같이 property() 메소드를 사용해 새로운 속성을 설정하거나, 기존 속성을 오버라이딩할 수 있습니다. 또한 Gradle에 의해 사전 설정된 속성들을 포함해 이 시점까지 설정된 모든 속성들은 properties 접근자를 통해 사용할 수 있습니다. properties map의 엔트리들은 일반적인 Groovy 문법을 사용해 읽어들이거나 덮어쓸 수 있습니다. 편리한 데이터 조작을 위해 각 값들은 "idiomatic" 타입(File, List, 등)을 가집니다. sonarProperties 블록을 확인한 후, 각 값들은 다음과 같이 String으로 변경됩니다:

    • Collection values → Comma-seperated Strings
    • Other values → Strings

     Gradle의 객체 모델의 속성들을 사용하는 데 문제가 없도록, sonarProperties 블록에 대한 확인 작업은 가능한 늦은 시점에(lazily) 수행됩니다.

    Command Line을 통한 속성 설정

    커맨드 라인 명령어의 인자로 SonarQube 속성값을 동일하게 사용해 SonarQube 속성을 설정할 수 있습니다. 민감한 정보(예를 들면 credential 등)나 환경 정보 혹은 일시적인 설정을 해야할 경우 유용하게 사용할 수 있습니다.

    Code Block
    gradle sonarqube -Dsonar.host.url=http://sonar.mycompany.com -Dsonar.verbose=true
    While certainly useful at times, we do recommend to keep the bulk of the configuration in a (versioned) build script, readily available to everyone.

    A SonarQube property value set via a system property overrides any value set in a build script (for the same property). When analyzing a project hierarchy, values set via system properties apply to the root project of the analyzed hierarchy. Each system property starting with ""sonar." will be taken into account.

    Task dependencies

    Before executing the sonarqube task, all tasks producing output to be included in the SonarQube analysis need to be executed. Typically, these are compile tasks, test tasks, and code coverage tasks. To meet these needs, the plugins adds a task dependency from sonarqube on test if the java plugin is applied. Further task dependencies can be added as needed. For example:

    위와 같은 방법이 때로 유용할 수 있으나, 가급적이면 속성 정보는 (버전 관리된) 빌드 스크립트에 저장해서 모든 사람들이 잘 알 수 있도록 하는 것을 권장합니다.

    시스템 속성을 통해 설정된 하나의  SonarQube 속성 값은 빌드 스크립트의 값을 오버라이드합니다. 계층 구조를 가진 프로젝트를 분석하는 경우, 시스템 속성을 통해 설정된 SonarQube 속성 값들은 계층 구조의 root에 반영됩니다. "sonar."로 시작하는 모든 속성이 이에 해당합니다.

    태스크 의존성

    sonarqube 태스크를 실행하기 전 SonarQube 분석에 필요한 산출물을 생성하는 모든 태스크들을 실행해야 합니다. 일반적으로 compile 태스크, test 태스크 및 code coverage 태스크들이 이에 포함됩니다. 이와 같은 실행을 보장하기 위해 java 플러그인이 적용되는 경우 sonarqube 태스크로부터 test 태스크에 대해 의존성을 설정할 수 있습니다. 아래의 예와 같이 필요한 만큼 의존성을 설정할 수 있습니다:

    Code Block
    languagebash
    titlebuild.gradle
    project.tasks["sonarqube"].dependsOn
     
     "anotherTask"

     

    Example

    A simple working example is available at this URL so you can check everything is correctly configured in your env

    예제

    실제로 동작하는 간단한 예제 소스 코드를 아래에서 다운로드 하실 수 있습니다. 여러분의 환경에 맞춰 필요한 설정을 변경해 사용해 보십시오https://github.com/SonarSource/sonar-scanning-examples/tree/master/sonarqube-scanner-gradle