ツール / SonarQube
SonarQube — Gradle プラグインによる実行・確認
Gradle プロジェクトで sonarqube タスクを使って SonarQube 解析を実行する方法を解説します。
Groovy DSL(build.gradle)・Kotlin DSL(build.gradle.kts)両方の設定例を掲載し、
JaCoCo によるカバレッジ計測、Quality Gate の確認、GitHub Actions での自動化まで網羅します。
1. 前提条件
| 項目 | 要件 |
|---|---|
| Gradle | 7.x 以上(Gradle Wrapper の使用を推奨) |
| JDK | JDK 17 以上 |
| SonarQube | SonarQube サーバー(Docker / ZIP 版で起動済みであること) |
| SonarQube トークン | SonarQube UI でプロジェクト作成 + 解析用トークンを発行済みであること |
2. build.gradle の設定(Groovy DSL)
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)
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 に直接書かず、コマンドラインの
トークンは 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 タスクの実行
標準的な実行(カバレッジあり)
# テスト実行 → JaCoCo レポート生成 → SonarQube 解析を一括実行
./gradlew test jacocoTestReport sonar \
-Dsonar.token=<発行したトークン>
✅ SONAR_TOKEN 環境変数を使う場合
export SONAR_TOKEN=sqp_xxxxxxxxxxxx を事前に設定しておけば
-Dsonar.token オプションを省略できます。
Windows(PowerShell)
$env:SONAR_TOKEN = "sqp_xxxxxxxxxxxx"
.\gradlew.bat test jacocoTestReport sonar
マルチプロジェクトの場合
# ルートプロジェクトで実行(すべてのサブプロジェクトが対象)
./gradlew test jacocoTestReport sonar \
-Dsonar.token=<発行したトークン> \
-Dsonar.projectKey=my-multi-project
6. 実行後の確認
解析完了後、コンソールに SonarQube の URL が表示されます。
BUILD SUCCESSFUL in 45s
ANALYSIS SUCCESSFUL, you can browse http://localhost:9000/dashboard?id=my-project
| 確認項目 | 確認方法 |
|---|---|
| Quality Gate ステータス | プロジェクト概要に「Passed」/「Failed」が表示される。 |
| Bugs / Vulnerabilities | Issues タブで深刻度・件数を確認する。 |
| Security Hotspots | Security Hotspots タブで未レビュー件数を確認する。 |
| Coverage | Measures → Coverage でカバレッジ率を確認する。 |
| Duplications | Measures → Duplications で重複率を確認する。 |
問題の深刻度
| 深刻度 | 意味 | 対応優先度 |
|---|---|---|
| BLOCKER | 即時修正必須のバグ。 | 最高 |
| CRITICAL | セキュリティ・データ整合性に影響する重大問題。 | 高 |
| MAJOR | 機能障害・パフォーマンス劣化を招く欠陥。 | 中 |
| MINOR | 可読性・保守性の問題。機能への直接影響はない。 | 低 |
| INFO | 参考情報。 | 最低 |
7. 確認後の対応
-
BLOCKER / CRITICAL を優先対処
Issues 画面で深刻度フィルターを使い、優先度の高い問題から修正します。 -
誤検知のマーク
意図的なコードや誤検知は「Won't Fix」または「False Positive」にマークし、理由をコメントします。 -
Security Hotspots のレビュー
各 Hotspot を確認し、問題なければ「Safe」に変更します。 -
修正後に再解析
./gradlew test jacocoTestReport sonarを再実行し、Quality Gate が Passed になることを確認します。
8. CI/CD への組み込み(GitHub Actions)
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 sonar | SONAR_TOKEN 環境変数でトークンを安全に管理。 |
| 確認・対応 | Quality Gate / Issues / Coverage 確認 → 修正 → 再解析 | BLOCKER / CRITICAL を最優先で対処。 |
| CI 組み込み | GitHub Actions 等でパイプラインに追加 | fetch-depth: 0 でフルクローンを忘れずに。 |