Sonarqube配置指南

本文档介绍了以下内容,主要是Sonarqube docker的部署和各语言的代码分析配置(包括本地环境和Azure线上环境):

  • Sonarqube docker 版本的安装配置
  • java Maven环境安装与代码分析(Windows)-
  • IntelliJ IDEA 集成Sonarqube代码分析
  • 在Maven pom文件中集成Sonarqube代码分析,并在IntelliJ IDEA 构建时执行分析
  • C# (或者VB.Net) 代码分析执行与配置(Windows,net core global dotnet-sonarscanner)
  • Python (其他语言,如JS、TS、GO、PHP) 代码分析执行与配置(Windows)

总体来说,Sonarqube代码分析执行方式分为三种

  • 与IDE集成,通常需要IDE插件(如 IntelliJ IDEA的SonarLite),一般不会上传分析报告至Sonarqube服务器,适用于开发人员日常场景。
  • 使用命令行执行,通常是用于与流水线集成,参数可以通过命令行传递,或者是通过xml配置文件(sonar-project.properties),适用于所有语言,这种方式需要结合Sonar提供的命令行工具使用
  • 与构建工具集成,如Java Maven和Net中的msbuild/dotnet core, 可以结合IDE和命令行来触发,也可以通过命令行来触发,需要结合Sonar提供的命令行工具或插件使用。

Sonarqube 使用流程 image.png

Sonarqube 结构 image.png

安装和配置

sona 需要的最大虚拟内存为 262144

  1. # 查看最大虚拟内存
  2. sysctl -a|grep vm.max_map_count
  3. # 如果小于 262144,请执行如下命令
  4. sudo sysctl -w vm.max_map_count=262144

image.png

  • 将以下yml脚本复制保存为文件:docker-compose-sonarqube.yml
  1. version: "2"
  2. services:
  3. sonarqube:
  4. image: sonarqube:8.9.1-community
  5. ports:
  6. - "9000:9000"
  7. networks:
  8. - sonarnet
  9. environment:
  10. - sonar.jdbc.username=sonar
  11. - sonar.jdbc.password=sonar
  12. - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar
  13. - SONARQUBE_JDBC_USERNAME=sonar
  14. - SONARQUBE_JDBC_PASSWORD=sonar
  15. - SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar
  16. volumes:
  17. - sonarqube_conf:/opt/sonarqube/conf
  18. - sonarqube_data:/opt/sonarqube/data
  19. - sonarqube_extensions:/opt/sonarqube/extensions
  20. - sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins
  21. db:
  22. image: postgres
  23. networks:
  24. - sonarnet
  25. environment:
  26. - POSTGRES_USER=sonar
  27. - POSTGRES_PASSWORD=sonar
  28. volumes:
  29. - postgresql:/var/lib/postgresql
  30. - postgresql_data:/var/lib/postgresql/data
  31. networks:
  32. sonarnet:
  33. driver: bridge
  34. volumes:
  35. sonarqube_conf:
  36. sonarqube_data:
  37. sonarqube_extensions:
  38. sonarqube_bundled-plugins:
  39. postgresql:
  40. postgresql_data:
  • 运行命令 docker-compose -f docker-compose-sonarqube.yml up -d

  • 确保 sonarqube镜像和postgres镜像 拉取成功,如果在国内环境有可能需要挂代理或VPN。 image.png

  • 命令运行成功后,运行docker ps查看容器,确保容器处于运行状态 image.png
  • 使用浏览器打开地址:http://IP:9000/,访问SonarQube站点

  • 使用admin/admin登陆 image.png

  • 添加中文语言支持,安装完成后请点击重新服务 image.png
  • 创建分析项目(以Java为示例) image.png
  • 接下来需要配置Maven环境,执行代码分析

