Sonar(SonarQube)是一个开源平台,用于管理源代码的质量。Sonar 不只是一个质量数据报告工具,更是代码质量管理平台。支持的语言包括:Java、PHP、C#、C、Cobol、PL/SQL、Flex 等。
特性
idea在集成sonar插件后,就可以在代码提交前发现代码中的不规范和漏洞,即使进行修复,而不是等到提交到仓库后在进行代码质量扫描,然后重复提交–检测–修复的过程。
sonar目前可以扫除以下类型的问题点
它是从 Architecture Design(架构设计) , Coding Rule(编码规则), Potential Bugs(潜在错误), Duplications(重复代码), Comments(注释), Unit Tests(单元测试), Complexity(复杂度) 7个维度检查代码质量的。 相比lint工具检测维度比较全面, 有可视化的友好展示代码缺陷的界面,结合CI/CD工具,可以不依赖手工检查,定时清查代码。
sonarqube系统是一个代码质量检测工具 由以下四个组件组成
一个sonarqube服务器,包含三个子进程(web服务(界面管理),搜索服务,计算引擎服务(写入数据库))。
一个sonarqube数据库,配置sonarqube服务 。
多个sonarqube插件,位于解压目录extensionsplugins目录 。
一个或者多个sonarqube scanners用于分析特定的项目,相当于客户端。
工作流转
以下架构图为 sonar 项目的工作流转图:
文档地址:/
SonarQube 与 JDK 和 MySQL 都有版本对应,查看 SonarQube 与 JDK、数据库 版本对应:
例如 SonarQube 9.8 对应JDK 17,PostgreSQL 15。
SonarQube 7.6, 对应 JDK8,MySQL 版本>=5.6 && <8.0。(sonarqube从7.8起,不再支持mysql)(要安装对版本,比如mysql要求5.6或者5.7 你要是使用8.0 就会失败,亲测–)
大家安装时,一定要注意,本人在此踩过坑
如果本地jdk是8以下的,安装7.8及以下版本
zip安装
版本注意:jdk8支持的sonarqube版本最高是7.8,,而从7.9版本开始都是要求jdk11了,下载的话需要注意版本的对应关系,不要走弯路
下载不了:参考该地址中的下载:
(1)Java环境(1.8+)
(2)MySql数据库(5.6+)
(3)SonarQube 7.1
注意:sonarQube 7.9的版本之后就不在支持mysql,所以下载的是7.1版本。
//解压
unzip sonarqube-6.7.7.zip
//移动目录
mv sonarqube-6.7.7 /usr/local/sonar
.进入mysql容器并创建用户账户密码均为sonar
# docker exec -it mysql bash
# mysql -u root -p
# create database sonar;# CREATE USER 'sonar'@'%' IDENTIFIED WITH mysql_native_password BY 'sonar';# GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%';
# exit
安装目录下的conf中的配置文件,
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
不能使用root用户启动,新建个用户
//新建用户
useradd sonar
//赋权
chown -R sonar.sonar /usr/local/sonar
//修改密码
passwd sonar
//切换到sonar用户
su sonar
//启动: 进入到sonar目录下,即bin的同级目录,执行下边的命令
./bin/linux-x86-64/sonar.sh console
ip:9000 用户名密码:admin
汉化,重启服务即可
如果出现“Error while downloading plugin ‘l10nzhtw’ with version ‘1.0’. No compatible plugin found.”错误,那说明版本不兼容,可到官网查找对应版本的插件放到…/…/extensions/plugins目录下,重新启动sonar服务【使用命令…/…/sonar.sh start 也可以通过页面操作“配置->系统->重启服务器”】,即可生效。但如果安装的插件比当前版本低的话,会出现部分显示还是英文。
汉化插件下载[找到对应的版本,下载对应的插件]:=2
放到该路径下:
cd /usr/local/sonarqube-8.6.0/extensions/plugins
重启服务即可【不可使用root用户登录】
启动成功后,会在对应的sonar中创建对应的数据库
这是我的项目目录
2.配置
buildscript {repositories {maven {url "xxxxxxxxxx"}}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")// 添加依赖信息classpath("org.adle:sonarqube-gradle-plugin:2.6.2")}}// 声明插件
apply plugin: "org.sonarqube"//配置sonar的配置信息
sonarqube {properties {property "sonar.host.url", "127.0.0.1:9000"property "sonar.login", "admin"property "sonar.password", "admin"property "sonar.scm.provider", "git"property "sonar.projectKey", artifactIdproperty "sonar.projectVersion", versionproperty "sonar.sourceEncoding", defaultCharsetproperty "sonar.sources", "src/main/java"//property sts", "src/test/java"property "sonar.java.source", "1.8"property "sonar.java.binaries", "build/classes/java/main/"//property "st.binaries", "build/classes/java/test/"property "veragePlugin", "jacoco"property lReportPaths", "build/reports/jacoco/l"property "lReportPath", "build/l"property "sonar.dependencyCheck.jsonReportPath", "build/reports/dependency-check-report.json"property "sonar.dependencyCheck.htmlReportPath", "build/reports/dependency-check-report.html"}
}
3.执行gradle sonarqube
gradle sonarqube
4.查看web页面是否有扫描信息
1.下载PDF导出插件
找到对应的sonarqube版本进行下载,这里直接下载jar就可以了,如果下载源码还需要编译
2.复制sonar-pdfreport-plugin-xxxxx.jar,到sonarqube的extensions的plugins里。
3.重新启动sonarqube,web可以看到一个PDF Report,需要对PDF插件进行配置,首先是在网页上,如下图,配置完了password,网页下面还有个userName要配置,我这里配置的都是admin
4.在网页配置完了后,还需要在sonarqube中对pdf-plugin进行配置
vi /usr/local/sonar/conf/sonar.properties # 在该文件中增加
-Dsonar.pdf.password=admin
-Dsonar.pdf.username=admin
5在进行完一些列配置后,重新对项目进行扫描,在build的过程中,会出现pdf-plugin的相关信息,之后在网页上就可以按照下图的步骤导出PDF了
SonarLint:IDEA 的 Sonar 插件
1.在插件仓库中搜索 “SonarLint” 插件,找到插件后点击安装即可
2.插件安装完成后,右击项目出现SonarLint 选择 “Analyze with SonarLint” 即可
# docker logs sonarqube_sonarqube_1
ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
ERROR: Elasticsearch did not exit normally - check the logs at /opt/sonarqube/logs/sonarqube.log
解决方案:
大致看了一下,是因为ElasticSearch运行的时候最小内存消耗要达到262144,所以,如果是在自己的虚拟机运行,可以临时调整vm.max_map_count的大小,max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量,临时调整的语句如下:
sysctl -w vm.max_map_count=262144
调整之后再运行es集群就不会有问题了。
如果想永久修改vm.max_map_count的大小,则可以使用如下命令:
echo vm.max_map_count=262144>> /f sysctl -p
不能使用root用户启动,新建个用户,我新建了一个sonar用户,然后给该用户授权,启动
一开始为了省事,使用docker安装,但是一直启动不起来,报错 Can not connect to database. Please check connectivity and settings (see the properties prefixed by ‘sonar.jdbc.’).
根据网上提供的方案,都没有用
1…docker拉取sonarqube镜像
docker pull sonarqube:7.8-community
可在官网查找你想要的版本:=tags&page=9
2…进入mysql容器并创建用户账户密码均为sonar
# docker exec -it mysql bash
# mysql -u root -p
# create database sonar;# CREATE USER 'sonar'@'%' IDENTIFIED WITH mysql_native_password BY 'sonar';# GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%';
# exit
3.启动sonarqube
docker run -d --name sonar -p 9000:9000 -p 9092:9092 -v /data/sonar/conf:/opt/sonarqube/conf -v /data/sonar/data:/opt/sonarqube/data -v /data/sonar/logs:/opt/sonarqube/logs -v /data/sonar/extensions:/opt/sonarqube/extensions -e "SONARQUBE_DATABASE_USER=sonar" -e "SONARQUBE_DATABASE_NAME=sonar" -e "SONARQUBE_DATABASE_PASSWORD=sonar" -e "SONARQUBE_JDBC_URL=jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false" sonarqube:7.8-community
4.对应的映射配置/data/sonar/conf中的数据库配置是否正确
vi sonar.properties#sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformanc
e#sonar.jdbc.username=sonar
#sonar.jdbc.password=sonar
#sonar.sorceEncoding=UTF-8
root@koal-ipsec:/data/sonar/conf# docker logs sonar
2022.12.26 05:15:07 INFO app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /opt/sonarqube/temp
2022.12.26 05:15:07 INFO app[][o.s.a.es.EsSettings] Elasticsearch listening on /127.0.0.1:9001
2022.12.26 05:15:07 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='es', ipcIndex=1, logFilenamePrefix=es]] from [/opt/sonarqube/elasticsearch]: /opt/sonarqube/elasticsearch/bin/elasticsearch -f=/opt/sonarqube/temp/conf/es
2022.12.26 05:15:07 INFO app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running
2022.12.26 05:15:07 INFO app[][o.e.p.PluginsService] no modules loaded
2022.12.26 05:15:07 INFO app[][o.e.p.PluginsService] loaded plugin [ansport.Netty4Plugin]
2022.12.26 05:15:14 INFO app[][o.s.a.SchedulerImpl] Process[es] is up
2022.12.26 05:15:14 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='web', ipcIndex=2, logFilenamePrefix=web]] from [/opt/sonarqube]: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Djava.awt.headless=true -ding=UTF-8 -pdir=/opt/sonarqube/temp -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -d=file:/dev/./urandom -cp ./lib/common/*:./lib/server/*:/opt/sonarqube/lib/jdbc/mysql/mysql-connector-java-5.1.42.jar org.sonar.server.app.WebServer /opt/sonarqube/temp/sq-process8004789798386622755properties
2022.12.26 05:15:14 INFO web[][o.s.p.ProcessEntryPoint] Starting web
2022.12.26 05:15:15 INFO web[][u.n.NioSelectorPool] Using a shared selector for servlet write/read
2022.12.26 05:15:15 INFO web[][o.e.p.PluginsService] no modules loaded
2022.12.26 05:15:15 INFO web[][o.e.p.PluginsService] loaded plugin [org.index.ReindexPlugin]
2022.12.26 05:15:15 INFO web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.join.ParentJoinPlugin]
2022.12.26 05:15:15 INFO web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
2022.12.26 05:15:15 INFO web[][o.e.p.PluginsService] loaded plugin [ansport.Netty4Plugin]
2022.12.26 05:15:16 INFO web[][o.EsClientProvider] Connected to local Elasticsearch: [127.0.0.1:9001]
2022.12.26 05:15:16 INFO web[][o.s.s.p.LogServerVersion] SonarQube Server / 6.7.5.38563 / ec8ab77fa180a9edaf664075e8e76ae0b4a2d9f1
2022.12.26 05:15:16 INFO web[][o.sonar.db.Database] Create JDBC data source for jdbc:mysql://127.0.0.1:3306/db_sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
2022.12.26 05:15:16 ERROR web[][o.s.s.p.Platform] Web server startup failed
java.lang.IllegalStateException: Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').at org.sonar.db.DefaultDatabase.checkConnection(DefaultDatabase.java:108)at org.sonar.db.DefaultDatabase.start(DefaultDatabase.java:75)flect.NativeMethodAccessorImpl.invoke0(Native Method)flect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)flect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at flect.Method.invoke(Method.java:498)at org.picocontainer.lifecycle.ReflectionLifecycleStrategy.invokeMethod(ReflectionLifecycleStrategy.java:110)at org.picocontainer.lifecycle.ReflectionLifecycleStrategy.start(ReflectionLifecycleStrategy.java:89)at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.start(AbstractInjectionFactory.java:84)at org.picocontainer.behaviors.AbstractBehavior.start(AbstractBehavior.java:169)at org.picocontainer.behaviors.Stored$RealComponentLifecycle.start(Stored.java:132)at org.picocontainer.behaviors.Stored.start(Stored.java:110)at org.picocontainer.DefaultPicoContainer.potentiallyStartAdapter(DefaultPicoContainer.java:1016)at org.picocontainer.DefaultPicoContainer.startAdapters(DefaultPicoContainer.java:1009)at org.picocontainer.DefaultPicoContainer.start(DefaultPicoContainer.java:767)at platform.ComponentContainer.startComponents(ComponentContainer.java:134)at org.sonar.server.platform.platformlevel.PlatformLevel.start(PlatformLevel.java:90)at org.sonar.server.platform.Platform.start(Platform.java:211)at org.sonar.server.platform.Platform.startLevel1Container(Platform.java:170)at org.sonar.server.platform.Platform.init(Platform.java:86)at org.sonar.server.platform.tInitialized(PlatformServletContextListener.java:45)at org.StandardContext.listenerStart(StandardContext.java:4745)at org.StandardContext.startInternal(StandardContext.java:5207)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)at org.ContainerBase$StartChild.call(ContainerBase.java:1419)at org.ContainerBase$StartChild.call(ContainerBase.java:1409)at urrent.FutureTask.run(FutureTask.java:266)at urrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at urrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)
Caused by: org.apachemons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)at org.apachemons.atePoolableConnectionFactory(BasicDataSource.java:1549)at org.apachemons.ateDataSource(BasicDataSource.java:1388)at org.apachemons.Connection(BasicDataSource.java:1044)at org.sonar.db.Connection(NullConnectionInterceptor.java:31)at org.sonar.db.Connection(ProfiledDataSource.java:323)at org.sonar.db.DefaultDatabase.checkConnection(DefaultDatabase.java:106)... 29 common frames omitted
Caused by: ptions.jdbc4.CommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.wInstance0(Native Method)wInstance(NativeConstructorAccessorImpl.java:62)wInstance(DelegatingConstructorAccessorImpl.java:45)at wInstance(Constructor.java:423)sql.jdbc.Util.handleNewInstance(Util.java:425)sql.ateCommunicationsException(SQLError.java:989)sql.jdbc.MysqlIO.<init>(MysqlIO.java:341)sql.Connect(ConnectionImpl.java:2192)sql.tOneTryOnly(ConnectionImpl.java:2225)sql.ateNewIO(ConnectionImpl.java:2024)sql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)sql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)wInstance0(Native Method)wInstance(NativeConstructorAccessorImpl.java:62)wInstance(DelegatingConstructorAccessorImpl.java:45)at wInstance(Constructor.java:423)sql.jdbc.Util.handleNewInstance(Util.java:425)sql.Instance(ConnectionImpl.java:389)sql.t(NonRegisteringDriver.java:330)at org.apachemons.ateConnection(DriverConnectionFactory.java:38)at org.apachemons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)at org.apachemons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)at org.apachemons.atePoolableConnectionFactory(BasicDataSource.java:1545)... 34 common frames omitted
Caused by: java.ConnectException: Connection refused (Connection refused)at java.PlainSocketImpl.socketConnect(Native Method)at java.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)at tToAddress(AbstractPlainSocketImpl.java:206)at t(AbstractPlainSocketImpl.java:188)at t(SocksSocketImpl.java:392)at t(Socket.java:589)sql.t(StandardSocketFactory.java:211)sql.jdbc.MysqlIO.<init>(MysqlIO.java:300)... 50 common frames omitted
2022.12.26 05:15:17 INFO app[][o.s.a.SchedulerImpl] Process [web] is stopped
2022.12.26 05:15:17 WARN app[][o.s.a.p.AbstractProcessMonitor] Process exited with exit value [es]: 143
2022.12.26 05:15:17 INFO app[][o.s.a.SchedulerImpl] Process [es] is stopped
2022.12.26 05:15:17 INFO app[][o.s.a.SchedulerImpl] SonarQube is stopped
本文发布于:2024-02-04 20:37:35,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170715915259401.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |