一、安装 PostgresSQL

详细参考文档:
https://www.cnblogs.com/zhi-leaf/p/11432054.html

官网安装步骤:
https://www.postgresql.org/download/linux/redhat/
在这里插入图片描述

# 安装存储库 RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 安装 PostgreSQL:
sudo yum install -y postgresql14-server
# 卸载 yum remove postgresql* ,验证 rpm -qa | grep postgresql

# 可选择初始化数据库并启用自动启动:
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
sudo systemctl enable postgresql-14
sudo systemctl start postgresql-14

安装完成后,按照详细参考文档创建用户和数据库,开启远程访问
注: 开启远程访问时, 若 SonarQube 与 PostgreSQL 在同一台主机,顺便将 /var/lib/pgsql/14/data/postgresql.conf 的配置项目 127.0.0.1/32 的密码策略改为md5

二、安装 SonarQube

1.安装基础环境

yum install -y zip unzip wget
yum install -y java-11-openjdk
vi /etc/profile
# 添加到文末
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

source /etc/profile
# 查看当前版本
java -version
vi /etc/sysctl.conf
# 添加到文末
vm.max_map_count=262144
fs.file-max=65536

sysctl  -p
vi /etc/security/limits.conf
# 添加到文末
*	soft	nofile	65536
*	hard	nofile	65536

2.创建 SonarQube 启动用户(SonarQube 内置了 elasticsearch,elasticsearch 不允许使用 root 用户启动)

useradd sonarqube
passwd sonarqube
su - sonarqube

3.官网下载安装包解压缩
https://www.sonarqube.org/

wget -c https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.4.0.54424.zip
unzip sonarqube-9.4.0.54424.zip

注: sonar 自带 h2 数据库,嵌入式数据库应仅用于评估目的。嵌入式数据库无法扩展,不支持升级到较新版本的 SonarQube ,也不支持将数据从其中迁移到不同的数据库引擎。

# 测试只需启动即可
cd sonarqube-9.4.0.54424/bin/linux-x86-64/
./sonar.sh start

# 如需配置数据库
vi sonarqube-9.4.0.54424/conf/sonar.properties
# 更改数据连接配置
sonar.jdbc.username=test_user
sonar.jdbc.password=abc123
sonar.jdbc.url=jdbc:postgresql://localhost:5432/test_db
cd sonarqube-9.4.0.54424/bin/linux-x86-64/
./sonar.sh start

4.开防火墙

# sonar默认端口9000
sudo firewall-cmd --permanent --zone=public --add-port=9000/tcp
sudo firewall-cmd --reload

5.web 访问
http://ip:9000/
username: admin
password: admin

三、jenkins 使用 sonar 插件

1.登陆 sonar 生成 tokens
在这里插入图片描述
2.Jenkins 安装 SonarQube Scanner for Jenkins 插件
http://updates.jenkins-ci.org/download/plugins/sonar/

3.系统管理 --> 系统配置 中配置 SonarQube servers,添加 sonar 中生成的 tokens,类型选 Secret text
在这里插入图片描述
4.系统管理 --> 全局工具配置 中配置 SonarQube Scanner
在这里插入图片描述
5.创建工程
1> 自由风格工程
增加构建步骤Execute SonarQube Scanner
注:新版本需 JDK11
sonar bb项目链接 http://ip:9000/dashboard?id=test
sonar.projectKey=test
sonar 显示项目名 bb
sonar.projectName=bb
sonar.projectBaseDir=指定目录
sonar.java.binaries=指定目录
在这里插入图片描述2> pipeline 工程
(1) 调 sonar-scanner 插件扫描文件

node("master"){
    stage "sonar scan"
        def sonarqubeScannerHome = tool name: 'sonar-scanner'
        echo sonarqubeScannerHome
        dir("/data/code"){
        withSonarQubeEnv('sonar-admin') {
        sh "${sonarqubeScannerHome}/bin/sonar-scanner -X -Dsonar.projectKey=test \
        -Dsonar.projectName=bb \
        -Dsonar.projectBaseDir=/data/code \
        -Dsonar.java.binaries=/data/code \
        -Dsonar.host.url=http://ip:9000 "
        }

        script {
						Integer waitSeconds = 10
          				Integer timeOutMinutes = 10
          				Integer maxRetry = (timeOutMinutes * 60) / waitSeconds as Integer
                        //  未通过代码检查,中断
                        for (Integer i = 0; i < maxRetry; i++) {
				            try {
				              timeout(time: waitSeconds, unit: 'SECONDS') {
				              	//利用sonar webhook功能通知pipeline代码检测结果,未通过质量阈,pipeline将会fail
				                def qg = waitForQualityGate()
				                echo "${qg.status}"
				                if (qg.status != 'OK') {
				                  error "Sonar quality gate status: ${qg.status}"
				                } else {
				                  i = maxRetry
				                }
				              }
				            } catch (Throwable e) {
				              if (i == maxRetry - 1) {
				                throw e
				              }
				            }
          				}
                    }
 
        }
}

(2) 用编译方式扫描
gradle 为例:将代码中 withSonarQubeEnv 里的 sh 改为图中命令
在这里插入图片描述

四、SonarQube web api

http://ip:9000/web_api

详细报告信息
http://ip:9000/api/issues/search?componentKeys=${projectKey}

新代码详细报告信息
http://ip:9000/api/issues/search?componentKeys=${projectKey}&sinceLeakPeriod=true

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
import json

if __name__ == "__main__":
    # p是第2页,每页100个,可以用参数分页查询.
    url = "http://ip:9000/api/issues/search?componentKeys=${projectKey}&sinceLeakPeriod=true&p=2"
    # sonar默认采用 Basic Auth 验证
    req = requests.get(url,auth=("admin","xxxx"))
    output = json.loads(req.content)
    print(output)

五、SonarQube 解决代码误判的问题

https://blog.csdn.net/lnkToKing/article/details/84394993

踩过的坑:

1.报错:Error: Could not create the Java Virtual Machine.
在这里插入图片描述
解决方法:
升级到JDK11即可。若还是不行,修改$SONARQUBE_HOME/conf/wrapper.conf文件中的wrapper.java.command参数,指定java命令行位置
wrapper.java.command=/usr/lib/jvm/java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64/bin/java

2.报错:ERROR: [2] bootstrap checks failed.

解决方法:
https://blog.csdn.net/qq_26684469/article/details/84667780

3.使用 sonar.sources 指定了扫描路径,扫出的结果一直是空日志全部打印这句 It is not located in project basedir ‘/root/workspace/sonar’.
在这里插入图片描述
解决方法:
sonar.projectBaseDir=指定目录
sonar.java.binaries=指定目录

4.报错 ERROR: Error during SonarScanner execution
java.lang.UnsupportedClassVersionError: org/sonar/batch/bootstrapper/EnvironmentInformation has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

在这里插入图片描述
解决方法:
1> Jenkins 上使用 SonarQube Scanner 插件
(1) 节点配置环境变量 JAVA_HOME
(2) jenkins 全局工具配置,新增 JDK 配置 JAVA_HOME,工程插件里面 JDK 参数:选择这个 JDK ( 55 对应 openjdk-11 )
2> pipeline脚本调插件,报同样的错,发现jenkins系统配置里面加了全局环境变量 JAVA_HOME,修改成11后成功

5.使用pipeline构建,一直提示 WARN: Unable to locate ‘report-task.txt’ in the workspace. Did the SonarScanner succeed? 工程没有报错,sonar上也有扫描结果,所以没有管,后面想使用 waitForQualityGate 获取结果时就报错了 java.lang.IllegalStateException: Unable to guess SonarQube task id and/or SQ server details. Please use the ‘withSonarQubeEnv’ wrapper to run your analysis.
在这里插入图片描述
解决方法:
发现报告 report-task.txt 是放在代码目录下,获取结果是在工作空间找,所以一直找不到!

dir("/data/code"){  //代码目录
        withSonarQubeEnv('sonar') {
            sh "./gradlew sonarqube"
        }
        waitForQualityGate abortPipeline: true
}

注: 插件扫描报告在代码目录 .scannerwork 下,编译检查在代码目录 build/sonar
在这里插入图片描述
6.报错:hudson.remoting.ProxyException: net.sf.json.JSONException: Invalid JSON String
在这里插入图片描述
解决方法:
jenkins 系统配置 SonarQube servers 时,Server URL 后不要加 /

7.一直卡在:SonarQube task ‘AYA7Bv6HVxFxtERj-jlv’ status is ‘IN_PROGRESS’
在这里插入图片描述
解决方法:
https://blog.csdn.net/tengqingyong/article/details/123146458

8.sonar-scanner 可以不加,gradlew 编译 build.gradle 文件必须加,否则报错 Task ‘sonarqube’ not found in root project ‘xxx’.
注: 多个 build.gradle 文件加插件,新代码显示的是所有的;两种检查方式,检查结果并不同

plugins {
  id "org.sonarqube" version "3.3"
}

在这里插入图片描述
9.报错 *What went wrong:
Execution failed for task ‘:android-common:processDebugAndroidTestManifest’.
Manifest merger failed with multiple errors, see logs

在这里插入图片描述
解决方法:
修改 config.gradle 文件中的版本号
在这里插入图片描述