大企業も採用!DockerのSonarQubeによる静的解析の手順を徹底解説(29言語に対応)

0. 検証環境

  • Mac OS Big Sur 11.1
  • Python 3.9
  • Docker 20.10.5


1. SonarQubeとは

SonarQubeは、最大29言語に対応している静的解析ツールです。
Dockerイメージも提供されており、比較的導入も簡単で、ソースコードに隠れているコードのバグやセキュリティリスクなどを顕在化してくれます。

以下の言語に対応しています。 ※対応言語は契約するエディションによって異なります。(無料版もあります。)

MicrosoftやAlphabet、IBMなどを初めさまざまな企業で利用されている実績があるツールです。


2. 構築手順

2-1. Docker環境の構築

まずは、Docker環境を構築していきます。
docker-hubのSonarqubeのイメージを使います。
公式はこちら:https://hub.docker.com/_/sonarqube

docker run -p 9000:9000 --name sonarqube -d --restart always -it sonarqube:lts

docker psコマンドを打つと以下のようにsonarqubeが起動(statusがup)していることがわかるかと思います。

% docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                    NAMES
59f665a0f4ff   sonarqube:lts           "bin/run.sh bin/sona…"   6 minutes ago   Up 6 minutes   0.0.0.0:9000->9000/tcp   sonarqube

2-2. SonarQubeにログイン

http://localhost:9000でログインできます。
しばらく、「SonarQube is Starting」と表示されていますが、起動が完了すると以下の画面が表示されます。

初期ID/パスワードは、admin/adminです。ログインが完了するとパスワードの変更が促されるので、変更しましょう。
パスワードの変更が完了すると以下の画面へ遷移します。

2-3. プロジェクトの追加

まだプロジェクトはないので、0件になっています。
中央にある「Add a project」を押下してください。

画面中央左にある「Manually」を押下してください。

Project Keyを入力してください。任意のプロジェクト名で大丈夫です。
Display nameは自動で入力されます。

次にトークンを発行します。任意の文字列を入力して、「generate」を押すとトークンの文字列を生成してくれます。

以下のようにトークンが発行されるので、「continue」ボタンを押下します。

次にコード解析する言語とOSを選択します。
今回、pythonをDocker環境で、解析するため、以下のような形にしています。
このコマンドをDocker環境で打つ形になります。


3. SonarScannerのインストール

3-1. ダウンロードリンクの取得

Java以外はSonnerScannerのインストールが必要です。
先程のコマンドが表示された画面にある以下の文言が記載されたリンクからインストーラをダウンロードします。

Visit the official documentation of the Scanner to download the latest version, and add the bin directory to the PATH environment variable

http://localhost:9000/dashboard?id=<project_name>

リンク先のページからSonar-Scannerのインストールをします。
今回は、Docker環境で実行するので、Linux 64-bitのダウンロードリンクを取得します。
(ここからダウンロードして、docker cpでもいいですが、wgetで取得する手順にしています。)

3-2. DockerにSonar-Scannerをインストールする

DockerにSonar-Scannerをインストールします。
まず、Docker環境にアクセスしてください。注意点として、ユーザ指定(-u)してログインが必要になります。これがないと、sudo権限のないsonarユーザーになってしまいます。

$ docker exec -it -u root sonarqube bash

必要なライブラリをインストールします。

# apk add wget unzip vim git

次にsonar-Scannerをインストールします。

# wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747-linux.zip

次にunzipで解凍します。

# unzip sonar-scanner-cli-4.7.0.2747-linux.zip

解凍すると以下のようなディレクトリ構成になります。解凍したことによって、sonar-scannerディレクトリができています。

