SonarQube是一个开源的代码质量管理平台,用于检测代码中的错误、漏洞和代码规范。它可以与多种工具集成,如Gitlab、Jenkins等,以便在项目拉取后进行连续的代码检查。SonarQube旨在提供一个完整的代码质量管理解决方案,支持多种计算机编程语言,并内置大量常用代码检查规则。
该产品分析了30多种不同的编程语言,并集成到DevOps平台的持续集成(CI)管道中,以确保您的代码符合高质量标准。
IDE
、Jenkins
、Git
等这里使用Docker安装Sonarqube。在Docker hub
上找到Community Edition Docker
镜像。
docker pull sonarqube:latest
docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9999:9000 sonarqube:latest
注意:容器端口映射,由于我本地
9000
端口被占用,所以这里宿主机端口映射为9999
。
实例启动并运行后,使用系统管理员凭据登录到:http://localhost:9999/
默认密码用户名和密码都是
admin
。
登录后重新设置新密码,这里设置新密码为123465
继续
创建一个 php-tinywan
项目
1、这里选择本地代码仓库 Locally
2、生成访问令牌
Sonar-Scanner是一个用于分析代码质量的命令行工具,它基于SonarQube平台。SonarQube是一个开源的代码质量检测平台,可以分析多种编程语言编写的代码,并提供相应的质量报告。通过Sonar-Scanner工具,可以对项目代码进行静态分析,从而提高代码质量、降低潜在的错误和风险。Sonar-Scanner的主要使用方法是在项目根目录下创建一个名为sonar.properties的文件,用于配置分析参数。
docker run \
--rm \
-v "D:/sonarqube/cache:/opt/sonar-scanner/.sonar/cache" \
-e SONAR_HOST_URL="http://192.168.3.88:9999" \
-e SONAR_SCANNER_OPTS="-Dsonar.projectKey=php-tinywan" \
-e SONAR_TOKEN="sqp_5c64cc44db453555eb23c24ce841ffbb451a944e" \
-v "D:/sonarqube:/usr/src" \
sonarsource/sonar-scanner-cli
192.168.3.88
为本机宿主机ip,即本机IPv4 地址
$ ipconfig
Windows IP 配置
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::2075:8fc5:1305:3a16%2
IPv4 地址 . . . . . . . . . . . . : 192.168.3.88
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.3.1
定义一个永远不会执行或者访问的的代码。无法访问的代码通常是指那些由于某种原因而无法被程序正常访问或执行的代码。
<?php
/**
* @throws Exception
*/
function tinywan()
{
$aa = 2024;
if ($aa > 0) {
throw new Exception('这是一个异常');
} else {
return $aa;
}
/** 这里永远不会执行或者访问的的代码*/
return '开源技术小栈';
}
var_dump(tinywan());
开始扫码
....
INFO: ------------- Run sensors on project
INFO: Sensor Analysis Warnings import [csharp]
INFO: Sensor Analysis Warnings import [csharp] (done) | time=1ms
INFO: Sensor Zero Coverage Sensor
INFO: Sensor Zero Coverage Sensor (done) | time=50ms
INFO: SCM Publisher No SCM system was detected. You can use the 'sonar.scm.provider' property to explicitly specify it.
INFO: CPD Executor Calculating CPD for 1 file
INFO: CPD Executor CPD calculation finished (done) | time=11ms
INFO: Analysis report generated in 207ms, dir size=144.0 kB
INFO: Analysis report compressed in 231ms, zip size=18.8 kB
INFO: Analysis report uploaded in 66ms
INFO: ANALYSIS SUCCESSFUL, you can find the results at: http://192.168.3.88:9999/dashboard?id=php-tinywan
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://192.168.3.88:9999/api/ce/task?id=AYzUdaiYPhfSnx9lYXqY
INFO: Analysis total time: 13.991 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 18.789s
INFO: Final Memory: 20M/74M
INFO: ------------------------------------------------------------------------
扫码结果,发现有一个New Bugs
展开New Bugs
并检查受影响的行
SonarQube 给的建议是
Delete this unreachable code or refactor the code to make it reachable.
删除此无法访问的代码,或者重构代码使其可以访问。
检查第一个bug,可以看到创建了无法访问的代码。可以看出,通过SonarQube
可以很方便地找到这样的bug
。
当你尝试调用调用一个函数或者类方法并且输出打印该返回值,会产生一个Bug。
<?php
/* @author Tinywan(ShaoBo Wan) */
declare(strict_types=1);
function test(){
$arr = [2024, 2025, 2026, 2027, 2028, 2029, 2030];
while (count($arr) > 0) {
echo array_pop($arr) . PHP_EOL;
}
if (count($arr) > 0) {
echo 'This line will never execute';
}
}
$result = test();
var_dump($result);
当然这里也给出了SonarQube为什么认为这是一个问题?
If a function does not return anything, it makes no sense to use its output. Specifically, passing it to another function, or assigning its "result" to a variable is probably a bug because such functions return nothing, which is probably not what was intended. 如果一个函数不返回任何内容,那么使用它的输出就没有意义了。具体来说,将其传递给另一个函数,或将其“结果”分配给变量可能是一个错误,因为这样的函数什么都不返回,这可能不是预期的结果。
只需要把这个项目放在
D:/sonarqube
目录下即可。拉取代码
git clone git@github.com:Tinywan/hello.git
使用SonarQube插件扫码结果和建议
问题一:定义参数没有使用
Remove the unused function parameter "$iv".
SonarQube告诉你应该这么做:在代码中使用未使用的函数参数可能会导致对开发人员意图的混淆和误解。它们降低了代码的可读性,并引入了潜在的错误。为了避免这些问题,开发人员应该从函数声明中删除未使用的参数。
问题二:
编写单元测试异常(这都被搞出来啦!我不行)
交换这两个参数,使它们按正确的顺序排列:期望值、实际值。
Swap these 2 arguments so they are in the correct order: expected value, actual value.
SonarQube告诉你应该这么做:您应该为断言方法提供一个硬编码的值作为期望值,而断言的实际值应该派生自您想要测试的代码部分。