Analyzing with SonarQube Extension for VSTS/TFS

By SonarSource – MIT – Issue Tracker  Sources 
SonarQube/SonarCloud Extension for TFS-VSTS

Table of Contents

기능

Team Foundation Buid의 새로운 구조를 활용해 Visual Studio Team Services(VSTS)(구 VSO) 및 Team Foundation Server(TFS) 설치형 버전에서 빌드와 릴리즈를 통합할 수 있습니다., 이를 위해서는 여러분의 VSTS 계정 혹은 TFS 서버에 public extension이 설치되어 있어야 합니다. 이 확장 패키지를 사용해 SonarQube에서 지원하는 모든 언어를 분석할 수 있습니다.

호환성

  • v3.x는 다음 시스템과 호환됩니다:
    • TFS 2015 Update 3
    • TFS 2017 Update 1
    • VSTS
  • v4.x는 다음 시스템과 호환됩니다:
    • TFS 2017 Update 2+
    • TFS 2018
    • VSTS

SonarQube 5.6+ (LTS)

SonarQube Extension에는 SonarQube Scanner for MSBuild가 포함되어 있습니다.

SonarQube Extention3.1.04.1.0
SonarQube Scanner for MSBuild4.0.04.0.2

설치

  1. 분석을 수행할 머신에 .NET framework v4.5.2+가 설치되어 있어야 합니다
  2. 분석을 수행할 머신에 Java Runtime Environment 8이 설치되어 있어야 합니다
  3. 마켓 플레이스에서 SonarQube extention을 설치합니다.

  

TFS manual install

Note: 사용하는 TFS 버전이 2017 Update 2 이전의 버전이 경우에는, 사용자가 직접 VSIX v3.x 최신버전을 다운로드 받아 설치하여야 합니다.

  • VSIX는 GitHub 저장소의 릴리즈 페이지에서 다운로드할 수 있습니다.
  • SonarQube Exstion 3.0 문서를 참조합니다.


사용

SonarQube 서비스 환경설정

가장 먼저 VSTS 프로젝트 설정에 SonarQube 서버를 서비스 엔드포인트로 설정해야 합니다. SonarQube 엔드 포인트 설정 문서를 참조합니다.

분석 설정 및 분석 수행

프로젝트 분석을 수행하기 위해서는, extension이 다음 3가지 태스크를 제공해야 합니다.

  • Prepare Analysis Configuration 태스크. 이 태스크는 빌드를 실행하기 전 필요한 속성들을 설정합니다.
    • 이 태스크는 반드시 필요합니다(mandatory).
    • .NET solution 혹은 Java 프로젝트인 경우 MSBuild, Maven 및 Gradle 태스크를 활용해 유연하게 통합할 수 있습니다.
  • Run Code Analysis 태스크. 이 태스크는 실제 소스 코드 분석을 수행합니다.
    • Maven 혹은 Gradle  프로젝에서는 Maven/Gradle 빌드에서 scanner가 수행되므로, 이 태스크는 별도로 필요하지 않습니다.
  • Publish Analysis Result 태스크. 이 태스크는 Quality Gate 상태를 빌드 요약 정보에 표시하며, 이 정보를 활용해 품질 관점에서 해당 애플리케이션이 프로덕션에 릴리즈 가능한지 판단할 수 있습니다.
    • 이 태스크는 선택 사항입니다.
    • 이 태스크는 SonarQube 분석이 종료될 때까지 대기하기 때문에, 빌드 시간이 크게 증가될 수 있습니다. 

이 태스크들을 추가하려면, 태스크 검색창에 "SonarQube"를 입력합니다:

