はじめに
「コードレビューで毎回同じ指摘をされる…」「セキュリティの脆弱性を見落としていた…」
こうした問題を 自動的に検出 してくれるのが SonarQube(ソナーキューブ) です。
この記事では、SonarQubeの基礎知識からDocker環境での構築、Java プロジェクトの解析、CI/CD連携まで、初心者が「まず動かせる」レベルを目指して解説します。
1. SonarQubeとは
概要
SonarQube は SonarSource社 が開発した 静的コード解析ツール です。
ソースコードを実行せずに解析し、以下の問題を自動的に検出します:
| 検出カテゴリ | 説明 | 例 |
|---|---|---|
| 🐛 バグ(Bug) | 実行時にエラーを引き起こす可能性のあるコード | NullPointerException、リソースの閉じ忘れ |
| 🔧 コードスメル(Code Smell) | 動作はするが保守性に問題のあるコード | メソッドが長すぎる、重複コード |
| 🔓 脆弱性(Vulnerability) | 攻撃者に悪用される可能性のあるコード | SQLインジェクション、XSS |
| 🔍 セキュリティホットスポット | セキュリティ上の確認が必要なコード | ハードコードされたパスワード |
なぜ SonarQube が必要?
❌ SonarQube なし
開発 → コードレビュー(人力で全部チェック)→ テスト → リリース
↑ 見落としが起きやすい
✅ SonarQube あり
開発 → 自動解析(SonarQube)→ コードレビュー(ロジックに集中)→ テスト → リリース
↑ 機械的なチェックは自動化
メリット:
- コードレビューの負担が軽減(書き方の問題は SonarQube が指摘)
- セキュリティリスクを早期発見
- チーム全体のコード品質が可視化される
- 新人でも一定の品質基準を維持できる
2. エディションと料金
SonarQube には4つのエディションがあります。
| エディション | 料金 | 対象 | 主な特徴 |
|---|---|---|---|
| Community Build | 無料 | 個人・学習・小規模 | 基本的な静的解析(メインブランチのみ) |
| Developer | 有料 | 中小規模チーム | ブランチ解析、PR連携 |
| Enterprise | 有料 | 大規模組織 | セキュリティレポート、ポートフォリオ管理 |
| Data Center | 有料 | 高可用性要件 | 水平スケーリング、冗長構成 |
💡 初心者はまず Community Build(無料)で十分です! この記事でも Community Build を使って解説します。
対応言語(Community Build)
Java, JavaScript, TypeScript, Python, C#, Go, Kotlin, Ruby, PHP, Scala, Rust, CSS, HTML, XML など 21言語 に対応しています。
3. 環境構築(Docker)
前提条件
- Docker がインストール済みであること
- Docker Compose が使えること(Docker Desktop に同梱)
方法1:お試し起動(最速)
まずは動かしてみたい場合はこれだけでOKです:
docker run -d --name sonarqube -p 9000:9000 sonarqube:community
⚠️ この方法ではコンテナを削除するとデータが消えます。お試し用です。
方法2:Docker Compose(推奨)
本格的に使う場合は、PostgreSQL と合わせて構築します。
以下の docker-compose.yml を作成してください:
# docker-compose.yml
services:
sonarqube:
image: sonarqube:community
container_name: sonarqube
depends_on:
db:
condition: service_healthy
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
ports:
- "9000:9000"
db:
image: postgres:17
container_name: sonarqube-db
healthcheck:
test: ["CMD-SHELL", "pg_isready -U sonar -d sonar"]
interval: 10s
timeout: 5s
retries: 5
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonar
volumes:
- postgresql_data:/var/lib/postgresql/data
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql_data:
起動:
docker compose up -d
初回ログイン
- ブラウザで
http://localhost:9000にアクセス - 初回ログイン情報:
-
ユーザー名:
admin -
パスワード:
admin
-
ユーザー名:
- パスワード変更を求められるので、新しいパスワードを設定
ダッシュボード画面が表示されれば成功です 🎉
4. Java プロジェクトを解析してみよう
ステップ1:トークンの生成
SonarQube にアクセスするためのトークンを生成します。
- 右上のユーザーアイコン → My Account
- Security タブ → Generate Tokens
- トークン名(例:
my-project-token)を入力 → Generate - 表示されたトークンをコピーして保存(一度しか表示されません!)
ステップ2:Maven プロジェクトの解析
Java(Maven)プロジェクトのルートディレクトリで、以下を実行します:
mvn clean verify sonar:sonar \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.token=ここにトークンを貼る
💡
pom.xmlへの追加設定は不要です。Maven が自動的に SonarQube Scanner プラグインをダウンロードします。
ステップ3:結果を確認
解析が完了したら、ブラウザで http://localhost:9000 に戻ると、プロジェクトが一覧に表示されています。
クリックすると以下の情報が確認できます:
| タブ | 内容 |
|---|---|
| Overview | プロジェクト全体のサマリー(レーティング、Quality Gate状態) |
| Issues | 検出された問題の一覧(フィルタリング可能) |
| Measures | 各メトリクスの詳細数値 |
| Code | ファイルごとにインラインで問題箇所を表示 |
5. テストカバレッジの表示(JaCoCo 連携)
SonarQube 単体ではテストカバレッジを計測できません。JaCoCo というツールと連携する必要があります。
pom.xml に JaCoCo を追加
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.12</version>
<executions>
<!-- テスト前にエージェントを準備 -->
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<!-- テスト後にレポートを生成 -->
<execution>
<id>report</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
これを追加した状態で再度 mvn clean verify sonar:sonar ... を実行すると、SonarQube のダッシュボードにカバレッジが表示されます。
6. メトリクスの読み方
SonarQube では、コード品質を A〜E のレーティング で評価します。
💡 注意: SonarQube 10.x 以降では、従来の深刻度(Blocker/Critical/Major/Minor)に代わり、影響度ベースのモデル(High/Medium/Low) が導入されています。以下はクラシックモデルの基準ですが、最新バージョンでは表示が異なる場合があります。
信頼性(Reliability)― バグに関する評価
| レーティング | 条件 |
|---|---|
| A | バグ 0件 |
| B | Minor バグが1件以上 |
| C | Major バグが1件以上 |
| D | Critical バグが1件以上 |
| E | Blocker バグが1件以上 |
セキュリティ(Security)― 脆弱性に関する評価
| レーティング | 条件 |
|---|---|
| A | 脆弱性 0件 |
| B | Minor 脆弱性が1件以上 |
| C | Major 脆弱性が1件以上 |
| D | Critical 脆弱性が1件以上 |
| E | Blocker 脆弱性が1件以上 |
保守性(Maintainability)― コードスメルに関する評価
| レーティング | 技術的負債比率 |
|---|---|
| A | 5% 以下 |
| B | 5%超〜10% 以下 |
| C | 10%超〜20% 以下 |
| D | 20%超〜50% 以下 |
| E | 50% 超 |
💡 技術的負債(Technical Debt) とは、コードスメルを修正するために必要な推定時間のことです。SonarQube はこの修正時間を自動で算出します。
カバレッジ(Coverage)と重複(Duplications)
| メトリクス | 内容 | 理想値 |
|---|---|---|
| Coverage | テストでカバーされているコードの割合 | 80% 以上 |
| Duplications | コード重複の割合 | 3% 以下 |
7. Quality Gate(品質ゲート)
Quality Gate とは
Quality Gate は、コードが 「リリースしてよいか」を自動判定する基準 です。
設定した条件をすべて満たせば Passed(合格)、1つでも満たさなければ Failed(不合格) となります。
デフォルトの Quality Gate(Sonar way)
SonarQube にはデフォルトで「Sonar way」という品質ゲートが用意されています:
| 条件 | 基準値 |
|---|---|
| 新規コードのカバレッジ | 80% 以上 |
| 新規コードの重複行 | 3% 以下 |
| 信頼性レーティング | A |
| セキュリティレーティング | A |
| 保守性レーティング | A |
| セキュリティホットスポット | 100% レビュー済み |
💡 ポイント: Sonar way は 新規コード(New Code) に対して基準を適用します。既存コードの全問題を一度に修正する必要はありません。これを 「Clean as You Code」 アプローチと呼びます。
Clean as You Code とは
SonarQube が推奨するアプローチです:
📌 既存コード → 問題があっても一旦そのまま
📌 新規コード → 厳格な基準を適用して品質を維持
→ 時間が経つにつれて、コードベース全体の品質が向上する
「レガシーコードを全部直せ」ではなく、「新しく書くコードはきれいにしよう」という現実的な戦略です。
8. よくある指摘ルール(Java編)
実際に Java プロジェクトを解析すると、よく検出されるルールを紹介します。
バグ(Bug)
S2259 - NullPointerException の可能性
// ❌ NG: null チェックなしでメソッド呼び出し
String name = getUserName(); // null を返す可能性
System.out.println(name.length()); // NPE!
// ✅ OK: null チェックを追加
String name = getUserName();
if (name != null) {
System.out.println(name.length());
}
S2095 - リソースの閉じ忘れ
// ❌ NG: リソースを閉じていない
BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
String line = reader.readLine();
// reader.close() がない!
// ✅ OK: try-with-resources を使う
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
String line = reader.readLine();
} // 自動的に閉じられる
コードスメル(Code Smell)
S106 - System.out.println の使用
// ❌ NG: 本番コードで System.out を使っている
System.out.println("ユーザーがログインしました");
// ✅ OK: ロガーを使う
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
logger.info("ユーザーがログインしました");
S1481 - 未使用のローカル変数
// ❌ NG: 使われていない変数
public void process() {
int count = 0; // どこでも使われていない
doSomething();
}
// ✅ OK: 不要な変数を削除
public void process() {
doSomething();
}
脆弱性(Vulnerability)
S3649 - SQL インジェクション
// ❌ NG: 文字列結合で SQL を組み立て
String query = "SELECT * FROM users WHERE name = '" + userInput + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
// ✅ OK: PreparedStatement を使う
String query = "SELECT * FROM users WHERE name = ?";
PreparedStatement pstmt = conn.prepareStatement(query);
pstmt.setString(1, userInput);
ResultSet rs = pstmt.executeQuery();
S2068 - ハードコードされたパスワード
// ❌ NG: ソースコードにパスワードを直書き
String password = "admin123";
// ✅ OK: 環境変数や設定ファイルから読み込む
String password = System.getenv("DB_PASSWORD");
9. SonarLint ― IDE でリアルタイム検出
SonarQube は解析をサーバー上で行いますが、SonarLint を使えば IDE上でコーディング中にリアルタイムで問題を検出 できます。
インストール方法
| IDE | インストール方法 |
|---|---|
| IntelliJ IDEA | Settings → Plugins → 「SonarLint」で検索 → Install |
| VS Code | Extensions → 「SonarLint」で検索 → Install |
| Eclipse | Eclipse Marketplace → 「SonarLint」で検索 → Install |
SonarQube との連携(Connected Mode)
SonarLint を SonarQube サーバーと接続すると:
- サーバー側で設定した Quality Profile のルール がそのまま IDE に反映
- チーム全体で 同じルールセット を共有できる
- サーバー上で「Won't Fix(対応不要)」にした Issue は IDE でも表示されなくなる
SonarLint(IDE上) ←→ SonarQube Server
リアルタイム検出 ルール同期・結果共有
💡 おすすめ: 開発中は SonarLint で即座に問題を発見し、CI/CD では SonarQube で全体チェック、という組み合わせが効果的です。
10. CI/CD 連携
GitHub Actions との連携
プッシュやPR作成時に自動で SonarQube 解析を実行できます。
.github/workflows/sonarqube.yml を作成:
name: SonarQube Analysis
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
sonarqube:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # 全履歴を取得(差分解析に必要)
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: 'maven'
- name: Build and Analyze
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
run: |
mvn -B verify sonar:sonar \
-Dsonar.host.url=$SONAR_HOST_URL \
-Dsonar.token=$SONAR_TOKEN
事前準備: GitHub リポジトリの Settings → Secrets and variables → Actions に以下を登録:
| Secret 名 | 値 |
|---|---|
SONAR_TOKEN |
SonarQube で生成したトークン |
SONAR_HOST_URL |
SonarQube サーバーの URL(例:http://your-server:9000) |
Jenkins との連携
// Jenkinsfile
pipeline {
agent any
stages {
stage('Build & Test') {
steps {
sh 'mvn clean verify'
}
}
stage('SonarQube Analysis') {
steps {
withSonarQubeEnv('SonarQube') {
sh 'mvn sonar:sonar'
}
}
}
stage('Quality Gate') {
steps {
timeout(time: 5, unit: 'MINUTES') {
waitForQualityGate abortPipeline: true
}
}
}
}
}
💡
waitForQualityGate abortPipeline: trueを設定すると、Quality Gate が Failed の場合にパイプラインを自動的に中断できます。
11. SonarQube vs SonarCloud
SonarSource は SonarCloud というクラウド版も提供しています。
| 比較項目 | SonarQube Server | SonarCloud |
|---|---|---|
| ホスティング | セルフホスティング(自社サーバー) | SaaS(クラウド) |
| 構築の手間 | サーバー構築が必要 | アカウント作成のみ |
| 更新 | 手動でアップデート | 常に最新版 |
| データ管理 | 自社内に保持 | クラウドに保管 |
| OSS利用 | Community Build が無料 | OSSプロジェクトは無料 |
| ブランチ解析 | Developer版以上(有料) | 全プランで可能 |
| 適している場面 | セキュリティポリシーが厳しい組織 | クラウドネイティブな開発 |
💡 初心者へのおすすめ: 学習目的なら SonarQube Community Build(Docker でローカル構築)、個人OSSプロジェクトなら SonarCloud(無料)がおすすめです。
12. チームへの導入ベストプラクティス
Step 1:段階的に導入する
Week 1-2: SonarQube を構築し、解析結果を「見るだけ」
Week 3-4: SonarLint を IDE にインストール
Week 5-6: CI/CD に組み込み、Quality Gate を「警告のみ」に設定
Week 7-8: Quality Gate を「ブロック」に切り替え
Step 2:「Clean as You Code」を徹底する
- 既存コードの全問題を一度に直そうとしない
- 新しく書くコード に対してのみ品質基準を適用
- 自然にコードベース全体の品質が向上する
Step 3:チーム全体で同じルールを共有
| やること | 方法 |
|---|---|
| Quality Profile の統一 | チーム共通のルールセットを設定 |
| SonarLint の Connected Mode | IDE と SonarQube のルールを同期 |
| 定期的なダッシュボード確認 | 週次でチームでトレンドを確認 |
Step 4:通知を活用する
- Quality Gate の結果を Slack や Teams に通知
- 問題が発生した時点で即座にフィードバック
まとめ
| 項目 | 内容 |
|---|---|
| SonarQube とは | ソースコードの品質を自動で解析する静的解析ツール |
| 検出するもの | バグ、コードスメル、セキュリティ脆弱性、重複コード |
| 環境構築 | Docker で簡単に構築可能 |
| Quality Gate | コードがリリース可能かを自動判定する基準 |
| Clean as You Code | 新規コードに品質基準を適用する現実的なアプローチ |
| SonarLint | IDE でリアルタイムに問題を検出するプラグイン |
| CI/CD 連携 | GitHub Actions / Jenkins で自動解析 |
導入の第一歩
# 1. SonarQube を起動
docker run -d --name sonarqube -p 9000:9000 sonarqube:community
# 2. http://localhost:9000 にアクセスしてログイン(admin/admin)
# 3. トークンを生成して、プロジェクトを解析
mvn clean verify sonar:sonar \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.token=生成したトークン
まずは自分のプロジェクトで試してみてください!
記事が参考になったら「いいね」していただけると励みになります!