《企业实战分享 · SonarQube10.x 详细教程》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

写在前面的话

介绍文章之前,先胡扯一下,近期由于私人有一些事情,占用了较多时间,又不想继续潦草的发文,违背了初心。因此,索性暂停了一段时间的博客编写。目前,此间事毕,又可以继续回归博客了,很愉快。

好了,废话不多说,先上一篇近期工作中关于质量管理工具 Sonar 在企业 Devops 中的实战运用分享。

熟悉博主的人可能看过之前已经分享过 Sonar 相关文章了,这边怎么又重复了。其实不然,之前那篇从开发人员角度说明如何使用,本篇主要介绍Sonar 从安装到接入的完整流程。

参考链接:《企业实战分享 · Sonarqube 代码走查》


Sonar 简介与安装

Tips:为保证技术连贯,照例先来一段简介,熟悉的人可以跳过。

技术简介

Sonar 简介

Sonar(通常指 SonarQube)是一款开源的代码质量管理工具,旨在帮助开发团队持续监控和改善代码质量。

它支持多种编程语言,并提供以下功能:

  1. 代码分析:SonarQube能够静态分析代码,识别潜在的缺陷、漏洞和代码异味(code smells)。
  2. 质量指标:提供多种质量指标,如代码覆盖率、重复代码、复杂度等,帮助团队了解代码的健康状况。
  3. 持续集成:可以与CI/CD工具集成,自动化代码质量检查。
  4. 报告和可视化:生成详细的报告和可视化图表,便于团队理解和跟踪代码质量的变化。

Sonar 场景

SonarQube在企业中的应用场景非常广泛,以下是一些典型的使用场景:

  1. 代码审查:在代码提交之前,通过SonarQube进行静态分析,确保代码符合质量标准。
  2. 持续集成:与CI/CD工具(如GitLab CI、Jenkins等)集成,在每次构建时自动进行代码质量检查。
  3. 技术债务管理:帮助团队识别和管理技术债务,制定改进计划。
  4. 合规性检查:确保代码符合行业标准和法规要求。

总结一下

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的整合是一个非常常见的场景,具体步骤如下:

  1. 安装SonarQube:在服务器上安装并配置SonarQube。
  2. 配置SonarQube项目:在SonarQube中创建项目,并获取项目密钥和令牌。
  3. GitLab CI配置:
    • 在GitLab项目中,编辑.gitlab-ci.yml文件,添加SonarQube的分析步骤。
    • 使用SonarScanner(SonarQube的分析工具)进行代码分析,并将结果发送到SonarQube服务器。
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实践。

  1. 持续集成(CI):GitLab CI 是一个持续集成工具,可以自动化构建、测试和部署过程。通过将代码提交到 GitLab,CI 会自动触发构建和测试,确保代码的质量。
  2. 代码质量检查:SonarQube 是一个代码质量管理工具,可以分析代码中的缺陷、漏洞和代码异味。将 SonarQube 集成到 GitLab CI 流程中,可以在每次构建时自动检查代码质量,确保代码符合质量标准。
  3. 反馈循环:通过将代码质量检查与 CI 流程结合,开发团队可以快速获得反馈,及时发现和修复问题。这种快速反馈机制是 DevOps 的核心理念之一。
  4. 自动化:DevOps 强调自动化,而 GitLab CI 和 SonarQube 的整合可以实现自动化的代码质量检查,减少手动干预,提高效率。

总结一下,将 GitLab CI 与 SonarQube 整合是 DevOps 实践的一部分,能够帮助团队提高软件开发的效率和质量,促进开发与运维之间的协作。通过这种整合,团队可以实现更快速的迭代和更高的代码质量,从而更好地满足业务需求。


总结陈词

💗 本篇文章介绍了质量检测工具 Sonar 在企业中的实战接入,属于 DevOps 的一部分,希望可以帮助到大家。

💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

战神刘玉栋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值