やっつけ不定記

好きなときに好きなことをちゃっちゃと書いてます

SonarQubeを入れてみた

ちょっと前から興味があって探っているソースコードの静的解析ツール。
先日いじったMicrosoft Application Inspector
https://chocopurin.hatenablog.com/entry/2020/05/25/013720 https://chocopurin.hatenablog.com/entry/2020/06/01/223512
に続き、今回はSonarQubeを触ってみました。

オープンソースのCommunity Editionと
有償の3つのEdition(Developer,Enterprise,Data Center)があります。
https://www.sonarqube.org/downloads/
それなりに歴史のあるツールで、プラグイン形式で機能追加できるのが特徴です。

MS Application Inspectorと同様、Dockerから導入可能ということで、
せっかくなので昨日
https://chocopurin.hatenablog.com/entry/2020/06/13/223600
作ったローカル上のAmazon Linux 2のVMイメージでやってみます。

中でElastic Searchが使われているそうで、その兼ね合いでulimit周りに
だいぶいじめられましたが、こんな感じで起動まで行くことができました。
ほかのLinuxディストリビューションで行うときは、事前に

$ sudo sysctl -a

とかで、ホストOSのカーネルパラメータを確認し、SonarQubeの動作要件
https://hub.docker.com/_/sonarqube/
に合わせて微調整する必要があります。

(1)Docker
Gitはあってもなくてもいいと思いますが、
検査対象のソースコード取得で使いそうなので、あえて入れています。

$ sudo yum -y install docker git
$ sudo systemctl start docker
$ sudo systemctl enable docker

(2)Docker-Compose
docker-composeのURLはこれを書いている時点のものなので、最新版を公式サイトで確認すること。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

(3)docker-compose.yml
https://github.com/SonarSource/docker-sonarqube/blob/master/example-compose-files/sq-with-postgres/docker-compose.yml
に例があるので、これを今回の環境向けに変えていきます。
latestタグを指定しているので、本日時点の最新バージョンである8.3が入りますが、
これにはCNES-Reportというレポート系のプラグインが対応していません。
https://docs.sonarqube.org/latest/instance-administration/plugin-version-matrix/
PDF形式のレポートが欲しいとかになると、8.2より前のバージョンを指定することになります。

version: "2"
services:
  sonarqube:
    image: sonarqube:latest
    depends_on:
      - db
    ports:
      - "9000:9000"
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    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:

(4)環境構築
vm.max_map_countは/etc/sysctl.confから恒久的に設定できますが、
ホストOS自体をいじるのではなく、docker系コマンド実行するときのみ
一時的に設定するという方針を取っています。

$ sudo sysctl -w vm.max_map_count=262144
$ sudo docker-compose up -d

(5)動作確認

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
xxxxxxxxxxxx        sonarqube:latest    "bin/run.sh bin/sona…"   45 minutes ago      Up 13 minutes       0.0.0.0:9000->9000/tcp   ec2-user_sonarqube_1
xxxxxxxxxxxx        postgres            "docker-entrypoint.s…"   52 minutes ago      Up 52 minutes       5432/tcp                 ec2-user_db_1
VirtualBoxのポートフォワーディング設定をしたうえで、ブラウザから
http://localhost:9000
にアクセスすると、初期画面が出てきます。
adminユーザでログインして各種設定をしていけば準備完了です。

f:id:chocopurin:20200614222314j:plain

f:id:chocopurin:20200614222321j:plain

(6)その他
コンテナに入ったり、コンテナを再起動するときはこんな感じ。

$ sudo docker exec -it ec2-user_sonarqube_1 /bin/bash
$ sudo docker exec -it ec2-user_db_1 /bin/bash

$ sudo docker stop ec2-user_sonarqube_1
$ sudo docker stop ec2-user_db_1
$ sudo sysctl -w vm.max_map_count=262144
$ sudo docker start ec2-user_db_1
$ sudo docker start ec2-user_sonarqube_1