SonarQubeをセットアップしたメモ。

# SonarQubeをセットアップしたメモ。

参考: http://docs.sonarqube.org/display/SONAR/Installing+the+Server

## 環境

Win10ホスト上のVirtualBoxのCentOS7。

```tarminal
# uname -srmo
Linux 3.10.0-327.36.1.el7.x86_64 x86_64 GNU/Linux

# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

## PostgreSQL

PostgreSQLを入れる。

PostgreSQLでなくてもいい。
MySQLとか、SQLServerとかでもOK。

> DBのセットアップが面倒な場合はH2で動かすこともできる模様。

```bash
# @root

yum -y groupinstall "Development Tools"

yum -y install readline-devel zlib-devel wget

useradd postgres

passwd postgres
#> postgres

# visudoして、postgresでsudoできるようにしておく
```

```bash
# @postgres

mkdir src

cd src

wget -d https://ftp.postgresql.org/pub/source/v9.6.0/postgresql-9.6.0.tar.gz

wget -d https://ftp.postgresql.org/pub/source/v9.6.0/postgresql-9.6.0.tar.gz.sha256

diff <(cat postgresql-9.6.0.tar.gz.sha256) <(sha256sum postgresql-9.6.0.tar.gz)

tar xzf postgresql-9.6.0.tar.gz

cd postgresql-9.6.0

./configure --prefix=/home/postgres

make

make install

cd contrib/start-scripts
# systemd用のやつもついてきたらいいのに。
# ググれば動きそうな雰囲気のものが出てくるが。。。

cp linux postgresql

sed -i -r \
  -e 's;^(prefix)=.*$;\1=/home/postgres;' \
  -e 's;^(PGDATA)=.*$;\1=/home/postgres/pgdata;' \
  postgresql

diff linux postgresql
# 変更箇所の確認

sudo mv postgresql /etc/init.d/

sudo chown root:root /etc/init.d/postgresql

sudo chmod 555 /etc/init.d/postgresql

cd ~

mkdir pgdata

chmod 700 pgdata
# postgresはPGDATAのパーミッションにうるさい。

initdb --no-locale --encoding=UTF8 --pgdata=/home/postgres/pgdata
# --no-localeつけとかないとorderbyで困るときがある。
# 詳しくはググってください。

cd pgdata

cat <<'END'>> pg_hba.conf
host all all 0.0.0.0/0 md5
END
# localhostからしかアクセスしない予定なので、あまり関係ないが一応。

cp postgresql.conf{,.bak}

sed -i -r \
  -e "s;^#listen_addresses = 'localhost'(.*)$;listen_addresses = '*'\1;" \
  postgresql.conf
# localhostからしかアクセスしない予定なので、、、以下同

diff postgresql.conf*
# 変更箇所の確認

sudo /etc/init.d/postgresql start

createuser --pwprompt --encrypted sonar
#> sonar

psql -c '\du'
# ユーザできてることを確認

createdb --owner=sonar sonar

psql -c '\l'
# DBできてることを確認
```

## SonarQube

```bash
# @root

yum -y install java-1.8.0-openjdk-devel

useradd sonar

passwd sonar
#> sonar
```

```bash
# @sonar

mkdir src

cd src

wget -d https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-5.6.3.zip

wget -d https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-5.6.3.zip.md5

diff <(cat sonarqube-5.6.3.zip.md5) <(md5sum sonarqube-5.6.3.zip | awk '$0=$1')

unzip sonarqube-5.6.3.zip

