SonarQubeによる静的コード解析

ソースコードの品質を担保すること。大事なことですが、結構大変です。

コードレビューを徹底していたとしても、プロジェクトが長期化する場合、プロジェクトメンバーの入れ替わりもあるでしょう。
メンバーが入れ替わると、どうしても観点のズレ等が生じてしまうものです。
また、人的なレビューには限界もあります。
そうやって徐々に技術的負債が積み上がっていき・・・

負債を抱えないためにも、ソフトウェアメトリクスの観点で継続的に品質をレビューしてくれる仕組みがあるといいですよね。

SonarQube

SonarQubeは、SonarSource社が開発しているオープンソースの品質管理ツールです。
https://www.sonarqube.org/

ソースコードを静的解析し、検知したバグや脆弱性等をWebのコンソール上で確認することができます。
また、プラグインも豊富で多くの言語をサポートしています。
(一部の言語は有料ライセンスが必要)

Jenkins等のCI環境とも相性がよく、組み合わせることで継続的な品質チェックが行えるようになります。

導入

Docker Hubにイメージが用意されています。
docker-compose.ymlも公式にサンプルがあるため、今回はそのまま利用させてもらいます。

version: "2"

services:
  sonarqube:
    image: sonarqube:8.2-community
    depends_on:
      - db
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    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
      - sonarqube_temp:/opt/sonarqube/temp
  db:
    image: postgres
    networks:
      - sonarnet
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      # This needs explicit mapping due to https://github.com/docker-library/postgres/blob/4e48e3228a30763913ece952c611e5e9b95c8759/Dockerfile.template#L52
      - postgresql_data:/var/lib/postgresql/data

networks:
  sonarnet:
    driver: bridge

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  sonarqube_temp:
  postgresql:
  postgresql_data:

 docker-compose up -d で起動。

$ docker-compose up -d

SonarQube本体とpostgresのプロセスが動いていれば、起動成功です。

$ docker ps 
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
4bd6b20b71c7        sonarqube:8.2-community   "./bin/run.sh"           2 minutes ago       Up 2 minutes        0.0.0.0:9000->9000/tcp   sonar_sonarqube_1
6f9345091bd6        postgres                  "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        5432/tcp                 sonar_db_1

ログイン

ブラウザでhttp://localhost:9090にアクセスし、右上のLog inからログインページへ。
初期設定では、admin / admin でログインできます。

解析

tokenを生成し、プロジェクトの言語・ビルドシステムを設定します。
今回は手元にあったJava/Mavenプロジェクトで試してみます。

生成されたスニペットをプロジェクトディレクトリで実行すると・・

結果

Passed。Quality Gates(品質基準)満たしているようです。

・Reliability (信頼性)
・Security (脆弱性)
・Maintainability (保守性)
・Covergage (コードカバレッジ)
・Duplications (重複コード)
等の観点で指摘・評価(A〜E)をしてくれます。視覚的に分かりやすいですね。

なお、Quality Gatesは、自由に設定が可能です。(例えば、「コードカバレッジが〇〇%以下になったらエラー」等)

ちなみにSecurity ReviewがEとなっていた箇所・・・

プラグインを導入して、jenkins等のCI環境とパイプラインを設定すれば、継続的に解析を行うこともできるようになります。

SonarScanner for Jenkins
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/