하나의 .NET solution 분석하기

  1. 빌드 정의에 다음을 추가합니다:
    • 필수: Prepare Analysis Configuration 태스크, Run Code Analysis 태스크
    • 선택: Publish Analysis Result 태스크
  2. 태스크 순서를 다음과 같이 조정합니다:
    • Prepare Analysis Configuration: 모든 MSBuild 혹은 Visual Studio Build 태스크 이전 
    • Run Code Analysis: Visual Studio Test 태스크 이후
    • Publish Analysis Result
  3. Prepare Analysis Configuration 빌드 스텝을 클릭하여 다음과 같이 설정합니다:
    1. SonarQube Server 섹션에서 사용할 엔드포인트(예를 들어, SonarQube Server 인스턴스)를 지정합니다:
      1. 드롭다운 리스트에서 기존 설정된 엔드포인트를 선택하거나
      2. 새로운 엔드 포인트를 추가하거나
      3. 기존 설정된 엔드포인트를 관리할 수 있습니다.
    2. Integrate with MSBuild 체크 박스에 체크합니다. 다음 값을 설정합니다(project key는 필수입니다):
      1. Project Key - SonarQube 인스턴스에서 관리하는 고유의 프로젝트 키 값
      2. Project Name - SonarQube 인스턴스에서 관리하는 프로젝트의 이름
      3. Project Version - SonarQube 인스턴스에서 관리하는 프로젝트의 버전
    3. 테스트 커버리지 리포트를 사용하고자 하는 경우, Additional Properties 텍스트 영역에 아래와 같이 입력할 수 있습니다:
      sonar.cs.vscoveragexml.reportsPaths=**/*.coveragexml
  4. Visual Studio Test 태스크를 클릭하고, Code Coverage Enabled 체크 박스에 체크를 하면 code coverage가 활성화되고 결과 보고서를 SonarQube에서 임포트할 수 있습니다(선택사항이지만 권장함).

모든 내용이 설정되었다면, 빌드를 수행할 수 있습니다.

Maven 혹은 Gradle로 Java 프로젝트 분석하기

  1. 빌드 정의에 다음을 추가합니다:
    • (필수) Prepare Analysis Configuration 태스크 (하나 이상)
    • (선택) Publish Analysis Result 태스크
  2. 위에서 추가한 태스크를 아래 순서로 정렬합니다:
    • Prepare Analysis Configuration 태스크: Maven 혹은 Gradle 태스크 이전 위치
    • Publish Analysis Result 태스크: Maven 혹은 Gradle 태스크 이후 위치
  3. Prepare Analysis Configuration 빌드 스탭을 다음과 같이 설정합니다:
    1. SonarQube 서버 선택
    2. Integrate with Maven or Gradle 선택
  4. Maven 혹은 Gradle 태스크의 Code Analysis 섹션에서 Run SonarQube or SonarCloud Analysis를 선택합니다.

다른 타입의 프로젝트 분석하기

.NET 어플리케이션 혹은 Java 프로젝트를 개발하지 않는 경우, 다음 방법으로 분석을 수행할 수 있습니다:

  1. 빌드 정의에 다음을 추가합니다:
    • (필수) Prepare Analysis Configuration 태스크 및 Run Code Analysis 태스크 (하나 이상)
    • (선택) Publish Analysis Result 태스크
  2. 위에서 추가한 태스크를 아래 순서로 정렬합니다:
    • 1 - Prepare Analysis Configuration 태스크
    • 2 - Run Code Analysis 태스크
    • 3 - Publish Analysis Result 태스크
  3. Prepare Analysis Configuration 빌드 스탭을 다음과 같이 설정합니다:
    1. SonarQube Server 선택
    2. Use standalone scanner 선택
    3. 이후 다음과 같이 설정합니다:
      1. SCM에 저장된 sonar-project.properties 파일에 SonarQube 속성값들을 정의한 뒤, "Settings File" 항목이 해당 파일을 가르치도록 정확하게 지정하거나
      2. SCM을 사용하지 안흔ㄴ 경우, Manually provide configuration을 클릭한 뒤, 속성값들을 직접 입력합니다(호환성이 낮으므로, 권장하지 않음)

모든 내용이 설정되었다면, 빌드를 수행할 수 있습니다.

SonarCloud 사용자의 경우에는?

SonarCloud에서 프로젝트를 분석하는 경우, VSTS 익스텐션을 설치해야 합니다: https://marketplace.visualstudio.com/items?itemName=SonarSource.sonarcloud

SonarCloud는 이 페이지에서 설명한 모든 기능을 포함한 사용자 편의 기능을 제공합니다:

  • 서비스 연결을 테스트할 수 있는 하나의  SonarCloud 전용 엔드포인트
  • 사용자가 소속된 조직 지원 기능을 내장하고 있는 Prepare Analysis Configration 태스크

이 익스텐션을 사용할 경우, 빌드 정의에 SonarQube가 아닌 SonarCloud 태스크를 추가해야 합니다:

    

FAQ

Linux 혹은 macOS 에이전트에서의 분석을 트리거할 수 있습니까?

SonarQube 태스크 익스텐션은 4.0 버전부터 Noje.js로 완전히 새롭게 작성되어 해당 작업을 수행할 수 있습니다. 단,  아직 mono에 대한 의존성이 남아있으며 향후 해결할 계획입니다.

4.0 버전 이전의 익스텐션에서는 해당 기능을 지원하지 않습니다.

나의 풀 리퀘스트를 눈에 띄게 표시할 수 있습니까?

해당 기능은 현지 지원하지 않으나, 가까운 미래에 지원할 계획입니다.

이전버전(3.0)에서는 MSBuild를 사용해 분석한 .NET 솔루션에 대해서만 해당 기능을 지원합니다. 보다 자세한 내용은 여기를 참조하십시오.

품질 게이트 상태에 따라 빌드를 실패하도록 할 수 있습니까?

해당 기능은 4.0 버전의 익스텐션에서 지원하지 않습니다. CI의 빌드를 깨뜨리는 것을 올바른 방법이라고 생각하지 않습니다. 대신, 풀 리퀘스트 데코레이션(개발자가 새롭게 작성한 코드로 인해 새로운 이슈가 발생하지 않았음을 확인)을 제공하고, 품질 게이트의 상태를 릴리즈 프로세스의 하나로 고려하도록 할 계획입니다.


Simple Project

Ant 빌드 스크립트에 sonar Ant 타겟을 정의합니다:

build.xml
<project name="My Project" default="all" basedir="." xmlns:sonar="antlib:org.sonar.ant">
...
  
<!-- Define the SonarQube global properties (the most usual way is to pass these properties via the command line) -->
<property name="sonar.host.url" value="http://localhost:9000" />
 
...
  
<!-- Define the SonarQube project properties -->
<property name="sonar.projectKey" value="org.sonarqube:sonarqube-scanner-ant" />
<property name="sonar.projectName" value="Example of SonarQube Scanner for Ant Usage" />
<property name="sonar.projectVersion" value="1.0" />
<property name="sonar.sources" value="src" />
<property name="sonar.java.binaries" value="build" />
<property name="sonar.java.libraries" value="lib/*.jar" />
...
 
<!-- Define SonarQube Scanner for Ant Target -->
<target name="sonar">
    <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
        <!-- Update the following line, or put the "sonarqube-ant-task-*.jar" file in your "$HOME/.ant/lib" folder -->
        <classpath path="path/to/sonar/ant/task/lib/sonarqube-ant-task-*.jar" />
    </taskdef>
 
    <!-- Execute SonarQube Scanner for Ant Analysis -->
    <sonar:sonar />
</target>
...

프로젝트 베이스 디렉토리에서 다음 명령어를 실행하면 분석이 수행됩니다:

ant sonar

보안

Execute Analysis 권한을 가지고 있는 사용자는 누구나 분석을 수행할 수 있습니다.

Anyone 그룹에 Execute Analysis 권한이 부여되어 있지 않거나, SonarQube 인스턴스에 보안 설정이 된 경우에는(sonar.forceAuthentication=true) Execute Analysis 권한을 부여받은 사용자의 토큰값을 sonar.login 속성값으로 설정해야 합니다.

예: sonar-scanner -Dsonar.login=[my analysis token]

샘플 프로젝트

다음 링크에서 간단한 프로젝트 샘플을 다운로드 할 수 있습니다: https://github.com/SonarSource/sonar-scanning-examples/tree/master/sonarqube-scanner-ant

멀티-모듈 프로젝트

상위 및 하위 모듈의 환경 설정은 상위(parent) build.xml 파일에 설정해야 합니다:

Parent build.xml
... 
<!-- Set modules IDs -->
<property name="sonar.modules" value="module-one,module-two"/>
   
<!-- For modules, properties are inherited from the parent. They can be overridden as shown below: -->
<property name="module-one.sonar.projectName" value="Module One" />
<property name="module-one.sonar.sources" value="sources/java" />
<property name="module-one.sonar.binaries" value="target" />
<!-- Default module base directory is <curent_directory>/<module_ID>. It can be overridden if necessary -->
<property name="module-one.sonar.projectBaseDir" value="Module 1" /> 
...

디버그 로그 활성화

일반적인 Ant verbose 옵션을 사용해 디버그 로그를 활성화 할 수 있습니다: -v

ant sonar -v

Advanced Usage

build.xml 파일 혹은 command-line 파라미터를 사용해 분석 파라미터를 추가 설정할 수 있습니다.

© 2017-2018 Moses Kim.

별도의 언급이 없는 한, 이 스페이스의 컨텐츠는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
SONARQUBE는 SonarSource SA의 트레이드 마크입니다. 모든 트레이트 마크 및 저작권은 각 소유자의 소유물입니다.

::: SonarQube 관련 문의 : 이메일 :::