前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SonarQube:为你的PHP代码质量保驾护航

SonarQube:为你的PHP代码质量保驾护航

作者头像
Tinywan
发布2024-01-10 15:13:37
2480
发布2024-01-10 15:13:37
举报
文章被收录于专栏:开源技术小栈开源技术小栈

简介

SonarQube是什么?

SonarQube是一个开源的代码质量管理平台,用于检测代码中的错误、漏洞和代码规范。它可以与多种工具集成,如Gitlab、Jenkins等,以便在项目拉取后进行连续的代码检查。SonarQube旨在提供一个完整的代码质量管理解决方案,支持多种计算机编程语言,并内置大量常用代码检查规则。

该产品分析了30多种不同的编程语言,并集成到DevOps平台的持续集成(CI)管道中,以确保您的代码符合高质量标准。

SonarQube优势

  • 支持30多种不同的编程语言
  • 插件机制能集成IDEJenkinsGit
  • 内置大量常用代码检查规则
  • 支持定制开发规则
  • 支持从可靠性、安全性、可维护性、覆盖率、重复率等方面分析项目

原理

  • 代码收集:首先,Sonarqube向代码仓库请求代码,并将代码下载到本地。
  • 代码分析:然后,Sonarqube使用其内置的代码分析器分析代码并生成有关代码质量的重要信息,例如代码复杂性、代码重复性、代码测试覆盖率等。
  • 数据存储:Sonarqube将收集的数据存储在其数据库中,以供后续使用。
  • 报告生成:Sonarqube使用其内置的报告生成器生成各种数据可视化图表、报告和警告,并将其呈现给用户。
  • 反馈和持续改进:用户可以使用Sonarqube提供的反馈功能来共享意见和建议,以改善代码质量。此外,Sonarqube还提供了持续集成和持续交付等功能,以帮助团队在代码开发过程中不断改进代码质量。

架构

  • 数据库层:Sonarqube使用一个数据库来存储所有的代码质量数据。
  • 应用程序层:Sonarqube的应用程序层包括一系列基于Java的Web应用程序,这些应用程序负责收集数据、分析代码和生成报告等任务。
  • 插件层:Sonarqube的插件层是一个可扩展的架构,它允许用户安装和使用各种不同的插件来增强Sonarqube的功能和灵活性。
  • 数据采集层:Sonarqube支持多种不同的代码仓库和版本控制系统,包括SVN、Git、Mercurial和ClearCase等。使用这些数据采集插件,Sonarqube可以轻松地从不同的代码库中收集数据。

安装

这里使用Docker安装Sonarqube。在Docker hub上找到Community Edition Docker镜像。

1. 拉取最新镜像

代码语言:javascript
复制
docker pull sonarqube:latest

2. 启动SonarQube

代码语言:javascript
复制
docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9999:9000 sonarqube:latest

注意:容器端口映射,由于我本地9000端口被占用,所以这里宿主机端口映射为9999

3. 登录SonarQube

实例启动并运行后,使用系统管理员凭据登录到:http://localhost:9999/

默认密码用户名和密码都是admin

登录后重新设置新密码,这里设置新密码为123465

继续

3. 创建SonarQube项目

创建一个 php-tinywan项目

4. 添加代码仓库

1、这里选择本地代码仓库 Locally

2、生成访问令牌

5. 运行 Sonar-Scanner 客户端

Sonar-Scanner是一个用于分析代码质量的命令行工具,它基于SonarQube平台。SonarQube是一个开源的代码质量检测平台,可以分析多种编程语言编写的代码,并提供相应的质量报告。通过Sonar-Scanner工具,可以对项目代码进行静态分析,从而提高代码质量、降低潜在的错误和风险。Sonar-Scanner的主要使用方法是在项目根目录下创建一个名为sonar.properties的文件,用于配置分析参数。

代码语言:javascript
复制
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 地址
代码语言:javascript
复制
$ ipconfig

Windows IP 配置

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::2075:8fc5:1305:3a16%2
   IPv4 地址 . . . . . . . . . . . . : 192.168.3.88
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 192.168.3.1

6. 分析扫描结果

案例1:永远不会执行的代码

定义一个永远不会执行或者访问的的代码。无法访问的代码通常是指那些由于某种原因而无法被程序正常访问或执行的代码。

代码语言:javascript
复制
<?php
/**
 * @throws Exception
 */
function tinywan()
{
    $aa = 2024;
    if ($aa > 0) {
        throw new Exception('这是一个异常');
    } else {
        return $aa;
    }
    /** 这里永远不会执行或者访问的的代码*/
    return '开源技术小栈';
}

var_dump(tinywan());

开始扫码

代码语言:javascript
复制
....
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 给的建议是

代码语言:javascript
复制
Delete this unreachable code or refactor the code to make it reachable.

删除此无法访问的代码,或者重构代码使其可以访问。

检查第一个bug,可以看到创建了无法访问的代码。可以看出,通过SonarQube可以很方便地找到这样的bug

案例2:打印一个没有返回值的函数或者类方法

当你尝试调用调用一个函数或者类方法并且输出打印该返回值,会产生一个Bug。

代码语言:javascript
复制
<?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. 如果一个函数不返回任何内容,那么使用它的输出就没有意义了。具体来说,将其传递给另一个函数,或将其“结果”分配给变量可能是一个错误,因为这样的函数什么都不返回,这可能不是预期的结果。

案例3:分析一把 hello

只需要把这个项目放在D:/sonarqube目录下即可。拉取代码

代码语言:javascript
复制
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告诉你应该这么做:您应该为断言方法提供一个硬编码的值作为期望值,而断言的实际值应该派生自您想要测试的代码部分。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
    • SonarQube是什么?
      • SonarQube优势
        • 原理
          • 架构
          • 安装
            • 1. 拉取最新镜像
              • 2. 启动SonarQube
                • 3. 登录SonarQube
                  • 3. 创建SonarQube项目
                    • 4. 添加代码仓库
                      • 5. 运行 Sonar-Scanner 客户端
                        • 6. 分析扫描结果
                          • 案例1:永远不会执行的代码
                          • 案例2:打印一个没有返回值的函数或者类方法
                          • 案例3:分析一把 hello
                      相关产品与服务
                      容器服务
                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档