1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者向け】SonarQubeで始めるコード品質管理 ― 導入から実践まで完全ガイド

1
Last updated at Posted at 2026-02-15

はじめに

「コードレビューで毎回同じ指摘をされる…」「セキュリティの脆弱性を見落としていた…」

こうした問題を 自動的に検出 してくれるのが 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

初回ログイン

  1. ブラウザで http://localhost:9000 にアクセス
  2. 初回ログイン情報:
    • ユーザー名: admin
    • パスワード: admin
  3. パスワード変更を求められるので、新しいパスワードを設定

ダッシュボード画面が表示されれば成功です 🎉


4. Java プロジェクトを解析してみよう

ステップ1:トークンの生成

SonarQube にアクセスするためのトークンを生成します。

  1. 右上のユーザーアイコン → My Account
  2. Security タブ → Generate Tokens
  3. トークン名(例:my-project-token)を入力 → Generate
  4. 表示されたトークンをコピーして保存(一度しか表示されません!

ステップ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=生成したトークン

まずは自分のプロジェクトで試してみてください!


記事が参考になったら「いいね」していただけると励みになります!

@kotaro_ai_lab

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?