目录
2.2.1 /api/cesubmit接口-SubmitAction.handle
2.2.2 执行分析队列任务-CeWorkerImpl.findAndProcessTask
概要
因为sonarqube整个开源项目比较大,这里分为几部分讲解
- 整体框架+sonarqube扫描代码的流程
- sonar-scanner-cli源码分析
- sonarqube源码分析
- sonarqube-language源码分析
仅是个人对源码的理解,如有不正确的地方,欢迎讨论
整体架构
1.应用模块架构图
2.sonarqube静态代码扫描全流程
整体流程包含3部分:
- sonar-scanner解析
- 执行sonarqube-server的/api/ce/submit接口,将task入队
- 从queue中获取task,执行task检测
2.1 sonar-scanner解析步骤:
在执行完解析后在.scannerwork/scanner-report生成如下报告,然后上传到sonarqube,等待sonarqube执行task:
- activerules.pb:激活的规则信息(语言...key,org_qprofiles_uuid)
- changesets-xx.pb:修改的文件
- component-xx.pb:文件语言+文件路径
- context-props.pb:analysis_properties表的解析数据
- coverages-xx.pb:覆盖率文件。二进制文件
- duplications-xx.pb:重复提交文件
- external-issues-xx.pb:指定文件外部规则解析问题
- issues-xx.pb:二进制文件
- measures-xx.pb:二进制文件,度量指标
- source-xx.txt:源码文件
- syntax-highlightings-xx.pb:语法高亮显示
2.2 sonarqube-server执行逻辑
sonarqube-server执行分两部分
- /api/ce/submit:将report结果入库ce_task_input中
- 遍历ce_task_input消息,执行ce_task检测
2.2.1 /api/cesubmit接口-SubmitAction.handle
- 如果没有project,就插入project,将project作为mainBranchComponent
- 将report以输入流的方式保存在数据库ceTaskInput表中
- 录入提交的characteristicDto数据
- ceQueue表插入pending-report任务
- 组装ceTask并返回
2.2.2 执行分析队列任务-CeWorkerImpl.findAndProcessTask
加载Steps的类跳转(没有加入参):
CeWorkerImpl.findAndProcessTask()
---> CeWorkerImpl.run()
---> CeWorkerImpl.executeTask()
---> ReportTaskProcessor.process()
---> ContainerFactory.create()
---> TaskContainerImpl()
---> TaskContainerImpl.populateContainer()
---> ProjectAnalysisTaskContainerPopulator.populateContainer()
---> SpringComponentContainer.add()
至此,将全部steps加载到context中
分析流程:
3.核心数据库表结构
数据库(sonarqube 9.9.3.79811)表是在执行sonar-scanner后相关的
小结
这里主要是架构图,为了方便理解,加入了一些源码跳转。后续会更新对应的源码解析。