前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >搭建您自己的SonarQube

搭建您自己的SonarQube

作者头像
Criss@陈磊
发布2019-10-09 14:54:58
1.7K0
发布2019-10-09 14:54:58
举报
文章被收录于专栏:测试技术圈测试技术圈

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源

  • 阿里源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  • 网易源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
  • 华为源 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 修改CentOS-Base.repo文件,取消baseurl开头的行的注释,并增加mirrorlist开头的行的注释。将文件中的http://mirror.centos.org替换成https://mirrors.huaweicloud.com,可以参考如下命令:sed -i "s/#baseurl/baseurl/g" /etc/yum.repos.d/CentOS-Base.repo sed -i "s/mirrorlist=http/#mirrorlist=http/g" /etc/yum.repos.d/CentOS-Base.repo sed -i "s@http://mirror.centos.org@https://mirrors.huaweicloud.com@g" /etc/yum.repos.d/CentOS-Base.repo
  • 搜狐源 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 修改CentOS-Base.repo文件,取消baseurl开头的行的注释,并增加mirrorlist开头的行的注释。将文件中的http://mirror.centos.org替换成http://mirrors.sohu.com,可以参考如下命令:sed -i "s/#baseurl/baseurl/g" /etc/yum.repos.d/CentOS-Base.repo sed -i "s/mirrorlist=http/#mirrorlist=http/g" /etc/yum.repos.d/CentOS-Base.repo sed -i "s@http://mirror.centos.org@http://mirrors.sohu.com@g" /etc/yum.repos.d/CentOS-Base.repo

修改完后,使用如下命令重建yum缓存

代码语言:javascript
复制
yum clean all && yum makecache

修改完成后,安装如下的依赖

代码语言:javascript
复制
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 10

PostgreSQL是一个基于POSTGRES的对象关系数据库管理系统(ORDBMS),它是在加州大学伯克利分校计算机科学系开发的。POSTGRES开创了许多概念,这些概念后来才在一些商业数据库系统中得到应用。

通过如下命令安装PostgreSQL

代码语言:javascript
复制
# 加入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 身份验证.

代码语言:javascript
复制
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/tcpfirewall-cmd --reload

启动PostgreSQL:

代码语言:javascript
复制
systemctl start postgresql-10
systemctl enable postgresql-10
systemctl status postgresql-10

返回如下,表示成功:

进入Postgresql,并为sonar创建用户、数据库并设置密码(<>是sonar用户的密码,需自行设定):

代码语言:javascript
复制
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安装和配置

下载sonar安装包:wget -O /home/tool/sonarqube.zip https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.9.1.zip

安装配置:

代码语言:javascript
复制
# 解压到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

配置环境变量

代码语言:javascript
复制
# 设置默认的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末尾贴入如下内容:

代码语言:javascript
复制
# 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文件加入如下内容:

代码语言:javascript
复制
[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并设置开启随系统启动:

代码语言:javascript
复制
sudo systemctl daemon-reload
sudo systemctl start sonar.service
sudo systemctl enable sonar.service

验证是否启动成功:

代码语言:javascript
复制
netstat -tulpn | grep 9000

返回如下内容表示启动成功:

sonarqube的log

代码语言:javascript
复制
# 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端口就可以访问了。

sonar其他keypoint

sonarqube升级后

当你升级SonarQube后,需要重建ES索引:

代码语言:javascript
复制
sudo systemctl stop sonar.service
sudo rm -rf /opt/sonarqube/data/es*
sudo systemctl start sonar.service
SonarQube迁移

先进性数据库备份:

代码语言:javascript
复制
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

如果迁移过程中出现如下问题:

代码语言:javascript
复制
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

那么按照如下步骤处理:

代码语言:javascript
复制
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呢?首先从公共仓库拉去镜像:

代码语言:javascript
复制
docker pull postgres
docker pull sonarqube

然后,通过docker runner 启动:

代码语言:javascript
复制
#启动数据库
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的对你的项目进行质量保障了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 质问 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 非容器化
    • 修改国内的yum源
      • 安装PostgreSQL 10
        • sonar安装和配置
          • sonar其他keypoint
            • sonarqube升级后
            • SonarQube迁移
        • 容器化
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档