SonarQubeをセットアップしたメモ。
参考: http://docs.sonarqube.org/display/SONAR/Installing+the+Server
環境
Win10ホスト上のVirtualBoxのCentOS7。
# 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で動かすこともできる模様。
# @root
yum -y groupinstall "Development Tools"
yum -y install readline-devel zlib-devel wget
useradd postgres
passwd postgres
#> postgres
# visudoして、postgresでsudoできるようにしておく
# @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
# @root
yum -y install java-1.8.0-openjdk-devel
useradd sonar
passwd sonar
#> sonar
# @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
でログインできる。
# @postgres
psql sonar -c '\d'
# いろいろtableができてるはず
[番外] 本題には関係ないが、試しにsystemdにserviceとして登録してみる。
# @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
# @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さんに被験者になってもらうことにする。
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なりで動かしておくとかすればいいかな。