1. 简介:
sonarqube是一个开源代码质量管理平台,可通过安装不同的插件sonar可以集成测试工具、代码质量分析工具、持续集成等多种功能。sonarqube架构主要由:sonarqube服务器、sonar数据库、插件、sonarqube scanners四部分组成。
Sonar的工作原理
Sonar实际上是一个Web系统,展现了静态代码扫描的结果,结果是可以自定义的,而真正实现代码扫描的是Sonar Scanner这个工具,另外同时支持多种语言的原理是它的扩展性,通过插件实现的,也就是Java Jar架包,可以在Sonar平台上在线安装或者离线安装。
SonarQube 需要数据库的支持,用于存储检测项目后的分析数据,同时为了实现可持续监测,还需要持续集成工具(如Jenkins)的支持,在构建版本前,通过Jenkins+Sonar 插件执行项目分析指令,最终的结果会通过SonarQube 服务器的Web 页面展示。下图是使用SonarQube做代码持续审查的流程图:
开发人员把代码push到SCM(如gitlab)【上图第2步】,jenkins构建定义好的job,然后通过jenkins 插件(sonar scanner)分析源码【上图第3步】,jenkins把分析报告发到sonarqube server【上图第4步】。
二. sonarqube下载安装
注:在这里是安装7.7。sonarqube7.7之前可以用mysql(而且mysql的版本>5.6小于8.0,具体可以看conf下的sonar.properties),之后就不支持。
-
首先确保安装了jdk11(jdk版本太低会报错)
- 到此链接 https://www.sonarqube.org/downloads/下载sonarqube(下载社区版,是免费的),并解压,解压完之后就可以用啦
- 到解压完之后的目录下,我是在这里D:\sonarqube-7.7\bin\windows-x86-64,双击StartSonar.bat文件,启动StartSonar
- 到浏览器界面,输入 : http://localhost:9000 //能够进入界面表示安装成功
-
登录:默认用户名密码是admin(登录前后的区别是登录后多了配置,其余的感觉没太大区别)
-
安装中文插件:安装成功后重启sonar
三、开始分析项目源代码
扫描器有四种:
- Gradle - SonarScanner for Gradle
- MSBuild - SonarScanner for MSBuild
- Maven - use the SonarScanner for Maven
- Jenkins - SonarScanner for Jenkins
- Azure DevOps - SonarQube Extension for Azure DevOps
- Ant - SonarScanner for Ant
- anything else (CLI) - SonarScanner
3.1使用maven的方式分析
- 编写maven的settings.xml文件
我的位置是在D:\apache-maven-3.5.0\conf\settings.xml
找到对应的位置添加以下代码:
<settings>
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
http://localhost:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>
我的是这样
-
在需要代码检查的项目的根目录下(也就是带有pom.xml的目录)执行命令
mvn clean verify sonar:sonar
出现build success表示成功
浏览器输入红框处地址即可查看,或者刷新页面
3.2SonarQube实现GitLab代码审计(还在进行中)
- 下载插件包 sonar-gitlab-plugin-4.1.0-SNAPSHOT.jar(gitlab插件)
放到D:\sonarqube-7.7\extensions\plugins这个下面;或者按照安装中文插件的方式安装 - 下载Gitlab Runner,安装环境、注册Gitlab Runner
GitLab Runner是一个开源项目,用于运行您的作业并将结果发送回GitLab。它与GitLab CI一起使用,GitLab中包含的开源持续集成服务可以协调工作。
官网教程:https://docs.gitlab.com/runner/install/windows.html
- gitlab ci的地址以及token,从你要配置该runner到哪个项目,就去gitlab下该项目首页右侧设置—》CI/CD Pipelines—》Specific Runners下可以找到。
- gitlab-ci tags这个很重要,在项目构建流程yaml文件里面指定tag,就是匹配使用哪个tag的runner,这里我定义了my-tag,another-tag;回头再配置文件里面就指定这个tag。
-
executor:执行者可以有很多种,这里我们使用shell
(1)gitlab-ci token的获取()
- 编写gitlab-ci.yml并将其放在Gitlab上的根目录下,当存储库发生任何更改时,他将启动这个脚本
stages:
- build
- test
job1:
stage: test
script:
- sh test.sh
artifacts:
paths:
- data_test/
job2:
stage: build
script:
- echo 'suceed test' >> txt1
-
gitlab和sonar之间互通
(1)首先需要登录开发人员和设计人员的GitLab账户,获取个人的Token,如果没有Token,可以新建一个
(2)登录SonarQube账户,配置GitLab地址和账户Token信息
应用id是项目的id
四、webhook
参考:
- https://blog.csdn.net/u011884671/article/details/80525727?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2
- https://blog.csdn.net/weixin_40861707/article/details/82117232
sonar7.7 webapi解析
- 点进自己的某一个扫描后的项目project,会在右下角发现一个projectKey.:org.sonarqube:sonarscanner-maven-aggregate
- Web API文档路径:http://localhost:9000/web_api
- 认证api:
POST api/authentication/login 参数是login和password 没有特别说明的话,这里的login和password都是admin,可以在sonar页面的最上方Administration里点进行密码修改,也可以直接修改config文件.
如果使用POSTMAN测试接口需要认证的sonar GET接口,可以在postman的认证里,选basic auth,然后填login和password,再发GET请求就可以了。
http://localhost:9000/api/authentication/validate
api/projects/search搜索项目或视图来管理它们。
https://www.cnblogs.com/zhhiyp/p/9716158.html
java调用Api接口工具类https://blog.csdn.net/BoomLee/article/details/93032032
生成PDFhttps://gitee.com/jlynet007/sonar-pdf-plugin/tree/master
五、问题
注意:在结束服务时,要在终端界面执行ctrl+c命令,出现选择yes或者no时,选择yes退出,否则就要按照问题1的解决方法去解决。
- 启动SonarQube,在浏览器输入http://localhost:9000/about,SonarQube服务端闪退。(学会去看错误日志,里面有出现错误的原因)
解决办法:查看/logs/下的日志,发现org.elasticsearch.transport.BindTransportException: Failed to bind to [9001]
Caused by: java.net.BindException: Address already in use: bind
查看占用端口的进程PID:netstat -aon | findstr "9000"
杀死占用端口的进程:taskkill /pid 19528 /f
具体解决方法如下图所示
然后sonar服务端显示