SonarQube-配置Scanner
scanner的类型有很多, 可以通过官网:https://docs.sonarqube.org/8.9/analysis/overview/ 获取支持的列表。
- 变更项目代码: 可以使用构建工具进行扫描。例如maven、ant、gradle可以在配置文件中引入对应的配置。
- 不变更项目代码配置: 可以使用Jenkins或其他平台的扩展插件, 以及使用命令行进行扫描。
这里先通用版本
● Gradle - SonarScanner for Gradle ● .NET - SonarScanner for .NET ● Maven - use the SonarScanner for Maven ● Jenkins - SonarScanner for Jenkins (Jenkins 集成插件) ● Azure DevOps - SonarQube Extension for Azure DevOps (devops平台扩展插件) ● Ant - SonarScanner for Ant ● anything else (CLI) - SonarScanner(更加通用的扫描命令行)
/data/sonar-scanner-4.6.2.2472-linux/conf是scanner的配置文件,用于连接服务器端
root@jeekins sonar-scanner-4.6.2.2472-linux]# cat conf/sonar-scanner.properties #Configure here general information about the environment, such as SonarQube server connection details for example #No information about specific project should appear here #----- Default SonarQube server #sonar.host.url=http://localhost:9000 #----- Default source code encoding #sonar.sourceEncoding=UTF-8
使用更加灵活的命令行工具进行扫描, 可以在不更改项目配置的前提下进行代码扫描:
## 进入实验目录 cd /data/ ## 下载包 wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip ## 解压(JDK) tar zxf sonar-scanner-xxxx.tar.gz unzip sonar-scanner-cli-4.6.2.2472-linux.zip ## 设置环境变量 vim /etc/profile export SONAR_SCANNER_HOME=/data/sonar-scanner-4.6.2.2472-linux export PATH=$SONAR_SCANNER_HOME/bin:$PATH source /etc/profile ## 测试生效 [root@zeyang-nuc-service sonar-scanner-4.6.2.2472-linux]# sonar-scanner -v INFO: Scanner configuration file: /data/cicd2/buildtools/sonar-scanner-4.6.2.2472-linux/conf/sonar-scanner.properties INFO: Project root configuration file: NONE INFO: SonarScanner 4.6.2.2472 INFO: Java 11.0.11 AdoptOpenJDK (64-bit) INFO: Linux 4.18.0-80.el8.x86_64 amd64
这里请注意JDK版本的问题, 默认安装的sonarscanner是使用自带的jdk。通过上面的显示可以发现是jdk1.11版本, 如果想使用系统默认的jdk版本,可以修改scanner可执行程序的配置。如下所示:
[root@zeyang-nuc-service sonar-scanner-4.6.0.2311-linux]# vi bin/sonar-scanner [root@zeyang-nuc-service sonar-scanner-4.6.0.2311-linux]# ### 编辑约第42行, true改成false 42 use_embedded_jre=false ### 更改后,再次验证,发现变成了系统jdk版本。 更改生效。 [root@zeyang-nuc-service sonar-scanner-4.6.0.2311-linux]# sonar-scanner -v INFO: Scanner configuration file: /usr/local/sonar-scanner-4.6.0.2311-linux/conf/sonar-scanner.properties INFO: Project root configuration file: NONE INFO: SonarScanner 4.6.0.2311 INFO: Java 1.8.0_282 AdoptOpenJDK (64-bit) INFO: Linux 4.18.0-80.el8.x86_64 amd64
SonarScanner使用方法
代码扫描过程: 本地(构建节点)安装配置SonarScanner环境,然后通过设置sonar的一系列参数进行扫描分析。
- 配置文件方式读取扫描参数
- 命令行方式读取扫描参数
一个基本的sonar-project.properties配置文件的参数:
# 定义唯一的关键字 sonar.projectKey=devops-hello-service # 定义项目名称 sonar.projectName=devops-hello-service # 定义项目的版本信息 sonar.projectVersion=1.0 # 指定扫描代码的目录位置(多个逗号分隔) sonar.sources=. # 执行项目编码 sonar.sourceEncoding=UTF-8 # 指定sonar Server sonar.host.url= # 认证信息 sonar.login sonar.password
这些配置项都是统一的,目前sonar支持将扫描参数以文件的方式存放或者以命令行传参的方式读取。 文件方式:可以将扫描参数放到项目的根目录或者sonar-scanner的配置文件目录等自定义的目录中, 命令行传参则可以直接将变量传递给sonarsacnner cli -Dsonar.projectKey=xxx
# 指定配置文件 sonar-scanner -Dproject.settings=myproject.properties # 命令行传参 sonar-scanner -Dsonar.projectKey=myproject -Dsonar.sources=src1
以扫描java项目为例子,配置文件的方式:
[root@jeekins demo-maven]# cat demo-mave.conf # 定义唯一的关键字 sonar.projectKey=demo-mave # 定义项目名称 sonar.projectName=demo-mave # 定义项目的版本信息 sonar.projectVersion=1.0 # 指定扫描代码的目录位置(多个逗号分隔) sonar.sources=./demo/src # 执行项目编码 sonar.sourceEncoding=UTF-8 # 指定sonar Server sonar.host.url=http://192.168.1.110:9000 # 认证信息 sonar.login=admin sonar.password=admin123 #java指定类目录 //java项目必须指定 sonar.java.binaries=./demo/target/classes/
[root@jeekins demo-maven]# sonar-scanner -Dproject.settings=demo-mave.conf INFO: Scanner configuration file: /data/sonar-scanner-4.6.2.2472-linux/conf/sonar-scanner.properties 默认配置文件 INFO: Project root configuration file: /data/demo-maven/demo-mave.conf 项目配置文件
INFO: SonarScanner 4.6.2.2472
INFO: Java 1.8.0_221 Oracle Corporation (64-bit)
INFO: Linux 5.4.131-1.el7.elrepo.x86_64 amd64
INFO: User cache: /root/.sonar/cache
INFO: Scanner configuration file: /data/sonar-scanner-4.6.2.2472-linux/conf/sonar-scanner.properties
INFO: Project root configuration file: /data/demo-maven/demo-mave.conf
INFO: Analyzing on SonarQube server 8.9.0
INFO: Default locale: "zh_CN", source code encoding: "UTF-8"
要是sonarqube 9.x的版本需要使用java11
WARN: SonarScanner will require Java 11 to run, starting in SonarQube 9.x
工作目录存着一些扫描的信息 INFO: Working dir: /data/demo-maven/.scannerwork
可以看到报告信息
[root@jeekins demo-maven]# cat /data/demo-maven/.scannerwork/report-task.txt projectKey=demo-mave serverUrl=http://192.168.1.110:9000 serverVersion=8.9.0.43852 dashboardUrl=http://192.168.1.110:9000/dashboard?id=demo-mave ceTaskId=AXx0MEtVvrv455TJ-id_ ceTaskUrl=http://192.168.1.110:9000/api/ce/task?id=AXx0MEtVvrv455TJ-id_
扫描成功后就可以在sonarqube-web上查看scanner扫描到的信息
扩展-Docker运行sonarscanner
docker run \ --rm \ -e SONAR_HOST_URL="http://${SONARQUBE_URL}" \ -e SONAR_LOGIN="myAuthenticationToken" \ -v "${YOUR_REPO}:/usr/src" \ sonarsource/sonar-scanner-cli
关于项目参数可以参考:https://docs.sonarqube.org/latest/analysis/analysis-parameters/
各种语言的扫描示例:https://docs.sonarqube.org/latest/analysis/languages/
sonarqube老版本需要手动安装代码插件
SonarQube中各种语言的扫描规则都是以jar包的方式。在SonarQube8.9.0之前版本,默认没有安装语言规则插件, 需要手动安装。 服务端安装Java Code Quality and Security
SonarJS SonarGO
插件,并重启服务器。(如果这里由于网速原因下载不了插件,可以使用课程提供的压缩包,解压到downloads目录下然后重启sonarqube)
如果低于该版本,可以参考如下操作。(可选,跳过)
[root@zeyang-nuc-service ~]# cd /data/cicd/plugin-sonar/ [root@zeyang-nuc-service plugin-sonar]# ls sonar-go-plugin-1.6.0.719.jar sonar-l10n-zh-plugin-1.29.jar sonar-java-plugin-6.3.2.22818.jar sonar-typescript-plugin-2.1.0.4359.jar sonar-javascript-plugin-6.2.2.13315.jar [root@zeyang-nuc-service plugin-sonar]# cp sonar-go-plugin-1.6.0.719.jar sonar-java-plugin-6.3.2.22818.jar sonar-javascript-plugin-6.2.2.13315.jar sonar-typescript-plugin-2.1.0.4359.jar /data/cicd/sonarqube/sonarqube_extensions/downloads/ [root@zeyang-nuc-service plugin-sonar]# ls /data/cicd/sonarqube/sonarqube_extensions/downloads/ sonar-go-plugin-1.6.0.719.jar sonar-javascript-plugin-6.2.2.13315.jar sonar-java-plugin-6.3.2.22818.jar sonar-typescript-plugin-2.1.0.4359.jar [root@zeyang-nuc-service plugin-sonar]# chmod +x /data/cicd/sonarqube/sonarqube_extensions/downloads/* [root@zeyang-nuc-service plugin-sonar]# ls /data/cicd/sonarqube/sonarqube_extensions/downloads/ sonar-go-plugin-1.6.0.719.jar sonar-javascript-plugin-6.2.2.13315.jar sonar-java-plugin-6.3.2.22818.jar sonar-typescript-plugin-2.1.0.4359.jar [root@zeyang-nuc-service plugin-sonar]# docker restart sonarqube sonarqube
Java项目扫描
sonarqube服务器端需要安装Java语言规则插件
sonar.projectKey
指定项目的关键字,sonar.host.url
指定服务器地址(可以直接在配置文件中写死),projectName
指定项目的名称, projectVersion
指定项目的版本(可以用构建时间和构建ID定义),login
指定登录用户名,password
指定登录用户密码, projectDescription
指定项目的描述信息, links.homepage
指定项目的主页(超链接), sources
指定扫描的目录, sourceEncoding
指定扫描时的编码, java.binaries
指定编译后的类文件目录(必填), java.test.binaries
指定编译后的测试类目录,java.surefire.report
指定测试报告目录。
传参数的方式:
sonar-scanner -Dsonar.host.url=http://192.168.1.110:9000 \ //sonarqube的地址 -Dsonar.projectKey=devops-maven-service \ -Dsonar.projectName=devops-maven-service \ -Dsonar.projectVersion=1.1 \ -Dsonar.login=admin \ -Dsonar.password=admin123 \ -Dsonar.ws.timeout=30 \ -Dsonar.projectDescription="my first project!" \ //项目的描述信息 -Dsonar.links.homepage=http://192.168.1.110:9080/demo/demo-maven \ //gitlab项目的主页 -Dsonar.links.ci=http://192.168.1.110:8080/job/demo/job/demo-maven/ \ //jenkins地址 -Dsonar.sources=src \ //扫描的代码目录 -Dsonar.sourceEncoding=UTF-8 \ -Dsonar.java.binaries=target/classes \ //java的类目录 -Dsonar.java.test.binaries=target/test-classes \ //java的类单元测试目录 -Dsonar.java.surefire.report=target/surefire-reports
Web前端项目扫描
好多参数都是通用的
sonar-scanner \ -Dsonar.projectKey=demo-devops-ui \ -Dsonar.projectName=demo-devops-ui \ -Dsonar.sources=src \ -Dsonar.host.url=http://192.168.1.110:9000 \ -Dsonar.login=0809881d71f2b06b64786ae3f81a9acf22078e8b \ -Dsonar.projectVersion=2.0 \ -Dsonar.ws.timeout=30 \ -Dsonar.projectDescription="my first project!" \ -Dsonar.links.homepage=http://192.168.1.110/devops/devops-maven-service \ -Dsonar.links.ci=http://192.168.1.110:8080/job/demo-pipeline-service/ \ -Dsonar.sourceEncoding=UTF-8
Golang项目扫描
sonar-scanner -Dsonar.projectKey=devops-golang-service \ -Dsonar.projectName=devops-golang-service \ -Dsonar.sources=src \ -Dsonar.login=admin \ -Dsonar.password=admin123 \ -Dsonar.host.url=http://192.168.1.110:9000 ## 有测试用例的情况 sonar.exclusions=**/*_test.go sonar.tests=. sonar.test.inclusions=**/*_test.go

评论