java Maven环境安装与代码分析(Windows)

  • 安装JDK,需1.7以上
  • 下载 Maven image.png
  • 添加 MAVEN_HOME 环境变量,添加值 %MAVEN_HOME %\bin 到Path 环境变量
  • 运行 mvn以测试mvn安装是否成功 image.png

  • 运行cmd,进入java项目目录,根据上一章节中创建的Sonarqube 项目后显示的mvm命令,执行代码分析,类似如下命令: image.png

    1. mvn sonar:sonar -Dsonar.projectKey=demo -Dsonar.host.url=http://localhost:9000 -Dsonar.login=2c505c949f51b0a00f05fdcae8419600cadf97e8
  • 执行以上命令后,会自动下载jar,等待下载完成 image.png

  • 如果是国内的网络环境,下载过程中可能会失败,失败时,重新执行上面的命令即可 image.png
  • 正常执行代码分析时,如下图: image.png ······ image.png
  • 分析完成,打开Sonarqube站点,可以看到扫瞄结果 image.png

C# (或者VB.Net) 代码分析执行与配置(Windows,net core global dotnet-sonarscanner)

  • 在Sonarqube中创建一个项目

image.png

  • 根据上面的提示,下载和配置 SonarScanner.MSBuild,并添加执行程序所在目录到系统环境变量Path中。

  • 安装 执行命令 dotnet tool install --global dotnet-sonarscanner --version 4.8.0 ,global dotnet-sonarscanner image.png

  • 打开源码目录执行以下命令: dotnet-sonarscanner begin /k:"csharp-demo" /d:sonar.host.url="http://localhost:9000" /d:sonar.login="fd4bc37aeb5d851fef9585e0edbefb236b832935"

image.png

  • 然后执行以下命令

dotnet build /t:Rebuild

image.png

  • 最后执行以下命令:

dotnet-sonarscanner end /d:sonar.login="fd4bc37aeb5d851fef9585e0edbefb236b832935"

image.png

image.png

Python (其他语言,如JS、TS、GO、PHP) 代码分析执行与配置(Windows)

  • 创建Sonarqube项目,选择Python语言,根据向导下载配置扫描器

image.png

  • 确保添加好分析器所在路径到环境变量Path后,运行命令进行测试 image.png

  • 运行命令执行分析(命令来自于上一步创建的项目向导):

sonar-scanner.bat -D"sonar.projectKey=python-demo" -D"sonar.sources=." -D"sonar.host.url=http://localhost:9000" -D"sonar.login=e2a3a351ed96f3dd643ae9ff0a96de304bb96928"

  • 还可以通过使用配置文件:sonar-project.properties,保存上面命令行参数的方式来触发代码分析。

进入源码 目录,执行 sonar-scanner 命令即可

  1. #host url
  2. sonar.host.url=http://localhost:9000
  3. #login key
  4. sonar.login=e2a3a351ed96f3dd643ae9ff0a96de304bb96928
  5. #project key
  6. sonar.projectKey=python-demo
  7. #project name
  8. sonar.projectName=python-demo
  9. #project version
  10. sonar.projectVersion=1.0.0
  11. #analysis dir
  12. sonar.sources=.
  13. # Language
  14. sonar.language=python
  15. sonar.java.binaries=.
  16. sonar.sourceEncoding=UTF-8

IntelliJ IDEA 集成Sonarqube代码分析

  • 打开 IntelliJ IDEA File -> Setting 插件设置页面,搜索 SonarLint ,安装 此插件 image.png

  • 如果无法在线安装可从这里下载,再手动安装 image.png

  • IntelliJ IDEA SonarLint 插件 配置

image.png

image.png

image.png

  • 配置好插件,打开 SonarLint,可以对当前打开的文件进行时时分析,并显示结果,如下图 image.png
  • 也可针对 整个项目进行分析 image.png

image.png

  • 也可以右键某个代码文件或某一个目录,从上下文菜单中触发此文件的分析,分析结果可在Report Tab窗口查看。 image.png

