ツール  /  SonarQube

SonarQube — Gradle プラグインによる実行・確認

Gradle プロジェクトで sonarqube タスクを使って SonarQube 解析を実行する方法を解説します。 Groovy DSL(build.gradle)・Kotlin DSL(build.gradle.kts)両方の設定例を掲載し、 JaCoCo によるカバレッジ計測、Quality Gate の確認、GitHub Actions での自動化まで網羅します。

1. 前提条件

項目要件
Gradle7.x 以上(Gradle Wrapper の使用を推奨)
JDKJDK 17 以上
SonarQubeSonarQube サーバー(Docker / ZIP 版で起動済みであること)
SonarQube トークンSonarQube UI でプロジェクト作成 + 解析用トークンを発行済みであること

2. build.gradle の設定(Groovy DSL)

Groovy — build.gradle
plugins {
    id 'java'
    id 'jacoco'
    id 'org.sonarqube' version '5.1.0.4882'
}

group = 'com.example'
version = '1.0.0'

java {
    sourceCompatibility = JavaVersion.VERSION_21
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

test {
    useJUnitPlatform()
    finalizedBy jacocoTestReport   // テスト後に JaCoCo レポートを自動生成
}

jacoco {
    toolVersion = '0.8.12'
}

jacocoTestReport {
    dependsOn test
    reports {
        xml.required = true    // SonarQube は XML レポートを参照する
        html.required = true
    }
}

sonar {
    properties {
        property 'sonar.projectKey',   'my-project'
        property 'sonar.projectName',  'My Project'
        property 'sonar.host.url',     'http://localhost:9000'
        property 'sonar.coverage.jacoco.xmlReportPaths',
                 "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"
        property 'sonar.exclusions',   '**/generated/**,**/dto/**'
        property 'sonar.coverage.exclusions', '**/entity/**,**/config/**'
    }
}

3. build.gradle.kts の設定(Kotlin DSL)

Kotlin — build.gradle.kts
plugins {
    java
    jacoco
    id("org.sonarqube") version "5.1.0.4882"
}

group = "com.example"
version = "1.0.0"

java {
    sourceCompatibility = JavaVersion.VERSION_21
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

tasks.test {
    useJUnitPlatform()
    finalizedBy(tasks.jacocoTestReport)
}

jacoco {
    toolVersion = "0.8.12"
}

tasks.jacocoTestReport {
    dependsOn(tasks.test)
    reports {
        xml.required.set(true)
        html.required.set(true)
    }
}

sonar {
    properties {
        property("sonar.projectKey",   "my-project")
        property("sonar.projectName",  "My Project")
        property("sonar.host.url",     "http://localhost:9000")
        property(
            "sonar.coverage.jacoco.xmlReportPaths",
            "${layout.buildDirectory.get()}/reports/jacoco/test/jacocoTestReport.xml"
        )
        property("sonar.exclusions",          "**/generated/**,**/dto/**")
        property("sonar.coverage.exclusions", "**/entity/**,**/config/**")
    }
}
💡 トークンの指定方法
トークンは build.gradle / build.gradle.kts に直接書かず、コマンドラインの -Dsonar.token か 環境変数 SONAR_TOKEN で渡すことを推奨します。 gradle.properties に記述する方法もありますが、リポジトリに含めないよう注意してください。

4. 実行基準 — Quality Gate / Quality Profile

Quality Gate と Quality Profile の設定は SonarQube サーバー側(Web UI)で行います。 Gradle プラグイン側での設定は不要です。

デフォルト条件(Sonar way Gate)閾値
新規コードのバグ0 件
新規コードの脆弱性0 件
新規コードのセキュリティホットスポット100% レビュー済み
新規コードのカバレッジ80% 以上
新規コードの重複率3% 以下

5. 実行方法 — sonarqube タスクの実行

標準的な実行(カバレッジあり)

bash
# テスト実行 → JaCoCo レポート生成 → SonarQube 解析を一括実行
./gradlew test jacocoTestReport sonar \
  -Dsonar.token=<発行したトークン>
SONAR_TOKEN 環境変数を使う場合
export SONAR_TOKEN=sqp_xxxxxxxxxxxx を事前に設定しておけば -Dsonar.token オプションを省略できます。

Windows(PowerShell)

PowerShell
$env:SONAR_TOKEN = "sqp_xxxxxxxxxxxx"
.\gradlew.bat test jacocoTestReport sonar

マルチプロジェクトの場合

bash
# ルートプロジェクトで実行(すべてのサブプロジェクトが対象)
./gradlew test jacocoTestReport sonar \
  -Dsonar.token=<発行したトークン> \
  -Dsonar.projectKey=my-multi-project

6. 実行後の確認

解析完了後、コンソールに SonarQube の URL が表示されます。

Console Output
BUILD SUCCESSFUL in 45s

ANALYSIS SUCCESSFUL, you can browse http://localhost:9000/dashboard?id=my-project
確認項目確認方法
Quality Gate ステータスプロジェクト概要に「Passed」/「Failed」が表示される。
Bugs / VulnerabilitiesIssues タブで深刻度・件数を確認する。
Security HotspotsSecurity Hotspots タブで未レビュー件数を確認する。
CoverageMeasures → Coverage でカバレッジ率を確認する。
DuplicationsMeasures → Duplications で重複率を確認する。

問題の深刻度

深刻度意味対応優先度
BLOCKER即時修正必須のバグ。最高
CRITICALセキュリティ・データ整合性に影響する重大問題。
MAJOR機能障害・パフォーマンス劣化を招く欠陥。
MINOR可読性・保守性の問題。機能への直接影響はない。
INFO参考情報。最低

7. 確認後の対応

  1. BLOCKER / CRITICAL を優先対処
    Issues 画面で深刻度フィルターを使い、優先度の高い問題から修正します。
  2. 誤検知のマーク
    意図的なコードや誤検知は「Won't Fix」または「False Positive」にマークし、理由をコメントします。
  3. Security Hotspots のレビュー
    各 Hotspot を確認し、問題なければ「Safe」に変更します。
  4. 修正後に再解析
    ./gradlew test jacocoTestReport sonar を再実行し、Quality Gate が Passed になることを確認します。

8. CI/CD への組み込み(GitHub Actions)

YAML — .github/workflows/sonar.yml
name: SonarQube Analysis

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  sonar:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0   # 差分解析のためフルクローンが必要

      - name: Set up JDK 21
        uses: actions/setup-java@v4
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Build, Test, and SonarQube Scan
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
          SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
        run: |
          ./gradlew test jacocoTestReport sonar \
            -Dsonar.host.url=$SONAR_HOST_URL \
            -Dsonar.token=$SONAR_TOKEN
💡 Gradle キャッシュの活用
actions/cache を使って ~/.gradle/caches~/.gradle/wrapper をキャッシュすると、 2回目以降のビルドが高速化されます。

9. まとめ

フェーズ内容ポイント
設定(Groovy)build.gradle に sonarqube・jacoco プラグインを追加jacocoTestReport タスクを test に finalizedBy で連携。
設定(Kotlin)build.gradle.kts で同様の設定レポートパスは layout.buildDirectory で参照。
実行基準SonarQube UI で Quality Gate / Profile 確認Gradle 側からの設定は不要。
実行./gradlew test jacocoTestReport sonarSONAR_TOKEN 環境変数でトークンを安全に管理。
確認・対応Quality Gate / Issues / Coverage 確認 → 修正 → 再解析BLOCKER / CRITICAL を最優先で対処。
CI 組み込みGitHub Actions 等でパイプラインに追加fetch-depth: 0 でフルクローンを忘れずに。