Contents
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
http://localhost:9000/dashboard?id=<project_name>bin
directory to thePATH
environment variable

リンク先のページから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の詳細を見ることができます。

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