「コードの品質管理(静的解析)を始めたいけれど、CI/CDパイプラインへの組み込みはまだ敷居が高い…」
「まずは手元でサクッと動かして、どんな風に分析されるのか見てみたい」
そんな風に思っていませんか?
今回は、「とにかくシンプルに、まずは動かす」ことをゴールに、Dockerを使ってSonarScanner CLIによる初めてのコードスキャンを実行してみましょう。複雑な設定ファイルは一切使いません。
今回のゴール
- 手元のソースコードをスキャンする
- SonarQubeの画面で結果(バグやコードスメル)を確認する
準備するもの
今回は環境を汚さないよう、全てDockerコンテナで実行します。
- Docker Desktop (またはDocker Engine) がインストールされていること
-
スキャン対象のサンプルコード
- 今回は例として、意図的に少し「行儀の悪い」Pythonコード (main.py) を用意しました。適当なフォルダを作って保存してください
# main.py
def hello():
print("Hello World")
x = 10 # 使われていない変数(Issueとして検出されるはず!)
hello()
ステップ0:SonarQube Serverの起動
まずは、解析結果を受け取るためのサーバー(SonarQube Server)を立ち上げます。まだ起動していない場合は、以下のコマンドを実行してください。
docker run -d --name sonarqube -p 9000:9000 sonarqube:community
起動したら、ブラウザで http://localhost:9000 にアクセスします。
- 初期ID:
admin - 初期PW:
admin
(初回ログイン時にパスワード変更を求められるので、変更してログインしてください)
ステップ1:Tokenの生成とURLの確認
SonarScanner(CLI)がサーバーにデータを送信するためには、「認証トークン」と「接続先URL」が必要です。
1. プロジェクトの作成(手動作成)
まずはデータを受け入れる箱を作ります。
-
Project display nameに
hello-worldと入力(Project Keyも自動で入力されます)

-
[Next] をクリック
-
"Follows the instance's default" を選択して [Create project] をクリック

2. トークンの生成
プロジェクト作成後の画面、または右上のユーザーアイコン → [My Account] → [Security] からトークンを生成します。
- Generate Tokensの画面で、Nameに
scanner-cliなど適当な名前を入力 - Typeは [User Token] を選択
- [Generate] をクリック
⚠️ 重要: 生成された長い文字列(トークン)は必ずここでコピーしてメモしてください。画面を閉じると二度と表示されません!
3. Server URLの確認
通常、Docker Desktop(Windows/Mac)環境からコンテナへアクセスする場合、URLは以下になります。これもメモしておきましょう。
-
URL:
http://host.docker.internal:9000
※ Linux環境の場合は
http://localhost:9000またはコンテナのIPアドレスを使用します。
ステップ2:SonarScanner CLIでスキャン実行
ここがメインイベントです!
設定ファイル(sonar-project.properties)を作らずに、コマンドライン引数だけでスキャンを実行します。
ターミナル(またはコマンドプロンプト)を開き、先ほど main.py を作成したディレクトリに移動してから、以下のコマンドを実行してください。
※ <あなたのトークン> の部分は、ステップ1でメモしたものに書き換えてください。
Mac / Linux / PowerShell の場合:
docker run \
--rm \
-e SONAR_HOST_URL="http://host.docker.internal:9000" \
-e SONAR_TOKEN="<あなたのトークン>" \
-v "$(pwd):/usr/src" \
sonarsource/sonar-scanner-cli \
-Dsonar.projectKey=hello-world
コマンドの解説:
--rm: スキャンが終わったらスキャナーのコンテナを自動で削除します(お掃除不要)-e SONAR_HOST_URL=...: サーバーの場所-e SONAR_TOKEN=...: 先ほどの認証キー-v "$(pwd):/usr/src": ここが重要! 今いるフォルダ(ソースコードがある場所)を、コンテナの中の/usr/srcに「マウント(同期)」させて、スキャナーがコードを読めるようにしています
実行結果:
最後に EXECUTION SUCCESS と表示されれば成功です!
15:18:43.168 INFO Scanner configuration file: /opt/sonar-scanner/conf/sonar-scanner.properties
15:18:43.177 INFO Project root configuration file: NONE
15:18:43.197 INFO SonarScanner CLI 7.3.0.5189
15:18:43.203 INFO Linux 6.17.8-orbstack-00308-g8f9c941121b1 amd64
15:18:44.303 INFO Communicating with SonarQube Community Build 25.11.0.114957
15:18:44.306 INFO JRE provisioning: os[linux], arch[x86_64]
15:18:46.263 INFO Starting SonarScanner Engine...
15:18:46.265 INFO Java 17.0.13 Eclipse Adoptium (64-bit)
15:18:47.520 INFO Load global settings
15:18:47.629 INFO Load global settings (done) | time=109ms
...
15:18:51.814 INFO Analysis total time: 3.743 s
15:18:51.816 INFO SonarScanner Engine completed successfully
15:18:51.861 INFO EXECUTION SUCCESS
15:18:51.864 INFO Total time: 8.699s
ステップ3:結果の確認
ブラウザに戻り、SonarQubeのプロジェクトページ (http://localhost:9000/dashboard?id=hello-world) をリロードしてみましょう。解析結果が表示されているはずです。
Issueを見てみよう
[Issues] タブをクリックしてみてください。
先ほどのサンプルコード main.py に対して、以下のような指摘が入っていませんか?
-
Remove this unused local variable 'x'.
- (使われていない変数
xがあるよ、という指摘)
- (使われていない変数
Issueの詳細を確認すると、問題の場所、原因と修正方法も提示されています。
これが静的解析の第一歩です!
「動くけれど、品質的には良くないコード(Code Smells)」を自動で見つけてくれました。
まとめ
お疲れ様でした!これで「Hello World」完了です。
この仕組みさえ分かれば、あとはJenkinsやGitHub ActionsなどのCIツールに組み込む際も、「どこでコマンドを叩いているか」が変わるだけです。
まずは手元のプロジェクトで、色々なコードをスキャンして遊んでみてください!




