SonarQube(以下简称Sonar),是一个用于代码质量管理的开源的平台。通过插件机制可以和不通的测试工具、代码分析工具或者持续集成等平台相结合。Sonar不是一个质量数据报告方面的工具,是一个代码管理的质量平台。目前它支持绝大部分的变成语言,例如Java、C#、Python、C#、C等。同时Sonar提供了和各种IDE的集成方法,可方便在各种场景下引入使用。
在devops流水线中,所有的代码都存储在代码仓库中,通过git的一些方法可以完成代码的codereview的卡点设置,那么下一步需要搭建的服务是什么呢?下一步就是Sonar,通过Sonar完成代码质量的管理。
本文以CentOS7为例
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
修改完后,使用如下命令重建yum缓存
yum clean all && yum makecache
修改完成后,安装如下的依赖
yum install -y epel-release unzip vim wget
yum install -y java-11-openjdk java-11-openjdk-devel
https://notebook.yasithab.com/centos/centos-7-install-sonarqube
PostgreSQL是一个基于POSTGRES的对象关系数据库管理系统(ORDBMS),它是在加州大学伯克利分校计算机科学系开发的。POSTGRES开创了许多概念,这些概念后来才在一些商业数据库系统中得到应用。
通过如下命令安装PostgreSQL
# 加入postgresql的yum源
rpm -Uvh https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
# 安装 PostgreSQL 10 Server
yum install -y postgresql10-server postgresql10
# 初始化 PGDATA
/usr/pgsql-10/bin/postgresql-10-setup initdb
然后编辑/var/lib/pgsql/10/data/pg_hba.conf来支持 MD5-based 身份验证.
vim /var/lib/pgsql/10/data/pg_hba.conf
然后输入i
,进入编辑模式:
修改如下图部分的红色框内的为md5后,按ESC按钮,输入:wq
后回车。
默认情况PostgreSQL server仅仅可以通过本访问,如果你希望通过你自己的其他机器可以访问该服务,需要作修改
/var/lib/pgsql/10/data/postgresql.conf
设置listen_addresses = '*'
,同时修改var/lib/pgsql/10/data/pg_hba.conf修改上面的哪一行为host all all 0.0.0.0/0 md5
,同时设置防火墙打开PostgreSQL的端口命令为firewall-cmd --permanent --add-port=5432/tcp
和firewall-cmd --reload
启动PostgreSQL:
systemctl start postgresql-10
systemctl enable postgresql-10
systemctl status postgresql-10
返回如下,表示成功:
进入Postgresql,并为sonar创建用户、数据库并设置密码(<>是sonar用户的密码,需自行设定):
su - postgre
psql -U postgres
CREATE DATABASE sonar;
CREATE USER sonar WITH ENCRYPTED PASSWORD '<sonar-password>';
GRANT ALL PRIVILEGES ON DATABASE sonar TO sonar;
ALTER DATABASE sonar OWNER TO sonar;
\q
下载sonar安装包:wget -O /home/tool/sonarqube.zip https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.9.1.zip
安装配置:
# 解压到opt中
unzip /tmp/sonarqube.zip -d /opt
# 重命名sonar
mv /opt/sonarqube-7.9.1 /opt/sonarqube
# 为sonarqube添加一个账号
sudo adduser sonar -s /sbin/nologin
# 修改对应的sonar用户的权限(sonarqube文件夹)
chown -R sonar:sonar /opt/sonarqube
配置环境变量
# 设置默认的jdk
alternatives --config java
# 设置java环境变量
export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which javac)))))
# 环境变量生效
source /etc/bashrc
# 检测对应的java版本
java -version
返回如下,表示成功设置了java环境:
在/opt/sonarqube/conf/sonar.properties末尾贴入如下内容:
# DATABASE
sonar.jdbc.username=sonar
sonar.jdbc.password=<sonar-user-password>
sonar.jdbc.url=jdbc:postgresql://localhost/sonar
sonar.jdbc.maxActive=60
sonar.jdbc.maxIdle=5
sonar.jdbc.minIdle=2
sonar.jdbc.maxWait=5000
sonar.jdbc.minEvictableIdleTimeMillis=600000
sonar.jdbc.timeBetweenEvictionRunsMillis=30000
sonar.jdbc.removeAbandoned=true
sonar.jdbc.removeAbandonedTimeout=60
# WEB SERVER
sonar.web.host=127.0.0.1
sonar.web.port=9000
sonar.web.javaOpts=-server -Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError
sonar.search.javaOpts=-server -Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError
sonar.ce.javaOpts=-server -Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError
# ACTIVE DIRECTORY CONFIGURATIONS
sonar.security.realm=LDAP
sonar.security.savePassword=true
sonar.authenticator.downcase = true
ldap.url=ldap://<ldap-server>.zone24x7.lk:389
ldap.bindDn=<ldap-user>@zone24x7.lk
ldap.bindPassword=<ldap-password>
ldap.user.baseDn=dc=zone24x7,dc=lk
ldap.user.request=(&(objectClass=User)(sAMAccountName={login}))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail
创建sonar开启启动,在/etc/systemd/system/sonar.service
文件加入如下内容:
[Unit]
Description=SonarQube Server
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop
LimitNOFILE=65536
LimitNPROC=4096
User=sonar
Group=sonar
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动sonar并设置开启随系统启动:
sudo systemctl daemon-reload
sudo systemctl start sonar.service
sudo systemctl enable sonar.service
验证是否启动成功:
netstat -tulpn | grep 9000
返回如下内容表示启动成功:
sonarqube的log
# SonarQube service log
tail -f /opt/sonarqube/logs/sonar.log
# Web Server logs
tail -f /opt/sonarqube/logs/web.log
# ElasticSearch logs
tail -f /opt/sonarqube/logs/es.log
# Compute Engine logs
tail -f /opt/sonarqube/logs/ce.log
部署完成后,通过ip+9000端口就可以访问了。
当你升级SonarQube后,需要重建ES索引:
sudo systemctl stop sonar.service
sudo rm -rf /opt/sonarqube/data/es*
sudo systemctl start sonar.service
先进性数据库备份:
sudo su - postgres
pg_dump sonar > sonar.pgsql
将导出的pgsql文件存入/var/lib/pgsql下
sudo su - postgres
psql sonar < sonar.pgsql
# 改变tabls、sequence和views的权限
sudo su - postgres
# Tables
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" sonar` ; do psql -c "alter table \"$tbl\" owner to sonar" sonar ; done
# Sequences
for tbl in `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" sonar` ; do psql -c "alter table \"$tbl\" owner to sonar" sonar ; done
# Views
for tbl in `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" sonar` ; do psql -c "alter table \"$tbl\" owner to sonar" sonar ; done
# 最后的清理工作
sudo su - postgres
vacuumdb sonar
如果迁移过程中出现如下问题:
web[][o.s.s.p.d.m.DatabaseMigrationImpl] DB migration ended with an exception org.sonar.server.platform.db.migration.step.MigrationStepExecutionException: Execution of migration step #2114 'Add unique indexes on table users' failed
那么按照如下步骤处理:
sudo -u postgres psql
# Show databases
\list
# Switch to sonar database
\connect sonar
DROP INDEX IF EXISTS users_login;
DROP INDEX IF EXISTS user_tokens_login_name;
ALTER TABLE users DROP CONSTRAINT IF EXISTS users_login;
ALTER TABLE user_tokens DROP CONSTRAINT IF EXISTS user_tokens_login_name;
ALTER TABLE file_sources DROP CONSTRAINT IF EXISTS file_sources_uuid_type;
\q
容器化的好处不言而喻,那么如何使用docker部署sonarQube呢?首先从公共仓库拉去镜像:
docker pull postgres
docker pull sonarqube
然后,通过docker runner 启动:
#启动数据库
docker run --name db -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -d postgres
#启动sonarqube
docker run --name sq --link db -e SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar -p 9000:9000 -d sonarqube
启动后,就可以通过http://localhost:9000访问了。第一次启动会稍微慢一下,等待启动完成就好了。
初次访问的配置
首次访问的*用户名:admin,密码:admin,进入后提醒配置token,配置完成后记得记录,后续和jenkins以及其他的很多平台交互都会用到。
同时提供了一些maven、gradle项目使用sonarQube的方法,将其对应的配置加入到项目的配置中就可以调用sonarqube的对你的项目进行质量保障了。