在Maven pom文件中集成Sonarqube代码分析,并在IntelliJ IDEA 构建时执行分析

  • 打开pom文件,在build.plugins添加以下子节点
  1. <plugin>
  2. <groupId>org.sonarsource.scanner.maven</groupId>
  3. <artifactId>sonar-maven-plugin</artifactId>
  4. <version>3.6.0.1398</version>
  5. </plugin>
  6. <plugin>
  7. <groupId>org.jacoco</groupId>
  8. <artifactId>jacoco-maven-plugin</artifactId>
  9. <version>0.8.4</version>
  10. </plugin>
  • 打开pom文件,在根节点project中添加以下子节点
  1. <profiles>
  2. <profile>
  3. <id>coverage</id>
  4. <activation>
  5. <activeByDefault>true</activeByDefault>
  6. </activation>
  7. <build>
  8. <plugins>
  9. <plugin>
  10. <groupId>org.jacoco</groupId>
  11. <artifactId>jacoco-maven-plugin</artifactId>
  12. <executions>
  13. <execution>
  14. <id>prepare-agent</id>
  15. <goals>
  16. <goal>prepare-agent</goal>
  17. </goals>
  18. </execution>
  19. <execution>
  20. <id>report</id>
  21. <goals>
  22. <goal>report</goal>
  23. </goals>
  24. </execution>
  25. </executions>
  26. </plugin>
  27. </plugins>
  28. </build>
  29. </profile>
  30. <profile>
  31. <id>sonar</id>
  32. <activation>
  33. <activeByDefault>true</activeByDefault>
  34. </activation>
  35. <!--以下属性请根据Sonarqube环境信息和maven项目修改-->
  36. <properties>
  37. <sonar.host.url>http://localhost:9000</sonar.host.url>
  38. <sonar.login>8f30470aedb60a542d69302e6628a2e7e4d8862d</sonar.login>
  39. <sonar.projectKey>BoatHouse-product-service</sonar.projectKey>
  40. <sonar.projectName>BoatHouse-product-service</sonar.projectName>
  41. <sonar.projectVersion>1.0.2</sonar.projectVersion>
  42. <sonar.sources>src/main</sonar.sources>
  43. <sonar.tests>src/test</sonar.tests>
  44. <sonar.language>java</sonar.language>
  45. <sonar.java.binaries>.</sonar.java.binaries>
  46. <sonar.sourceEncodin>UTF-8</sonar.sourceEncodin>
  47. </properties>
  48. </profile>
  49. </profiles>
  • 确保 IntelliJ IDEA 中Maven项目能编译成功,编译期间会自动下载依赖包,如果 因网络问题,失败后,再执行一次编译即可

image.png

  • 双击maven 的 sonar 插件(或者点击图片中所示绿色三角形的运行按扭),执行代码分析,分析完成后,会把分析报告自动上传至上前面配置的sonarqube项目中。打开右下角窗口中的第一个链接,即可查看报告

image.png

  • 也可以通过命令 mvn sonar:sonar 在IntelliJ IDEA 的Terminal窗口中执行

image.png image.png

Sonarqube线上环境配置

  • 通过ssh连接上linux服务器,确保已经安装 docker/docker compose
  • clone 代码库到本地:
  1. mkdir source
  2. git clone https://github.com/icdps/boat-house-devops.git
  • 进入tools/sonarqube目录,直接运行命令:docker-compose -f docker-compose-sonarqube.yml up -d
  • 确保 postgres 和 sonarqube 两个容器能运行起来 image.png
  • 如果未运行起来,运行docker-compose -f docker-compose-sonarqube.yml logs -d -ft查看日志,分析问题
  • 目前发现azure中的linux会有一个配置问题,在日志中会查到以下错误
    1. sonarqube_1 | 2020-02-11T01:28:21.354836464Z 2020.02.11 01:28:21 ERROR es[][o.e.b.Bootstrap] node validation exception
    2. sonarqube_1 | 2020-02-11T01:28:21.354839364Z [1] bootstrap checks failed
    3. sonarqube_1 | 2020-02-11T01:28:21.354841964Z [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
  • 如果出现以上错误,按下面的方法修复

临时解决办法:

  1. 修改参数:
  2. sudo sysctl -w vm.max_map_count=262144
  3. 查看修改好的参数:
  4. sudo sysctl -a|grep vm.max_map_count

永远生效的办法

  1. 1 切换到root用户修改配置sysctl.conf
  2. 2 执行:vi /etc/sysctl.conf
  3. 3 添加下面配置:vm.max_map_count=655360
  4. 4 并执行命令:sysctl -p
  • 成功运行后,运行 curl http://localhost:9000/ 以验证是否正常运行.

与流水线集成

可参考这个PR的文件变更:

https://github.com/idcf-boat-house/boat-house-frontend/pull/76/files