CentOS 8にSonarQubeサーバーをインストールする

# What's

CentOS 8に、SonarQubeサーバーの8.6をインストールしてみます。


# SonarQubeとは

SonarQubeは、ソースコードのバグ、脆弱性などを検出するツールです。

使い方としては2つあるようです。

* IDEなどでソースコードを書く時に使う[SonarLint](https://www.sonarlint.org/)
* ビルドやテスト実行時に解析を行うSonarQube scanner
  * SonarQube scannerはSonarQubeサーバーに結果を送信する

今回は、SonarQubeサーバーをCentOS 8にインストールしてみます。


# SonarQubeサーバー

SonarQubeのダウンロードページに行くと、4種類あることが確認できます。

[Download](https://www.sonarqube.org/downloads/)

Community Edition、Developer Edition、Enterprise Edition、Data Center Editionがあり、できることがより増えていくようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/f300d832-4574-654f-a993-b165cad79f14.png)

Community Editionでは、以下の15言語に対応しています。

* Java
* JavaScript
* C#
* TypeScript
* Kotlin
* Ruby
* Go
* Scala
* Flex
* Python
* PHP
* HTML
* CSS
* XML
* VB.NET

Developer Editionになると、Community Editionの15言語に加えて以下の7言語が追加されます。

* C
* C++
* Objective-C
* Swift
* ABAP
* T-SQL
* PL/SQL

Enterprise EditionおよびData Center Editionでは、さらに5言語が追加されます。

* Apex
* COBOL
* PLI
* RPG
* VB6

対応している言語とEditionについては、こちらを見るとよいでしょう。

[Languages / Overview](https://docs.sonarqube.org/8.6/analysis/languages/overview/)

今回はフリーで使えるCommunity Editionをインストールしてみます。

SonarQubeにはLTS（長期サポート）があり、現在のLTSとなっているバージョンは7.9です。  
また、LTSの期間は18ヶ月のようです。

[Long Term Support](https://www.sonarqube.org/downloads/lts/)

SonarQube自体は約2ヶ月で新しいリリースを行っているようで、現時点での最新版は8.6です。

今回は、SonarQubeサーバー8.6をインストールしましょう。


# 環境

今回の環境は、こちらです。

```shell
$ cat /etc/redhat-release 
CentOS Linux release 8.3.2011


$ uname -srvmpio
Linux 4.18.0-240.10.1.el8_3.x86_64 #1 SMP Mon Jan 18 17:05:51 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
```


# SonarQubeのインストールに必要なもの

SonarQube 8.6のドキュメントはこちらです。

[SonarQube Documentation](https://docs.sonarqube.org/8.6/)

インストールに必要な情報を見てみます。

[Prerequisites and Overview](https://docs.sonarqube.org/8.6/requirements/requirements/)

* 2G以上のメモリ、1G以上の空きメモリが必要
    * 大規模で使う場合は複数台の構成になる
* 32bit OSはサポートしていない
* Java
    * SonarQubeサーバー： Oracle JRE 11またはOpenJDK 11
    * SonqrQube scanner： Oracle JRE 8、11またはOpenJDK 8、11
* データベース（バージョンまで明記されています）
    * PostgreSQL
    * Microsoft SQL Server
    * Oracle
    
今回は、OpenJDK 11、PostgreSQL 12を使って環境を作ります。


# 必要なソフトウェアのインストール

というわけで、まずはOpenJDK 11とPostgreSQL 12をインストールしましょう。

OpenJDK 11のインストール。CentOS 8のパッケージで入れます。

```shell
$ sudo dnf install java-11-openjdk-devel
```

インストールされたバージョン。

```shell
$ java --version
openjdk 11.0.9.1 2020-11-04 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.9.1+1-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.9.1+1-LTS, mixed mode, sharing)
```

PostgreSQLは、こちらから。

[Linux downloads (Red Hat family)](https://www.postgresql.org/download/linux/redhat/)


```shell
$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

$ sudo dnf -qy module disable postgresql

$ sudo dnf install -y postgresql12-server
```

`psql`ですが、バージョン確認。

```shell
$ psql -V
psql (PostgreSQL) 12.5
```

初期化と起動まで。

```shell
$ sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
$ sudo systemctl enable postgresql-12
$ sudo systemctl start postgresql-12
```

ドキュメントを見ていると、専用のユーザーとかは作った方がよさそうなので作っておきましょう。

[Install the Server / Installing the database](https://docs.sonarqube.org/8.6/setup/install-server/#header-2)

`sonarqube`というユーザーと、`sonarqubedb`というデータベースを作成しました。

```shell
$ sudo -u postgres psql
psql (12.5)
Type "help" for help.

postgres=# create user sonarqube with password 'password1234';
CREATE ROLE

postgres=# create database sonarqubedb owner sonarqube;
CREATE DATABASE
```

`pg_hba.conf`を編集して、作成した`sonarqube`ユーザーをパスワード認証できるようにします。

`/var/lib/pgsql/12/data/pg_hba.conf`に、以下を追加。

```shell
host    sonarqubedb     sonarqube       127.0.0.1/32            md5
```

全体としてはこんな感じです。

```shell
$ sudo grep -Ev '^#|^$' /var/lib/pgsql/12/data/pg_hba.conf
local   all             all                                     peer
host    sonarqubedb     sonarqube       127.0.0.1/32            md5
host    all             all             127.0.0.1/32            ident
host    all             all             ::1/128                 ident
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident
```

変更したら、PostgreSQLサーバーを再起動。

```shell
$ sudo systemctl restart postgresql-12
```

これで、準備は完了ですね。


# SonarQubeサーバーをインストールする

では、SonarQubeサーバーをインストールしましょう。

今回は、なにも考えずに使っているOSユーザーのホームディレクトリにインストールすることにします。

[Install the Server / Installing SonarQube from the ZIP file](https://docs.sonarqube.org/8.6/setup/install-server/#header-3)

SonarQubeサーバー8.6のzipファイルをダウンロードしてきて展開。

```shell
$ curl -sLO https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.6.0.39681.zip
$ unzip sonarqube-8.6.0.39681.zip
$ cd sonarqube-8.6.0.39681
```

設定ファイルは、`conf/sonar.properties`にあります。

また、H2、Microsoft SQL Server、PostgreSQLを使う場合は、JDBCドライバはすでに含まれているようです。

```shell
$ find lib/jdbc -type f
lib/jdbc/mssql/mssql-jdbc-7.4.1.jre11.jar
lib/jdbc/postgresql/postgresql-42.2.17.jar
lib/jdbc/h2/h2-1.4.199.jar
```

Oracleの場合は、JDBCドライバをダウンロードしてきて`extensions/jdbc-driver/oracle`に格納する必要があります。

最低限の設定も、こちらに書いてあります。

[Install the Server / Installing SonarQube from the ZIP file](https://docs.sonarqube.org/8.6/setup/install-server/#header-3)

`conf/sonar.properties`に、データベースの接続先を設定。

```shell
$ grep -vE '^#|^$' conf/sonar.properties 
sonar.jdbc.username=sonarqube
sonar.jdbc.password=password1234
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonarqubedb
```

SonarQubeを起動。

```shell
$ bin/linux-x86-64/sonar.sh start
```

メッセージを見ると、起動が完了したかのように見えます。

```shell
Starting SonarQube...
Started SonarQube.
```

が、どうやら起動できていないようです。

```shell
$ bin/linux-x86-64/sonar.sh status
SonarQube is not running.
```

`logs`ディレクトリ内に`sonar-[YYYYmmdd].log`という形式でログが出ているので、確認してみます。

```shell
2021.01.22 03:12:14 INFO  app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
```

Elasticsearchを使っているようで、`vm.max_map_count`が足りないようです。

現在値を確認。

```shell
$ sudo sysctl -a | grep vm.max_map_count
vm.max_map_count = 65530
```

`/etc/sysctl.conf`に以下を追記して

```shell
vm.max_map_count = 262144
```

反映します。

```shell
$ sudo sysctl -p
```

もう1度確認。

```shell
$ sudo sysctl -a | grep vm.max_map_count
vm.max_map_count = 262144
```

今度は起動します。

```shell
$ bin/linux-x86-64/sonar.sh start
```

`http://[SonarQubeが可動しているホストのIPアドレス]:9000`にアクセスすると、こんなページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/380463fd-1861-1be3-5d5d-3a6b8623fefe.png)

リモートから接続する場合で、`firewalld`が有効になっている場合はポート`9000`を許可してください。

```shell
$ sudo firewall-cmd --permanent --zone=public --add-port=9000/tcp
$ sudo firewall-cmd --reload
```

デフォルトの管理者のユーザー名、パスワードはともに`admin`です。

[Security / Authentication](https://docs.sonarqube.org/8.6/instance-administration/security/#header-2)

初回はパスワードの変更が求められるので、それを完了させると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/9c0d38fb-986d-f24e-8567-d085aacf336c.png)

ログイン完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/d239f309-284c-c30a-19db-92e29ee8754d.png)

ステータスの確認。

```shell
$ bin/linux-x86-64/sonar.sh status
SonarQube is running (1144).
```

停止は、`stop`です。

```shell
$ bin/linux-x86-64/sonar.sh stop
```

せっかくなので、Elasticsearchのバージョンも確認してみましょう。

```shell
]$ curl localhost:9001
{
  "name" : "sonarqube",
  "cluster_name" : "sonarqube",
  "cluster_uuid" : "p91MRP_4SLKBnreadmMUGQ",
  "version" : {
    "number" : "7.9.3",
    "build_flavor" : "oss",
    "build_type" : "tar",
    "build_hash" : "c4138e51121ef06a6404866cddc601906fe5c868",
    "build_date" : "2020-10-16T10:36:16.141335Z",
    "build_snapshot" : false,
    "lucene_version" : "8.6.2",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
```

というわけで、CentOS 8にSonarQubeサーバー8.6のインストールが完了しました。