记一次sonaQuber本地搭建体验过程
系统
基于win10系统的搭建
版本要求
jdk-21_windows-x64_bin
sonarqube-10.2.1.78527
sonar-l10n-zh-plugin-10.2
// 版本必须匹配
1. 安装 JDK
官方下载:www.oracle.com/java/techno…
附件下载:📎jdk17.zip
2. 安装 SonarQube
官方下载:www.sonarsource.com/products/so…
附件下载:📎sonarqube-10.2.1.78527.zip
SonarQube 10.2.1.78527 对 JDK 的版本有一定的要求:
- 最低要求 JDK 8 SonarQube 10.2.1 的发布说明中写明需要 JDK 8 或更高版本。所以 JDK 8 是这个版本 SonarQube 的最低 JDK 要求。
- 建议使用 JDK 11 虽然最低要求是JDK 8,但SonarQube的官方文档中推荐使用JDK 11来运行SonarQube 10.2.1。 主要原因是JDK 11能提供更好的性能和稳定性。SonarQube 通过面向JDK 11来优化代码,可以减少可能的兼容问题。
- 可能存在的问题 使用JDK 17可能会遇到一些兼容性问题,不太推荐。 使用JDK 8的用户也可能遇到已知的一些问题,比如与Java security manager的兼容问题。
- 推荐升级 虽然SonarQube 10.2.1可以运行在JDK 8上,但建议用户尽可能升级到JDK 11,以获得更好的兼容性和性能。 未来SonarQube也会逐步增加对JDK 11特性的使用,完全面向JDK 11。 所以综合来说,对于SonarQube 10.2.1版本,推荐的JDK版本是11,其他版本可能存在一定的已知问题或兼容性风险。
- 本文使用jdk17版本
3. 启动 SonarQube 服务
如上图我的安装目录,打开cmd, 执行 StartSonar.bat start
4. 访问 web 界面
浏览器输入 http://localhost:9000/
,打开 web 界面。初始帐号密码为 admin:admin
登陆后立马弹窗修改密码。
5. 安装中文插件
在 WEB 节目,点击 Administration -> Marketplace
,进入插件市场,搜索 chinese ,可以安装中文插件。由下面介绍手动安装插件的方法:
- 下载插件
附件下载:📎sonar-l10n-zh-plugin-10.2.jar
- 下载后将 jar 包文件放到 sonarqube 安装目录 /extensions/plugins 路径下
- 重启 sonarqube 服务。
StartSonar.bat restart
注: 我本地汉化语言包没生效,不知是不是版本兼容问题!!!
6. 开启强制登录
7. 创建项目
首先登录平台,然后点击该按钮添加项目
取一个项目名字 如:test_01
然后创建一个令牌(可以随意输入一个名字,或与项目同名)
随后点击创建,选择other(其中包含了js,ts),并选择你的电脑的系统,本文选择windows系统,
step1: 先下载扫描器工具
注:这里注意配置环境变量后可全局使用
跳转下载链接后,点击window64进行下载并解压(其它系统根据自身情况选择)
官方地址:docs.sonarsource.com/sonarqube/1…
附件地址:📎sonar-scanner-cli-5.0.1.3006-windows.zip
7.1 SonarScanner 使用说明
SonarScanner 的使用方式有两种,默认 SonarScanner 会在当前目录下寻找名为sonar-project.properties 的文件,并依据此文件中定义的选项来扫描分析代码,而另一种使用方式是直接在命令行中使用 -D 参数指定扫描选项。
常用的选项参数:
sonar.host.url # sonarqube服务器地址
sonar.projectKey # 项目的唯一关键字,不能与其他项目重复
sonar.projectName # sonarqube中显示的项目名称
sonar.projectVersion # 项目版本
sonar.login # 用户名
sonar.password # 用户密码
sonar.ws.timeout # 超时时间
sonar.language # 语言
sonar.projectDescription # 项目描述信息
sonar.links.homepage # 项目的主页(超链接)
sonar.sources # 扫描项目的目录位置
sonar.sourceEncoding # 编码
sonar.java.binaries # 编译后的类文件目录
sonar.java.test.binaries # 编译后的测试类目录
sonar.java.surefire.report # 测试报告目录
@REM sonar.projectKey=project 项目标识
@REM sonar.projectName=项目名 # 中文的字段需要用Unicode转码,展示到sonarqube的web中才不会乱码
@REM sonar.sources=./ 扫描的文件
@REM sonar.sourceEncoding=UTF-8
@REM sonar.host.url=
@REM sonar.login=f2565bbd4230e847873b6035e4bddf6e71975734
@REM # 公共可用的配置项
@REM sonar.projectVersion=1.0
@REM sonar.sourceEncoding=UTF-8
@REM sonar.sources=./src
@REM sonar.exclusions=/node_modules/ 排除不需要扫描的文件,要排除多个目录文件以逗号分隔
@REM sonar.tests=./src
@REM sonar.test.inclusions=**/*.spec.ts
7.2 扫描本地项目
7.2.1 扫描项目
- 方式一:使用sonar-project.properties文件
[root@c7-02 data]# cd /data/simple-java-maven/
[root@c7-02 simple-java-maven]# vim sonar-project.properties
sonar.host.url=http://10.55.55.72:9000
sonar.projectKey=v1.2.3
sonar.projectName=java-demo
sonar.projectVersion=1.0
sonar.sources=.
sonar.java.binaries=.
sonar.sourceEncoding=UTF-8
sonar.login=admin
sonar.password=admin
sonar.projectDescription="my first project!"
此方法java或结合devops使用,本文中使用方式二,配置较简单
- 方式二:-D指定选项参数
sonar-scanner
-Dsonar.host.url=http://127.0.0.1:9000
-Dsonar.projectKey=v1.2.3
-Dsonar.projectName=test-demo
-Dsonar.projectVersion=1.0
-Dsonar.sources=.
-Dsonar.java.binaries=.
-Dsonar.sourceEncoding=UTF-8
-Dsonar.login=admin
-Dsonar.password=admin
-Dsonar.projectDescription="my project!"
step2:复制代码
sonar-scanner.bat
-D"sonar.projectKey=a_01"
-D"sonar.sources=."
-D"sonar.host.url=http://localhost:9000"
-D"sonar.token=sqp_e7be45f6255fe48a34ce436a6560a8699af35c00"
step3:进入项目根目录,创建sonar.bat 文件,把step2代码复制并进行编辑
这里特别注意我扫描器的安装目录为
F:\soft\sonar-scanner-cli-5.0.1.3006-windows\sonar-scanner-5.0.1.3006-windows\bin
注意:sonat-sanner.bat要改为绝对路径,把反斜杠""换为顺斜杠“/”
F:/soft/sonar-scanner-cli-5.0.1.3006-windows/sonar-scanner-5.0.1.3006-windows/bin/sonar-scanner.bat
-D"sonar.projectKey=test_01"
-D"sonar.sources=."
-D"sonar.host.url="
-D"sonar.login="
错误分析:
上面没有配置扫描器环境变量,直接指向安装目录,执行时报错
解决方案:
配置扫描器环境变量
修改sonar.bat 配置
sonar-scanner.bat
-D"sonar.projectKey=test_front"
-D"sonar.sources=./src"
-D"sonar.host.url=http://localhost:9000"
-D"sonar.token=sqp_48842fded9d9253072b5d6f7e9a071d79899892f"
-D"sonar.projectVersion=1.0"
-D"sonar.sourceEncoding=UTF-8"
-D"sonar.exclusions=./node_modules/,./src/yx-widght" #排除不需要扫描的文件,要排除多个目录文件以逗号分隔
然后双击该文件即可启动扫描,这里建议cmd 中执行 sonar.bat
静待扫描结束。
扫描结束后,就可以去到SonarQube后台看到扫描结果了,选择对应的项目并查看。
点击问题可以展开详情,查看具体是哪一句代码报错
8、自定义规则
sonarqube的七个维度检测代码质量:
复杂度分布:
代码复杂度过高将难以理解
重复代码:
程序中包含大量复制、粘贴的代码而导致代码臃肿,sonar可以展示源码中重复严重的地方
单元测试统计:
统计并展示单元测试覆盖率,开发或测试可以清楚测试代码的覆盖情况
代码规则检查:
检查代码是否符合规 范
注释率:
若代码注释过少,特别是人员变动后,其他人接手比较难接手;若过多,又不利于阅读
潜在的 Bug :
检测潜在的 bug
结构与设计:
找出循环,展示包与包、类与类之间的依赖、检查程序之间耦合度
大多数情况下都使用默认规则,扫描情况较复杂,在实际业务中可以自定义
比如有些情况下前端 使用双 !!
来判断对象,此时代码扫描报错,诸如此类的情况还很多,
常见错误见:blog.51cto.com/u_14832233/…
目前云效针对Sonar静态扫描提供了一个可自定义规则的代码插件,融入代码工程之后,可以在本地运行,
相关源码:
📎sonar-yunxiao-java-plugin3.11.zip
9、结合其他工具的使用
jenkins 插件 首先需要在jenkins中安装SonarQube Scanner插件:
然后去sonarqube服务端创建账户token:
接着将该token保存到jenkins的凭据管理中:
最后在jenkins上系统管理->系统配置中配置sonarqube服务器地址:
这时候就可以使用sonarqube的jenkins插件进行代码扫描了,下面是pipeline使用参考:
//代码扫描
//代码扫描
stage("CodeScan"){
steps{
timeout(time:20, unit:"MINUTES"){
script{
tools.PrintMes("代码扫描!","green")
withSonarQubeEnv(credentialsId: 'c8c8160b-d6d1-4bd7-a49c-bddd2fe7130b') {
sh """
sonar-scanner \
-Dsonar.projectVersion=v2.0
"""
}
}
}
}
}
Docker安装 如果不是生产环境的话,可以考虑使用docker来启动SonarQube,简单方便。
# 创建数据卷
mkdir -p /data/sonar/{sonarqube_conf,sonarqube_extensions,sonarqube_logs,sonarqube_data}
chmod -R 777 /data/sonar
# 运行sonar容器
docker run -itd --name sonarqube \
-p 9000:9000 \
-v /data/sonar/sonarqube_conf:/opt/sonarqube/conf \
-v /data/sonar/sonarqube_extensions:/opt/sonarqube/extensions \
-v /data/sonar/sonarqube_logs:/opt/sonarqube/logs \
-v /data/sonar/sonarqube_data:/opt/sonarqube/data \
sonarqube:lts
# 验证
docker logs -f sonarqube
基于gitlab runner+ docker 的CI/CD链路
基于Github + Jenkins+sonar 的链路
总结:
在整体质量体系下链路下,质量管理要求显得格外重要,以上适合没有统一devops平台团队,
sonar不仅能够检测出代码问题,减少在编码过程中犯过的一些低级错误,同时能够加强代码有可读性和维护性,并且通过代码质量检查,可以在发布测试环境之前及时发现问题、修复问题,减少测试环境bug率,拉升你的KPI , 从而系统地提高整体代码质量。不仅如此,前端也可以独立将这些沉淀为工具,比如像FF tools
,yx-doctor
就是很好的工具,大多情况下,有一定技术体量和基因的企业将这些都归类到devops 体系中,在这样的体系中,前端很少接触的到,前期小团队建议可以搭建sonar服务,是不错的选择。
像静态代码检查+依赖检查+依赖可视化+提交规范+合并请求+代码检查(人工)+代码扫描,这个过程都可以归类到前端工程化体系中
转载自:https://juejin.cn/post/7282245793688043580