bash-5.0# ls -la
total 42272
drwxr-xr-x    1 sonarqub sonarqub      4096 Mar 24 14:16 .
drwxr-xr-x    1 root     root          4096 Mar 17 15:31 ..
-rw-r--r--    1 sonarqub sonarqub      7651 Feb  4 08:23 COPYING
drwxr-xr-x    1 sonarqub sonarqub      4096 Mar 17 15:31 bin
drwxr-xr-x    2 sonarqub sonarqub      4096 Feb  4 08:23 conf
drwx------    1 sonarqub sonarqub      4096 Mar 23 16:14 data
-rw-r--r--    1 sonarqub sonarqub     40615 Feb  4 08:26 dependency-license.json
drwxr-xr-x    7 sonarqub sonarqub      4096 Feb  4 08:41 elasticsearch
drwx------    1 sonarqub sonarqub      4096 Mar 23 16:18 extensions
drwxr-xr-x    6 sonarqub sonarqub      4096 Feb  4 08:41 lib
drwx------    1 sonarqub sonarqub      4096 Mar 24 13:07 logs
drwxr-xr-x    6 root     root          4096 Feb 22 07:20 sonar-scanner-4.7.0.2747-linux
-rw-r--r--    1 root     root      43162003 Feb 22 13:55 sonar-scanner-cli-4.7.0.2747-linux.zip
drwx------    1 sonarqub sonarqub      4096 Mar 23 16:28 temp
drwxr-xr-x    6 sonarqub sonarqub      4096 Feb  4 08:41 web

次にsonar-scannerコマンドを使えるようにパスを通します。

export PATH="$PATH:/opt/sonarqube/sonar-scanner-4.7.0.2747-linux/bin/"


4. コード解析

4-1. ソースコード配置用のディレクトリ作成

まず、初めにソースコードを配置するディレクトリを作成しておきます。
(/opt/sonarqubeに作成しました。)

 mkdir src

4-2. ソースコード配置

/opt/sonarqube/srcにソースを配置します。

docker cp test.py 59f665a0f4ff:/opt/sonarqube/src

bash-5.0# pwd
/opt/sonarqube/src
bash-5.0# ls
test.py

4-3. ソースコード解析

ここまでできたら、ソースを置いたディレクトリ(今回はsrc)で、sonar-scannerコマンドを実行して、
ソース解析をします。

# sonar-scanner \
>   -Dsonar.projectKey=<your project key> \
>   -Dsonar.sources=. \
>   -Dsonar.host.url=http://localhost:9000 \
>   -Dsonar.login=<your token>
INFO: Scanner configuration file: /opt/sonarqube/sonar-scanner-4.7.0.2747-linux/conf/sonar-scanner.properties
INFO: Project root configuration file: NONE
INFO: SonarScanner 4.7.0.2747
INFO: Java 11.0.14.1 Eclipse Adoptium (64-bit)
INFO: Linux 4.19.121-linuxkit amd64
INFO: User cache: /root/.sonar/cache
INFO: Scanner configuration file: /opt/sonarqube/sonar-scanner-4.7.0.2747-linux/conf/sonar-scanner.properties
INFO: Project root configuration file: NONE
INFO: Analyzing on SonarQube server 8.9.7
INFO: Default locale: "en_US", source code encoding: "UTF-8" (analysis is platform dependent)
INFO: Load global settings
INFO: Load global settings (done) | time=1170ms
INFO: Server id: BF41A1F2-AX-3kNOjx2VB4T0PZh2t
INFO: User cache: /root/.sonar/cache
INFO: Load/download plugins
INFO: Load plugins index
INFO: Load plugins index (done) | time=717ms
INFO: Load/download plugins (done) | time=41970ms

EXEXUTION SUCCESS と表示されたら、解析は完了です。
ソースコードの量にもよりますが、それなりに時間がかかります。

5. 解析結果の確認

以下のように解析結果を見ることができます。
今回はシンプルなコードをスキャンしたので、BugsもSecurity Hotspotsも0件ですが、大きいリポジトリなどの単位でスキャンするとかなりの量の指摘をくれます。

Issueタブでは、BugやCode Smellの詳細を見ることができます。

上の例だと何も表示されていませんが、以下のようにコードレベルの指摘を視覚的に見ることができるので、かなり対応がしやすく、コードの均質化につながると思います。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA