可持续化集成(十)之SonarQube代码审查
SonarQube简介
Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量
通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测
环境要求
jdk 1.8
mysql 5.7
Sonar 6.7.4
安装Sonar
1.首先先要安装mysql
2.安装Sonar
在MySQL创建Sonar数据库
下载Sonar安装包
1 | https: //www.sonarqube.org/downloads/ |
1 | 解压sonar,并设置权限 |
1 2 3 4 5 6 | yum install unzip unzip sonarqube-6.7.4.zip 解压 mkdir /opt/sonar 创建目录 mv sonarqube-6.7.4/* /opt/sonar 移动文件 useradd sonar 创建sonar用户,必须sonar用于启动,否则报错 chown -R sonar. /opt/sonar 更改sonar目录及文件权限 |
修改sonar配置文件
1 2 3 4 | vi /opt/sonarqube-6.7.4/conf/sonar.properties 内容如下: sonar.jdbc.username=root sonar.jdbc.password=Root@123 sonar.jdbc.url=jdbc:mysql: //localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false |
注意:sonar默认监听9000端口,如果9000端口被占用,需要更改。
1 | sonar.web.port=9000 |
启动sonar
1 2 3 4 5 | cd /opt/sonarqube-6.7.4 su sonar ./bin/linux-x86-64/sonar.sh start 启动 su sonar ./bin/linux-x86-64/sonar.sh status 查看状态 su sonar ./bin/linux-x86-64/sonar.sh stop 停止 tail -f logs/sonar.logs 查看日志 |
汉化教程
Sonar汉化包下载:https://github.com/SonarQubeCommunity/sonar-l10n-zh
Sonar汉化
Sonar默认的语言是英文的,看起来不是那么方便,社区也提供了汉化版的插件下载地址
下载完成将插件放到\extensions\plugins ,重启sonar即可。
1 2 | [sonar@Test ~]#cd /usr/local/sonarqube-6.7.6/bin/linux-x86-64 [sonar@Test ~]#sh sonar.sh restart |
实现代码审查
1.在Jenkins中安装SonarQube Scanner插件
在Jenkins中下载sonar插件目前插件为 SonarQube Scanner for Jenkins
安装完成后,在 系统管理->系统设置中,找到SonarQube servers模块,填写服务器信息:
其中认证token需要登陆sonar后,点击Administrator->security->user,点击token按钮,输入key后再点击generate进行生成
Jenkins配置SonarQube Scanner
在 系统管理->全局工具配置中找到SonarQube Scanner模块,填写服务器信息:
在项目添加SonaQube代码审查(非流水线项目)
添加代码审查步骤
以自由风格为例:打开 web_demo_freestyle
1 2 3 4 5 6 7 8 9 10 11 12 13 | # must be unique in a given SonarQube instance sonar.projectKey=web_demo_freestyle # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. sonar.projectName=web_demo_freestyle sonar.projectVersion=1.0 # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. # This property is optional if sonar.modules is set. sonar.sources=. sonar.exclusions=**/test /**,**/ target/** sonar.java.source=1.8 sonar.java.target=1.8 # Encoding of the source code. Default is default system encoding sonar.sourceEncoding=UTF-8 |
在 sonarqube 服务器上刷新,查看结果
测试错误代码
新建 Java 和 resource 目录
配置 pom.xml 文件添加对 servlet 的依赖
1 2 3 4 5 | <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> |
需要下一些依赖组件,下载不下来查找原因。
新建编写 Servlet 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //模拟错误代码 int i = 100/0; //模拟代码冗余 int j = 100; j = 200; resp.getWriter().write( "hello Servlet" ); } } |
将 pom.xml 和 HelloServlet.java 提交到 Gitlab
进行构建测试结果
查看 sonarqube
5.3 注意
解决方法:
在项目添加 SonarQube 代码审查(流水线项目)
项目根目录下,创建 sonar-project.properties 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 | # must be unique in a given SonarQube instance sonar.projectKey=web_demo_pipeline # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. sonar.projectName=web_demo_pipeline sonar.projectVersion=1.0 # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. # This property is optional if sonar.modules is set. sonar.sources=. sonar.exclusions=**/test /**,**/ target/** sonar.java.source=1.8 sonar.java.target=1.8 # Encoding of the source code. Default is default system encoding sonar.sourceEncoding=UTF-8 |
6.2 修改 Jenkinsfile,加入 SonarQube 代码审查阶段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | pipeline { agent any stages { stage( 'pull code' ) { steps { checkout([$ class : 'GitSCM' , branches: [[name: '*/${branch}' ]], extensions: [], userRemoteConfigs: [[credentialsId: '0b127895-eb97-4f8f-b471-1277e5549b54' , url: 'git@192.168.10.20:test-group/web_demo.git' ]]]) } } stage( 'code checking' ) { steps { script { //引入了 sonarqube-scanner 工具 scannerHome = tool 'sonar-scanner' } //引入了 sonarqube 服务器系统环境 withSonarQubeEnv( 'sonarqube' ) { sh "${scannerHome}/bin/sonar-scanner" } } } stage( 'build project' ) { steps { sh 'mvn clean package' } } stage( 'deploy item' ) { steps { deploy adapters: [tomcat8(credentialsId: '1cf9c5dd-8e2d-4eb6-8c00-bb60e0f027ca' , path: '' , url: 'http://192.168.10.40:8080/' )], contextPath: null , war: 'target/*.war' } } } post { always { emailext( subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!' ,body: '${FILE,path="email.html"}' , to: '1520509800@qq.com' ) } } } |
把更改后的 sonar-project.properties 和 Jenkinsfile 进行提交
修改 jdk 版本
和非流水线里面一样,需要修改 jdk 版本。
开始构建 web_demo_pipeline
查看 sonarqube
如果构建的过程中遇到以下错误,则在配置文件中添加
1 | sonar.java.binaries=./target/classes |
错误信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ERROR: Error during SonarQube Scanner execution org.sonar.squidbridge.api.AnalysisException: Please provide compiled classes of your project with sonar.java.binaries property at org.sonar.java.JavaClasspath.init(JavaClasspath.java:59) at org.sonar.java.AbstractJavaClasspath.getElements(AbstractJavaClasspath.java:281) at org.sonar.java.SonarComponents.getJavaClasspath(SonarComponents.java:141) at org.sonar.java.JavaSquid.<init>(JavaSquid.java:83) at org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:83) at org.sonar.scanner.sensor.SensorWrapper.analyse(SensorWrapper.java:53) at org.sonar.scanner.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:88) at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:82) at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:68) at org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:88) at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:177) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类