静的解析をCI/CDへ組み込む前に、まずローカルで動かしてみたい方向けの入門です。Qiitaの記事をもとに、DockerでSonarQube Serverを起動し、サンプルコードをSonarScanner CLIで解析します。

今回のゴールと準備

ソースコードをスキャンし、SonarQubeの画面でバグやCode Smellを確認します。Docker DesktopまたはDocker Engineと、次のPythonファイルを用意してください。

1
2
3
4
5
def hello():
    print("Hello World")
    x = 10  # unused variable

hello()

SonarQube Serverを起動

1
docker run -d --name sonarqube -p 9000:9000 sonarqube:community

ブラウザーで http://localhost:9000 を開き、初期ユーザー名とパスワード admin / admin でログインします。初回ログイン後、パスワードを変更します。

SonarQubeの初期ログイン画面

プロジェクト、Token、URLを準備

画面で [Create a local project] を選び、表示名 hello-world のプロジェクトを作成します。続いて My Account > Security でTokenを作成し、scanner-cli などの名前を付けます。生成されたTokenは画面を閉じる前にコピーしてください。

ローカルプロジェクトの作成を開始

プロジェクト表示名の入力

プロジェクト設定の確認

SonarQube Tokenの生成

Docker Desktop(Windows/Mac)からホストへ接続するURLは http://host.docker.internal:9000 です。Linuxでは http://localhost:9000 またはコンテナーIPを使用します。

SonarScanner CLIでスキャン

main.py があるディレクトリで、Tokenを置き換えて実行します。

1
2
3
4
5
6
docker run --rm \
  -e SONAR_HOST_URL="http://host.docker.internal:9000" \
  -e SONAR_TOKEN="<your-token>" \
  -v "$(pwd):/usr/src" \
  sonarsource/sonar-scanner-cli \
  -Dsonar.projectKey=hello-world

--rm はスキャン後にScannerコンテナーを削除し、-v は現在のソースディレクトリをコンテナー内の /usr/src にマウントします。ログの最後に EXECUTION SUCCESS が出れば解析成功です。

結果を確認

SonarQubeの http://localhost:9000/dashboard?id=hello-world を再読み込みし、Issuesを開きます。未使用変数 x に対する指摘などが表示され、問題の場所や修正案を確認できます。

SonarQubeで検出されたIssue

Issueの場所と修正案

まとめ

Dockerを使えば、複雑な設定ファイルを作らずに最初の静的解析を試せます。CIへ組み込む場合も、基本的には同じScannerコマンドをCIジョブから実行します。