mv sonarqube-5.6.3/* ~/

rm -rf sonarqube-5.6.3

cd ~/conf

cp sonar.properties{,.bak}

sed -i -r \
  -e 's;^#(sonar\.jdbc\.username)=.*$;\1=sonar;' \
  -e 's;^#(sonar\.jdbc\.password)=.*$;\1=sonar;' \
  -e 's;^#(sonar\.jdbc\.url=jdbc:postgresql:).*$;\1//localhost:5432/sonar;' \
  -e 's;^#(sonar\.web\.javaOpts)=.*$;\1=-server -Xmx768m -Xms768m -Djava.net.preferIPv4Stack=true;' \
  -e 's;^#(sonar\.web\.context)=.*$;\1=/sonar;' \
  -e 's;^#(sonar\.web\.port)=.*$;\1=9000;' \
  -e 's;^#(sonar\.ce\.javaOpts)=.*$;\1=-server -Xmx1024m -Xms1024m -Djava.net.preferIPv4Stack=true;' \
  sonar.properties
# elasticsearchのオプションもいじったほうがいいのかも。。。
# 具体的に何者なのか不明なので、とりあえず放置。

diff sonar.properties*
# 変更箇所の確認

cd ~/bin

ln -s linux-x86-64/sonar.sh sonar

sonar start

tail -f ~/logs/sonar.log

# 2016.10.09 00:27:54 INFO  app[o.s.p.m.Monitor] Process[web] is up
# 2016.10.09 00:28:10 INFO  app[o.s.p.m.Monitor] Process[ce] is up
# ...のようなログが出てきたら起動完了しているはず
```

=> http://localhost:9000/sonar

`admin` / `admin` でログインできる。

```bash
# @postgres

psql sonar -c '\d'
# いろいろtableができてるはず
```

### [番外] 本題には関係ないが、試しにsystemdにserviceとして登録してみる。

```bash
# @root

cd /etc/systemd/system

cat <<'END'> sonar.service
[Unit]
Description = sonarqube

[Service]
ExecStart = /home/sonar/bin/linux-x86-64/sonar.sh start
ExecStop = /home/sonar/bin/linux-x86-64/sonar.sh stop
Type = forking
PIDFile = /home/sonar/bin/linux-x86-64/SonarQube.pid
User=sonar
Group=sonar

[Install]
WantedBy=multi-user.target
END
# postgresをrequireに追加すべきだが、
# postgresをsystemd化していないので今回は気にしない

systemctl daemon-reload
# 設定のリロード

systemctl list-unit-files sonar.service
# disabledとなっているはず

systemctl start sonar
# 起動

systemctl status sonar
# 確認

systemctl stop sonar
# 停止
```

## sonar-scanner

```bash
# @root

cd /opt

wget -d https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.8.zip

unzip sonar-scanner-2.8.zip

ln -s sonar-scanner-2.8 sonar-scanner

cd sonar-scanner/conf

cp sonar-scanner.properties{,.bak}

sed -i -r \
  -e 's;^#(sonar\.host\.url)=.*$;\1=http://localhost:9000/sonar;' \
  -e 's;^#(sonar\.sourceEncoding)=.*$;\1=UTF-8;' \
  sonar-scanner.properties

diff sonar-scanner.properties*
# 変更箇所の確認

cd /etc/profile.d

cat <<'END'> sonar-scanner.sh
export SONAR_SCANNER_OPTS="-Xmx1024m -Xms1024m"
END
```

## 使ってみる

早速使ってみたいが解析するプロジェクトがないと始まらないので
個人的にお気に入りのJavaフレームワーク[sparkframework](http://sparkjava.com/)さんに被験者になってもらうことにする。

```bash

cat <<'END'>> ~/.bash_profile

export SONAR_SCANNER=/opt/sonar-scanner
export PATH=$PATH:$SONAR_SCANNER/bin
END

source ~/.bash_profile

mkdir projects

cd projects

git clone https://github.com/perwendel/spark.git

cd spark

git checkout -b sonar

mvn compile
# maven入ってなかったらダウンロードしてパス通すなりyumで入れるなりする

cat <<'END'> sonar-project.properties
sonar.projectKey=com.sparkjava:spark-core
sonar.projectName=spark-core
sonar.projectVersion=2.6-SNAPSHOT
sonar.sources=src/main/java
sonar.language=java
sonar.binaries=target/classes
sonar.java.source=1.8
sonar.java.target=1.8
END

sonar-scanner
```

=> http://localhost:9000/sonar/dashboard/index/com.sparkjava:spark-core

> sonar-scannerが完了したあと、ComputeEngineが動く。
> なので、scanner完了、即解析結果が見える！というわけではない。
> 解析完了したかどうかは
> Administration -> Projects -> Background Tasks
> を見るとわかる。

----

## 

なかなか良さげ。
夜中にcronなりjenkinsなりで動かしておくとかすればいいかな。