架构
- 一台SonarQube Server启动3个主要过程:
- Web服务器,供开发人员,管理人员浏览高质量的快照并配置SonarQube实例
- 基于Elasticsearch的Search Server从UI进行后退搜索
- Compute Engine服务器,负责处理代码分析报告并将其保存在SonarQube数据库中
- 一个SonarQube数据库要存储:
- SonarQube实例的配置(安全性,插件设置等)
- 项目,视图等的质量快照。
- 服务器上安装了多个SonarQube插件,可能包括语言,SCM,集成,身份验证和管理插件
- 在构建/持续集成服务器上运行一个或多个SonarScanner,以分析项目
Sonar组成

Sonar集成过程

版本

jdk版本:jdk-1.8.0_linux-x64_bin.tar.gz(注:sonarqube从7.9起,不再支持jdk11以下版本)
数据库:mysql5.6-5.7(sonarqube从7.8起,不再支持mysql)(功能验证也可以SonarQube内置的数据库,这样就不需要改数据库配置)
安装部署
准备工作
- 运行SonarQube的唯一前提条件是在计算机上安装Java(Oracle JRE 11或OpenJDK 11)
- 实例至少需要2GB的RAM才能有效运行,而OS则需要1GB的可用RAM。
- 每个节点分配50Gb的驱动器空间
- 安装在具有出色读写性能的硬盘驱动器上(“数据”文件夹中包含Elasticsearch索引,当服务器启动并运行时,将在该索引上进行大量的i/o。)
- SonarQube在服务器端不支持32位系统。但是,SonarQube确实在扫描仪侧支持32位系统
平台支持

Install for Linux
- 添加系统用户
useradd sonarqube
passwd sonarqube
- 优化系统参数
# 设置最大虚拟内存区域数量
sysctl -w vm.max_map_count=262144
# 设置系统可以同时打开的最大文件描述符数量
sysctl -w fs.file-max=65536
# 设置当前会话中每个进程可以打开的最大文件描述符数量
ulimit -n 65536
# 设置每个用户可以创建的最大进程数
ulimit -u 4096
- 解压安装包
unzip xxx-xx.zip -d /usr/local
ln -sv /usr/local/xxx-xx /usr/local/sonarqube
chown -R sonarqube:sonarqube /usr/local/sonarqube
- 更改配置文件
vim /usr/local/sonarqube/conf/sonar.properties
sonar.jdbc.username=sonarqube
sonar.jdbc.password=
sonar.jdbc.url=jdbc:postgresql://127.0.0.1/sonarqube
- 安装postgresql
yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
yum install postgresql96-server postgresql96-contrib
# 初始化数据库
/usr/pgsql-9.6/bin/postgresql96-setup initdb
# 启动服务,并开机自启
systemctl enable postgresql-9.6 --now
# 切换到 postgres 用户并执行所有数据库操作
sudo -i -u postgres bash <<EOF
psql -U postgres -c "ALTER USER postgres WITH ENCRYPTED PASSWORD 'new_password';"
psql -U postgres -c "CREATE USER sonarqube WITH PASSWORD 'xxxxx';"
psql -U postgres -c "CREATE DATABASE sonarqube OWNER sonarqube;"
psql -U postgres -c "GRANT ALL ON DATABASE sonarqube TO sonarqube;"
psql -U sonarqube -d sonarqube -c "CREATE SCHEMA my_schema;"
EOF
#开启远程访问
vi /var/lib/pgsql/9.6/data/postgresql.conf # listen_addresses = '*'
vi /var/lib/pgsql/9.6/data/pg_hba.conf # host all all 0.0.0.0/0 md5
systemctl restart postgresql-9.6.service
- 启动sonarqube
Install for Docker
## 创建数据目录
mkdir -p /data/devops/sonarqube/{sonarqube_conf,sonarqube_extensions,sonarqube_logs,sonarqube_data}
chmod 777 -R /data/devops6/sonarqube/
## 运行
docker run -itd --name sonarqube \
-p 9000:9000 \
-v /data/devops/sonarqube/sonarqube_conf:/opt/sonarqube/conf \
-v /data/devops/sonarqube/sonarqube_extensions:/opt/sonarqube/extensions \
-v /data/devops/sonarqube/sonarqube_logs:/opt/sonarqube/logs \
-v /data/devops/sonarqube/sonarqube_data:/opt/sonarqube/data \
sonarqube:7.9.2-community
访问: http://x.x.x.x:9000/ 默认密码是 admin admin

配置管理
强制登录

LDAP集成

GitlibSOO集成


Github集成

项目分析
安装配置sonarscanner
下载地址1:SonarScanner CLI (sonarsource.com)
下载地址2:SonarSource Downloads-CDN

分析项目-本地
sonar-scanner \
-Dsonar.host.url=http://192.168.1.200:9000 \ # SonarQube服务器地址
-Dsonar.projectKey=demo-maven-service \ # 项目唯一标识
-Dsonar.projectName=demo-maven-service \ # 项目名称
-Dsonar.projectVersion=1.0 \ # 项目版本
-Dsonar.login=admin \ # 登录用户名
-Dsonar.password=admin \ # 登录密码
-Dsonar.ws.timeout=30 \ # Web服务超时时间(秒)
-Dsonar.projectDescription="my first project!" \ # 项目描述
-Dsonar.links.homepage=http://www.baidu.com \ # 项目主页
-Dsonar.sources=src \ # 源代码目录
-Dsonar.sourceEncoding=UTF-8 \ # 源代码编码
-Dsonar.java.binaries=target/classes \ # 编译后的类文件目录
-Dsonar.java.test.binaries=target/test-classes \ # 编译后的测试类文件目录
-Dsonar.java.surefire.report=target/surefire-reports # Surefire测试报告目录
分析项目-Jenkins
JinkinsSonar插件



jenkinslib/src/org/devops/sonarqube.groovy文件
package org.devops
//scan
def SonarScan(sonarServer,projectName,projectDesc,projectPath,branchName){
//定义服务器列表
def servers = ["test":"sonarqube-test","prod":"sonarqube-prod"] // jekinssonar插件有关
withSonarQubeEnv("${servers[sonarServer]}"){ // jekinssonar插件有关
def scannerHome = "/usr/local/sonar-scanner"
//def sonarServer = "http://192.168.1.200:9000"
def sonarDate = sh returnStdout: true, script: 'date +%Y%m%d%H%M%S'
sonarDate = sonarDate - "\n"
sh """
${scannerHome}/bin/sonar-scanner \
-Dsonar.projectKey=${projectName} \
-Dsonar.projectName=${projectName} \
-Dsonar.projectVersion=${sonarDate} \
-Dsonar.ws.timeout=30 \
-Dsonar.projectDescription=${projectDesc} \
-Dsonar.links.homepage=http://www.baidu.com \
-Dsonar.sources=${projectPath} \
-Dsonar.sourceEncoding=UTF-8 \
-Dsonar.java.binaries=target/classes \
-Dsonar.java.test.binaries=target/test-classes \
-Dsonar.java.surefire.report=target/surefire-reports
# -Dsonar.branch.name=${branchName} -X
"""
}
}
Jenkinsfiles/ci.jenkinsfile文件
def tools - new org.devops.tools()
def sonar = new org.devops.sonarqube()
//Pipline
pipline {
agent {
node {
label "master"
}
}
stages {
stage("QA") {
steps {
script {
tools.PrintMes(“代码扫描”,"green")
sonar.SonarScan("${JOB_NAME}","${JOB_NAME}","src")
}
}
}
}
}
效果:
