CentOS7+PostgresSQL14+SonarQube9.4+jenkins使用SonarScan
1.sonarqube官网https://www.sonarqube.org/下载包解压缩非root账号 ./bin/sonar.sh start嵌入式数据库应仅用于评估目的嵌入式数据库无法扩展,不支持升级到较新版本的 SonarQube,也不支持将数据从其中迁移到不同的数据库引擎。.开防火墙sudo firewall-cmd --permanent --zone=public --add-por
一、安装 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 文件中的版本号
更多推荐
所有评论(0)