概要
SonarQubeを使ってTypeScriptをローカルで静的解析してみた。
Windows上でDocker越しSonarQubeを起動して、ローカルソースをコード検証するの手順を基本的に踏襲する
環境
- Windows 11 Home
23H2 22631.3737
- Docker Desktop
Docker version 26.1.1, build 4cf5afa
コードの構造
- app
+ src
- sonar-project.properties
- docs
- sonarQube
- docker-compose.yml
- bin
- .env
- up.sh
- cli.sh
+ reports
ソースコード
postgresql:16
を利用している。
参考の通りにしたら、postgresql | 2024-06-17 16:40:12.168 UTC [40] FATAL: role "root" does not exist
のエラーがでるのでUオプションでユーザ名を指定している。
- version3.9未満の場合、depeneds_onを配列にすると動く
- version: '3.9'
+ version: '3'
depends_on:
- sonarqube_db:
- condition: service_healthy
+ - sonarqube_db
version: '3.9'
services:
sonarqube:
image: sonarqube:community
hostname: sonarqube
container_name: sonarqube
depends_on:
sonarqube_db:
condition: service_healthy
environment:
SONAR_JDBC_URL: jdbc:postgresql://sonarqube_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
ports:
- "9000:9000"
sonarqube_db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U sonar"]
interval: 10s
timeout: 5s
retries: 5
hostname: postgresql
container_name: postgresql
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonar
volumes:
- sonarqube_postgresql:/var/lib/postgresql
- sonarqube_postgresql_data:/var/lib/postgresql/data
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
sonarqube_postgresql:
sonarqube_postgresql_data:
docker-compose up
で起動すると http://localhost:9000 に立ち上がるので、手順に沿ってプロジェクトを作成したら環境変数を埋める。Yakumi
プロジェクトを作成した。
SONAR_TOKEN=sqp_mytoken
SONAR_PASS=hoge
sonar.projectKey=Yakumi
sonar.sources=app/src
sonar.tests=app/tests
sonar.sourceEncoding=UTF-8
参考にしている手順と異なる点として、cliもdockerで動かしている。なお、HOST_URLはhost.docker.internal
でローカルホストを指している。
#!/bin/bash
bin_dir=$(cd $(dirname $0) && pwd)
parent_dir=$(cd $bin_dir/.. && pwd)
work_dir=$(cd $bin_dir/../../.. && pwd)
source $bin_dir/.env
cd $work_dir
docker run \
--rm \
-v sonar_cache:/opt/sonar-scanner/.sonar/cache \
-e SONAR_HOST_URL="http://host.docker.internal:9000/" \
-e SONAR_TOKEN="$SONAR_TOKEN" \
-v ".:/usr/src" \
sonarsource/sonar-scanner-cli
cd $parent_dir && curl -s -u admin:$SONAR_PASS -G -d "component=Yakumi" -d "metricKeys=cognitive_complexity" http://localhost:9000/api/measures/component_tree | jq '.baseComponent' > ./reports/cognitiveComplexity.json
wsl版dockerの場合はhost.docker.internalを使うために追加の設定が必要
#!/bin/bash
bin_dir=$(cd $(dirname $0) && pwd)
parent_dir=$(cd $bin_dir/.. && pwd)
work_dir=$(cd $bin_dir/../../.. && pwd)
source $bin_dir/.env
cd $work_dir
docker run \
--rm \
-v sonar_cache:/opt/sonar-scanner/.sonar/cache \
+ --add-host="host.docker.internal:host-gateway" \
-e SONAR_HOST_URL="http://host.docker.internal:9000/" \
-e SONAR_TOKEN="$SONAR_TOKEN" \
-v ".:/usr/src" \
sonarsource/sonar-scanner-cli
cd $parent_dir && curl -s -u admin:$SONAR_PASS -G -d "component=Yakumi" -d "metricKeys=cognitive_complexity" http://localhost:9000/api/measures/component_tree | jq '.baseComponent' > ./reports/cognitiveComplexity.json
metricKeysについてはSonarQubeユーザーガイド - metrics_definitionを参照
動作確認
静的解析の結果が表示された
参考
Windows上でDocker越しSonarQubeを起動して、ローカルソースをコード検証する
SonarQubeさんに怒られたら
SonarSource - docker-compose
Docker - networking
sonarscanner-from-docker-image
SonarQubeユーザーガイド - metrics_definition