SonarScanner 源码分析

SonarScanner 源码分析


title: SonarScanner 源码分析
date: 2020-11-24 14:00:00
author: mamian521#gmail.com


介绍:

SonarQube是一个静态代码扫描平台,支持主流语言的静态代码扫描分析。

SonarQube主要分为几个模块:WebServer、CeServer、Scanner

今天主要对 Scanner 分析一下源码,其中Scanner是在本地执行扫描分析的工具,也就是说SonarScanner是在本地执行扫描分析之后将结果上传到服务端进行分析。本文重点介绍一下 Scanner 的源码和原理。

SonarScanner 的源码主要有三部分,一个是 SonarScannerCli 用来执行命令和接收参数(https://github.com/SonarSource/sonar-scanner-cli.git),另一个是 SonarScannerApi ,主要用来下载插件包和加载类 (https://github.com/SonarSource/sonar-scanner-api.git),还有真正用来执行扫描的 SonarScannerEngine (https://github.com/SonarSource/sonarqube/tree/master/sonar-scanner-engine)

本文主要分析一下前两部分。

SonarScannerCli

目录结构:

可以看出,Cli 的源码并不多,入口是 Main 类的 main 函数

Logs logs = new Logs(System.out, System.err);
Exit exit = new Exit();
Cli cli = new Cli(exit, logs).parse(args);
Main main = new Main(exit, cli, new Conf(cli, logs, System.getenv()), new ScannerFactory(logs), logs);
main.execute();

主要的几个类:

Logs 用来记录日志

Exit 记录退出码

Cli 用来解析命令行执行时传递的变量

Conf 类用来接收 Cli 解析之后的参数

参数主要从几个地方获取

  1. Scanner 全局设置(Scanner安装目录/conf/sonar-scanner.properties)
  2. 环境变量 (key = SONARQUBE_SCANNER_PARAMS value 格式为 JSON )
  3. 仓库文件 (sonar-project.properties)
  4. 命令行参数 (通过 Java Properties 传递)

最后在 Main 里的 execute 方法中执行扫描

再来看看这个方法

execute

void execute() {
   
    // 记录执行耗时
    Stats stats = new Stats(logger).start();

    // 默认退出码为1
    int status = Exit.INTERNAL_ERROR;
    try {
   
      Properties p = conf.properties();
      // 检查是否有 skip 跳过扫描的设置
      checkSkip(p);
      // 根据参数设置 log 级别
      configureLogging(p);
      // 初始化 runner
      init(p);
      // 初始化 变量 ,下载插件
      runner.start();
      logger.info(String.format("Analyzing on %s", conf.isSonarCloud(null) ? "SonarCloud" : ("SonarQube server " + runner.serverVersion())));
      // 执行扫描
      execute(stats, p);
      status = Exit.SUCCESS;
    } catch (Throwable e) {
   
      displayExecutionResult(stats, "FAILURE");
      showError("Error during SonarScanner execution", e, cli.isDebugEnabled());
      status = isUserError(e) ? Exit.USER_ERROR : Exit.INTERNAL_ERROR;
    } finally {
   
      exit.exit(status);
    }

  }

里边最重要的是 3 个方法,

init(p);
runner.start();
execute(stats, p);

init

private void init(Properties p) {
   
    SystemInfo.print(logger);
    if (cli.isDisplayVersionOnly()) {
   
      exit.exit(Exit.SUCCESS);
    }

    runner = runnerFactory.create(p, cli.getInvokedFrom());
  }
class ScannerFactory {
   

  private final Logs logger;

  public ScannerFactory(Logs logger) {
   
    this.logger = logger;
  }

  EmbeddedScanner create(Properties props, String isInvokedFrom) {
   
    String appName = "ScannerCLI";
    String appVersion = ScannerVersion.version();
    if (!isInvokedFrom.equals("") && isInvokedFrom.contains("/")) {
   
      appName = isInvokedFrom.split("/")[0];
      appVersion = isInvokedFrom.split("/")[1];
    }

    return EmbeddedScanner.create(appName, appVersion, new DefaultLogOutput())
      .addGlobalProperties((Map) props);
  }

EmbeddedScanner runner 是真正的执行的扫描的类,创建该类的实例化时,提供了一个 create 方法,实现了工厂设计模式。

ScannerFactory 就进入到了 ScannerApi 这个库里

可以看到,更多的细节处理在 SonarScannerApi 中,SonarScannerCli 这个库主要是进行了命令的解析及处理,后续的工作由 SonarScannerApi 来完成。

SonarScannerApi

目录结构:

我们先看一下 EmbeddedScanner 这个入口类

/**
 * Entry point to run SonarQube analysis programmatically.
 *
 * @since 2.2
 */
public class EmbeddedScanner {
   
  private static final String BITBUCKET_CLOUD_ENV_VAR = "BITBUCKET_BUILD_NUMBER";
  private static final String SONAR_HOST_URL_ENV_VAR = "SONAR_HOST_URL";
  private static final String SONARCLOUD_HOST = "<https://sonarcloud.io>";
  private final IsolatedLauncherFactory launcherFactory;
  private IsolatedLauncher launcher;
  private final LogOutput logOutput;
  private final Map<String, String> globalProperties = new HashMap<>();
  private final Logger logger;
  private 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SonarScanner是一个开源的静态代码分析工具,专门用于帮助开发人员发现和修复代码中的缺陷和漏洞。它可以对各种编程语言如Java、C#、JavaScript等进行静态代码分析,帮助开发人员及时发现潜在的安全风险和质量问题。 SonarScanner官网提供了详细的文档和指南,帮助开发人员了解如何安装、配置和使用SonarScanner。它还提供了丰富的示例和案例,帮助开发人员更好地理解如何利用SonarScanner来改善他们的代码质量。 在SonarScanner官网上,用户可以找到最新版本的下载链接,获取最新的升级信息和更新日志。同时,官网也提供了用户社区和论坛,让用户可以方便地分享经验、交流问题和寻求帮助。这些资源都让SonarScanner的使用变得更加便捷和高效。 通过SonarScanner官网,开发人员还可以了解到SonarScanner的扩展插件和集成工具,帮助他们更好地将SonarScanner整合到他们的开发流程中。这些集成工具可以与常用的IDE、CI/CD工具和代码托管平台无缝对接,帮助开发团队更好地实现持续集成和持续交付。 最重要的是,SonarScanner官网为用户提供了全面的技术支持和帮助文档,让用户在使用SonarScanner的过程中能够得到及时的帮助和解决问题。通过官网,用户可以提交反馈和建议,帮助SonarScanner不断改进和完善。总之,SonarScanner官网为开发人员提供了丰富的资源和支持,帮助他们更好地利用SonarScanner来优化代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值