📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍
写在前面的话
介绍文章之前,先胡扯一下,近期由于私人有一些事情,占用了较多时间,又不想继续潦草的发文,违背了初心。因此,索性暂停了一段时间的博客编写。目前,此间事毕,又可以继续回归博客了,很愉快。
好了,废话不多说,先上一篇近期工作中关于质量管理工具 Sonar 在企业 Devops 中的实战运用分享。
熟悉博主的人可能看过之前已经分享过 Sonar 相关文章了,这边怎么又重复了。其实不然,之前那篇从开发人员角度说明如何使用,本篇主要介绍Sonar 从安装到接入的完整流程。
参考链接:《企业实战分享 · Sonarqube 代码走查》
Sonar 简介与安装
Tips:为保证技术连贯,照例先来一段简介,熟悉的人可以跳过。
技术简介
Sonar 简介
Sonar(通常指 SonarQube)是一款开源的代码质量管理工具,旨在帮助开发团队持续监控和改善代码质量。
它支持多种编程语言,并提供以下功能:
- 代码分析:SonarQube能够静态分析代码,识别潜在的缺陷、漏洞和代码异味(code smells)。
- 质量指标:提供多种质量指标,如代码覆盖率、重复代码、复杂度等,帮助团队了解代码的健康状况。
- 持续集成:可以与CI/CD工具集成,自动化代码质量检查。
- 报告和可视化:生成详细的报告和可视化图表,便于团队理解和跟踪代码质量的变化。
Sonar 场景
SonarQube在企业中的应用场景非常广泛,以下是一些典型的使用场景:
- 代码审查:在代码提交之前,通过SonarQube进行静态分析,确保代码符合质量标准。
- 持续集成:与CI/CD工具(如GitLab CI、Jenkins等)集成,在每次构建时自动进行代码质量检查。
- 技术债务管理:帮助团队识别和管理技术债务,制定改进计划。
- 合规性检查:确保代码符合行业标准和法规要求。
总结一下
SonarQube是一个强大的工具,可以帮助企业提高代码质量,降低技术债务。与GitLab CI的整合使得代码质量检查自动化,提升了开发效率和代码的可靠性。通过这种方式,团队可以在开发过程中持续监控和改善代码质量,确保交付高质量的软件产品。
版本选择
在之前的博文《企业实战分享 · Sonarqube 代码走查》中,使用的版本还是9.x
,现又收到Sonar
的相关部署工作。
先看了一下官网,已经更新到10.6了,如下所示。
那是继续图省事用老版本,还是尝试一下新的?这个可能是大部分人在安装相关中间件时的犹豫点。
博主认为,不需要犹豫,这如果是SpringBoot、JDK等关系到代码的核心版本,才需要召开技术评审。而这只是与开发可以解耦的质量检测,涉及到公司开发的 Devops 流程,有最新的版本为何不用。
开始安装
Sonar10.6 的安装不难,但是有一些前置要求,JDK必须是17以上,同时数据库需要使用 PostgreSQL。
开始安装就找一台服务器,准备开始吧。
具体要求,可以参考:官网文档
Step1、安装 JDK17
这个操作基本都会,不详细描述了。
官网下载压缩包、丢到服务器、修改环境变量、生效环境变量、确认版本,搞定。
Step2、安装 PostgreSQL
这个操作基本也会了,跳过。
要注意的是,安装完成后,需要创建一个Sonar专用的用户和数据库,因为后续会产生若干表,影响其他就不好了。
# 切换到postgres用户
su - postgres
# 执行创建指令
psql
create user sonarqube with password 'sonarqube';
create database sonarqube owner sonarqube;
grant all on database sonarqube to sonarqube;
\q
su -
Step3、安装 Sonar
官网下载最新的压缩包,丢到服务器上,解压就好了。
需要注意的主要两个事情:
1、编辑 /conf/sonar.properties 以配置数据库设置。
sonar.jdbc.url=jdbc:postgresql://ip/sonar
sonar.jdbc.user=xx
sonar.jdbc.password=xx
2、注意一下不能使用 root 用户操作(和内部使用的ES有关),因此还需要专门创建一个 sonar 用户。
sudo useradd sonar
sudo passwd sonar
sudo chown sonar:sonar /opt/sonar/
sudo chmod 700 /opt/sonar/
然后,直接启动即可:
/bin/linux-x86-64/sonar.sh start
启动后访问如下地址:http://127.0.0.1:9000/sonar
汉化一下
有两种汉化方式:
方式一: 用页面自带的
Administrator --> Marketplace --> chinese --> install (如果没有install 字样,在下图红色圆圈处,有"我同意",先点击一下)
方式二:
手动去下载汉化插件包
打开页面:https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/latest
将插件放置到这个 ~/sonarqube-xxx/extensions/plugins 目录下,然后重启服务。
汉化后:
界面如下,比9.x的老页面清爽多了。
Sonar 接入项目
几种方式
SonarQube 接入项目的方式主要有以下几种:
1、Maven 插件:
使用 SonarQube 的 Maven 插件,可以在 Maven 构建过程中自动分析代码。通过在 pom.xml 中配置相关的插件和属性,执行 mvn sonar:sonar 命令即可将代码分析结果上传到 SonarQube 服务器。
2、SonarScanner:
SonarScanner 是 SonarQube 提供的独立扫描工具,支持多种编程语言。可以通过命令行运行 SonarScanner,配置 sonar-project.properties 文件来指定项目的相关信息,然后执行 sonar-scanner 命令进行代码分析。
3、IDE 插件:
SonarQube 还提供了一些集成开发环境(IDE)的插件,比如 IntelliJ IDEA 和 Eclipse 插件,可以在开发过程中实时分析代码质量。
4、CI/CD 集成:
可以将 SonarQube 集成到持续集成/持续部署(CI/CD)流程中,例如 Jenkins、GitLab CI、GitHub Actions 等,通过配置相应的步骤在构建过程中自动执行代码分析。
Maven 接入
**描述:**通过绑定Sonar的Maven插件,可以使用Sonar进行代码扫描。
步骤:
Step1、添加Maven插件
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.10.0.2594</version>
</plugin>
Step2、添加配置信息
注意,也可以在settings.xml配置,也可以命令行传入
<!-- SonarQube服务器地址-->
<sonar.host.url>http://192.168.5.98:9000/sonar</sonar.host.url>
<!-- 访问令牌或⽤户名密码 -->
<sonar.token>sqa_21f5d7a5d8a2d155b9d102676281364ee660fcb6</sonar.token>
<!-- <sonar.login>admin</sonar.login>-->
<!-- <sonar.password>sonar</sonar.password>-->
Step3、执行Maven命令
mvn sonar:sonar
Step4、进入网站
踩坑说明一
报错:Your project contains .java files, please provide compiled classes with sonar.java.binaries property, or exclude them from the analysis with sonar.exclusions property.
解答:这个提示表明 SonarQube 在分析你的项目时发现了 .java 文件,但没有找到相应的编译类文件。要解决这个问题,你可以选择提供编译后的类文件,或者排除这些 .java 文件。确保你的 Java 项目已经编译,并且生成了 .class 文件。通常情况下,你可以使用 Maven 或 Gradle 来编译项目。如果还不可以,设置 sonar.java.binaries 属性,在你的 pom.xml 文件或 settings.xml 文件中,添加 <sonar.java.binaries>target/classes</sonar.java.binaries> 配置。
实战:编译一次,再执行就可以了。
踩坑说明二
报错:org/sonar/batch/bootstrapper/EnvironmentInformation has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
解答:这个错误信息表明你正在使用的 Java 运行时版本过低,无法识别由更高版本的 Java 编译的类文件。具体来说,class file version 61.0 对应于 Java 17,而 class file version 55.0 对应于 Java 11。
实战:切换一个JDK17的项目就可以了,测试后可以了。继续测试JDK采用21也可以。
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
踩坑说明三
报错:Not authorized. Please check the user token in the property ‘sonar.token’ or the credentials in the properties ‘sonar.login’ and ‘sonar.password’.
解答:这个错误提示表明你在执行 SonarQube 分析时没有正确的授权。
IDEA 整合
这部分之前文章整理过,大差不差,就不赘述了。
参考链接:《企业实战分享 · Sonarqube 代码走查》
GitLab CI 整合
整合步骤
SonarQube与GitLab CI的整合是一个非常常见的场景,具体步骤如下:
- 安装SonarQube:在服务器上安装并配置SonarQube。
- 配置SonarQube项目:在SonarQube中创建项目,并获取项目密钥和令牌。
- GitLab CI配置:
- 在GitLab项目中,编辑
.gitlab-ci.yml
文件,添加SonarQube的分析步骤。 - 使用SonarScanner(SonarQube的分析工具)进行代码分析,并将结果发送到SonarQube服务器。
- 在GitLab项目中,编辑
stages:
- build
- test
- sonar_analysis
build_job:
stage: build
script:
- echo "这是构建阶段,$SONAR_HOST_URL"
tags:
- onelink-lb
only:
- master
- /^release.*$/
test_job:
stage: test
script:
- echo "这是测试阶段,$CI_PROJECT_NAME"
sonar_analysis_job:
stage: sonar_analysis
script:
- echo "开始 SonarQube 代码分析"
- echo SONAR_HOST_URL=$SONAR_HOST_URL, SONAR_LOGIN_TOKEN=$SONAR_TOKEN
- mvn clean verify sonar:sonar -Psonar -Dmaven.test.skip=true -Dsonar.language=java -Dsonar.inclusions=**/*.java -Dsonar.projectKey=$CI_PROJECT_NAME -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_TOKEN
tags:
- onelink-lb
rules:
- if: '$CI_PIPELINE_SOURCE == "push"' # 触发条件
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # 合并请求时触发
实战分享
实际开发中,使用的ci文件如下。
实现的效果就是当程序猿提交代码到指定分支时,会触发相应CI策略,前往相应的Runner服务器,执行相关的Maven指令(本质还是Maven方式),最终将代码扫描结果在 Sonar网站展示。
stages:
- Code Analysis
- Testing
- Deploy Framework
.common_def: &common_def
# 省略
.tag_def: &tag_def
# 省略
Unit Testing:
# 省略
Deploy Framework:
# 省略
Code Analysis:
<<: *tag_def
stage: Code Analysis
rules:
- if: '$CI_PIPELINE_SOURCE == "sonar"'
- if: '$CI_COMMIT_BRANCH == "dev-lw"'
script:
- echo SONAR_HOST_URL=$ZT_SONAR_HOST_URL, SONAR_LOGIN_TOKEN=$ZT_SONAR_LOGIN_TOKEN
- mvn clean verify sonar:sonar -Psonar -Dmaven.test.skip=true -Dsonar.language=java -Dsonar.inclusions=**/*.java -Dsonar.projectKey=$CI_PROJECT_NAME -Dsonar.host.url=$ZT_SONAR_HOST_URL -Dsonar.login=$ZT_SONAR_LOGIN_TOKEN -s settings_zoe.xml
关于 DevOps
DevOps 是一种软件开发和运维的文化、实践和工具集,旨在通过促进开发(Dev)和运维(Ops)团队之间的协作与沟通,提高软件交付的速度和质量。DevOps 强调自动化、持续集成、持续交付(CI/CD)、监控和反馈等理念,以实现更快速、更高效的软件开发和交付流程。
GitLab CI 与 SonarQube 整合
GitLab CI与SonarQube的整合可以被视为一种DevOps实践。
- 持续集成(CI):GitLab CI 是一个持续集成工具,可以自动化构建、测试和部署过程。通过将代码提交到 GitLab,CI 会自动触发构建和测试,确保代码的质量。
- 代码质量检查:SonarQube 是一个代码质量管理工具,可以分析代码中的缺陷、漏洞和代码异味。将 SonarQube 集成到 GitLab CI 流程中,可以在每次构建时自动检查代码质量,确保代码符合质量标准。
- 反馈循环:通过将代码质量检查与 CI 流程结合,开发团队可以快速获得反馈,及时发现和修复问题。这种快速反馈机制是 DevOps 的核心理念之一。
- 自动化:DevOps 强调自动化,而 GitLab CI 和 SonarQube 的整合可以实现自动化的代码质量检查,减少手动干预,提高效率。
总结一下,将 GitLab CI 与 SonarQube 整合是 DevOps 实践的一部分,能够帮助团队提高软件开发的效率和质量,促进开发与运维之间的协作。通过这种整合,团队可以实现更快速的迭代和更高的代码质量,从而更好地满足业务需求。
总结陈词
💗 本篇文章介绍了质量检测工具 Sonar 在企业中的实战接入,属于 DevOps 的一部分,希望可以帮助到大家。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。