amazon linux 2にSonarQubeをインストールし、phpを静的コード解析

## 実行環境

- amazon linux 2 t2.medium
※java,esなどを動かすためある程度のスペックが必要です。
t2.micro, t2.midiumではメモリ不足ですぐにプロセスが殺害されます。。。
公式ドキュメントにはRAM3GBが最低条件と記載ありましたが、もっと必要かと。

## SonarQubeとは

オープンソースの静的解析ツール

私たちの書いたコードを全自動でレビューしてくれて、エラーの可能性や脆弱性のある個所を教えてくれます

主な機能は以下のような感じ

- 重複コードの検出
- サイクロマチック数の計測
- 脆弱性のあるコードの検出
- バグを誘発しそうなコードの検出
- 指摘されたissueの管理

APIなどでなく、専用のサーバにインストールして使用するためオンプレ環境などでも利用できるのも利点。

## SonarQube構成

[公式の画像]([https://docs.sonarqube.org/latest/setup-and-upgrade/install-the-server/](https://docs.sonarqube.org/latest/setup-and-upgrade/install-the-server/))がとても分かりやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101613/eefc7749-7847-c91a-184b-f81ed86e52b8.png)


専用のsonarqubeサーバを立てて、そこに解析したいコードをリクエストする形ですね。

## javaインストール

sonarqubeサーバにはjava17の開発環境(Oracle JRE か OpenJDK)が必要なので入れます。(2023年2月現在)

yum listにもamazon-linux-extrasにも17がないためwgetで入れます。めんどい。

```jsx
# openjdk取得
$ wget https://download.java.net/java/GA/jdk17/0d483333a00540d886896bac774ff48b/35/GPL/openjdk-17_linux-x64_bin.tar.gz

# 圧縮されているのでtar xvfで展開
$ tar xvf openjdk-17_linux-x64_bin.tar.gz

# 展開したフォルダを/optへ移動
$ sudo mv jdk-17 /opt/

# teeコマンドで設定するためのファイルを記述
$ sudo tee /etc/profile.d/jdk.sh <<EOF
#!/bin/sh
export JAVA_HOME=/opt/jdk-17
export PATH=\$PATH:\$JAVA_HOME/bin
EOF

# 設定ファイルを反映させるためsourceコマンドで一度実行
$ source /etc/profile.d/jdk.sh

# 反映されたか確認
$ echo $JAVA_HOME
==> /opt/jdk-17

# インストールされたjavaのバージョン確認
$ java -version
==> openjdk version "17" 2021-09-14
OpenJDK Runtime Environment (build 17+35-2724)
OpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)

# 圧縮ファイルは不要なので削除
$ rm openjdk-17_linux-x64_bin.tar.gz
```

## DBインストール

[公式のドキュメント]([https://docs.sonarqube.org/latest/requirements/prerequisites-and-overview/](https://docs.sonarqube.org/latest/requirements/prerequisites-and-overview/))にリストされている対応データベースをインストール。(表にはないですが、mysqlもいけるぽいです。)

今回はPostgresql14をインストールします。サーバがamazonlinux2なのでamazon-linux-extrasつかいます。

```jsx
# ダウンロードしたいトピックの有効化
$ sudo amazon-linux-extras enable postgresql14

# yumでインストール
$ sudo yum install postgresql postgresql-server

# 自動起動有効化
$ sudo systemctl enable postgresql.service

# postgresユーザにログイン
$ sudo su - postgres

# postgresql初期化
$ initdb --encoding=UTF-8 --no-locale

# postgresqlユーザからログアウト
$ exit

# postgresql.confファイルを編集してpostsqlに接続できるように0.0.0.0をlisten
$ sudo vi /var/lib/pgsql/data/postgresql.conf
<< listen_addresses = '0.0.0.0'
$ sudo vi /var/lib/pgsql/data/pg_hba.conf
<< host    all             all             0.0.0.0/0               md5

# postgresqlを起動
$ sudo systemctl start postgresql

# psqlへ接続しユーザ, データベースを作成
$ psql template1 postgres
$ create user sonar with password 'sonar' createdb;
$ \c template1 sonar
$ create database sonar;
$ exit
```

## SonarQubeインストール

とりあえずsonarqube運用するためのlinuxユーザ作成

```jsx
$ sudo useradd sonarqube
```

また前提条件として、sonarqubeを動かすためには以下の条件が必要です。

- `vm.max_map_count` (メモリマップ領域の最大数)が524,288以上
- `fs.file-max` が131,072以上
- 131072以上のファイルディスクリプターが扱える
- 8192以上のスレッドが扱える

以上を満たすためにOSのパラメータを編集します。

```jsx

# カーネルパラメータを調整
$ sudo vi /etc/sysctl.d/99-sonarqube.conf
<< fs.file-max=65536
vm.max_map_count=262144

# Ulimitを設定
$ sudo vi /etc/security/limits.d/99-sonarqube.conf
<< sonarqube   -   nofile   65536
sonarqube   -   nproc    2048

# OSを再起動して変更したカーネルパラメータを反映
$ sudo shutdown -r now
```

sonarqubeをダウンロード

※ダウンロードソースは公式の[Distributions]([https://www.sonarsource.com/products/sonarqube/downloads/](https://www.sonarsource.com/products/sonarqube/downloads/))から適切なバージョンを選択して入れてください。ここでは執筆現在の最新の9.9.0を入れます。

```jsx
# wgetコマンドでsonarqubeのzipファイル取得
$ wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.0.65466.zip -O /tmp/sonarqube.zip

# ダウンロードしたzipファイルの解凍
$ unzip /tmp/sonarqube.zip

# 解凍したsonarqubeを/usr/localへ移動(これはsonarqubeユーザが使用するため/optでなく/usr/local)
$ sudo mv sonarqube-9.9.0.65466 /usr/local/

# unixベースのシステムではsonarqubeをrootユーザでは実行できないので、sonarqubeユーザに権限を変更
$ sudo chown -R sonarqube:sonarqube /usr/local/sonarqube-9.9.0.65466/
```

sonarqubeが先ほどインストールしたpostgresqlに接続するように設定