開発覚書はてな版

個人的な開発関連の備忘録

【SonarQube】SonarQube on Docker で TypeScript の品質チェック

概要

SonarQube + Docker(Docker Compose)でTypeScriptのソースコードの品質チェックを行う場合の設定方法などを記載します。

www.sonarqube.org

SonarQubeで出来ること

SonarQubeはソースコードの品質をチェックすることが出来ます。
また、ユニットテストの結果・コードカバレッジ等もレポーティング出来ます。
TypeScript以外の開発言語にも対応しています。

その他に、SonarQube独自の指標で技術的負債に対応するための時間などが算出されたりします。

実行環境

  • Docker
  • Docker Compose:SonarQube + PostgreSQL をDocker上で起動
  • Java - Oracle JRE 8:SonarScanner実行に使用
  • Node.js - 10.x
  • Yarn - 1.12.x

使用ライブラリ

  • TypeScript - 3.2.x
  • Angular - 7.2.x
  • TSLint - 5.11.x
  • karma-sonarqube-unit-reporter - 0.0.18
  • sonar-scanner - 3.1.x

実行方法

1. docker-compose.yml を記載

Docker Compose用の設定ファイルを記載します。

version: "2"

services:
  sonarqube:
    image: sonarqube
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    environment:
      - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar
    volumes:
      - sonarqube_conf:/opt/sonarqube/conf
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions

  db:
    image: postgres
    networks:
      - sonarnet
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

networks:
  sonarnet:
    driver: bridge

volumes:
  sonarqube_conf:
  sonarqube_data:
  sonarqube_extensions:
  postgresql:
  postgresql_data:

2. SonarQuber を起動

Docker Composeを使用してSonarQubeを起動します。

docker-compose up -d

3. TSLintやユニットテストの結果を出力

  • TSLintの場合、json形式で結果を出力する。
  • ユニットテストの場合、karma-sonarqube-unit-reporter を使用してUT用のレポートを出力する。

4. sonar-project.properties の設定

# Project identification
sonar.host.url=http://localhost:9000
sonar.projectName=SonarqubeSample
sonar.projectKey=TypeScript:Test
sonar.projectVersion=1.0

# Info required for Sonar
sonar.sources=./src/app
sonar.exclusions=./src/app/**/*.spec.ts,./src/app/**/*.module.ts,./src/main.ts,./src/test.ts,./src/polyfills.ts

# Comma-separated paths to directories with sources (required)
sonar.language=ts

# TS Metrics
sonar.typescript.tsconfigPath=./tsconfig.json
sonar.typescript.tslint.reportPaths=./dist/tslint-result.json
sonar.typescript.lcov.reportPaths=./dist/coverage/lcov.info
sonar.coverage.exclusions=./src/**/*.spec.ts,./src/**/*.module.ts,./src/main.ts,./src/test.ts,./src/polyfills.ts
sonar.tests=./src/app
sonar.test.inclusions=**/*.spec.ts
sonar.testExecutionReportPaths=./dist/ut/ut_report.xml

#----- Default source code encoding
sonar.sourceEncoding=UTF-8

5. SonarScannerの実行

Java or Node.js経由でSonarScannerを実行する。

6. 実行結果

http://localhost:9000/ にアクセスするとSonarScannerでアップロードした内容が反映されます。

Dashborad

f:id:kakkoya:20190211200654p:plain

Overview

f:id:kakkoya:20190211200704p:plain

TSLint

f:id:kakkoya:20190211200748p:plain

コードカバレッジ

f:id:kakkoya:20190211200818p:plain

ユニットテスト

f:id:kakkoya:20190211200835p:plain

ステップ数

f:id:kakkoya:20190211200856p:plain

循環的複雑度

f:id:kakkoya:20190211200908p:plain

サンプルソース一式

github.com

おわりに

  • CIと組み合わせることで継続的にソースコードの品質チェックが出来て便利です。
  • PullRequest発行時にSonarQubeと連携することで、レビューコストが下がります。
  • 品質レポートが分かりやすいので、分析に便利です。