0.介绍
Sonar 是一款开源的代码分析工具,可能有很多人已经用过,本篇文章主要是讲解如何在 Docker 里面安装 Sonar 并且用其来分析 .Net Core 项目。
Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。
与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。
1.安装
安装的话,秉承一贯的懒人原则,在本篇文章当中是直接使用的 Sonar 的 Docker 镜像来进行安装配置的。
1.1 安装 Docker
安装 Docker-CE 的教程在我的这篇文章里面有讲到过,这里就不再多加赘述。
1.2 建立私有网络
执行以下命令:
docker network create sonar
将会创建一个 Docker 内部网络,名字为 sonar。
1.2 启动 PostgreSql 容器
使用以下命令拉取 PostgreSql 的镜像:
docker pull postgres
然后我们启动一个 PostgreSql 容器,名字叫做 sonar-db。
docker run -d --name sonar-db --network sonar -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar postgres
这里启动容器的时候指定了容器的网络是 sonar-db ,那么后面在 sonar 容器启动的时候加入这个网络即可,其余两个环境变量是用作 PostgreSql 数据库默认的账号密码。
1.3 启动 Sonar 容器
使用以下命令拉取 Sonar 镜像:
docker pull sonarqube
启动 Sonar 容器:
docker run -d --name sonar --network sonar -p 9000:9000 -p 9092:9092 -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL=jdbc:postgresql://sonar-db:5432/sonar sonarqube
至此,我们的 Sonar 已经部署完成了,访问你服务器或者本地 IP 的 9000 端口即可看到我们最终的效果。
注意:在这里我们没有针对这两个容器进行数据卷挂载,挂载可以参考下列 YML 文件进行自己的配置,推荐在实际生产环境部署的时候使用 Docker-Compose 来进行部署。
1.3:扩展:使用 Docker-Compose 来运行 Sonar
如果你每次都需要手动输入这么多命令,其实很麻烦的,在 Sonar 官方的 GitHub 上面有一个 docker-compose.yml 文件,你直接通过 Docker-Compose 就可以运行好环境的。
version: "2"services: sonarqube: image: sonarqube ports: - "9000:9000" networks: - sonarnet environment: - SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar volumes: - sonarqube_conf:/opt/sonarqube/conf - sonarqube_data:/opt/sonarqube/data - sonarqube_extensions:/opt/sonarqube/extensions - sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins db: image: postgres networks: - sonarnet environment: - POSTGRES_USER=sonar - POSTGRES_PASSWORD=sonar volumes: - postgresql:/var/lib/postgresql # This needs explicit mapping due to https://github.com/docker-library/postgres/blob/4e48e3228a30763913ece952c611e5e9b95c8759/Dockerfile.template#L52 - postgresql_data:/var/lib/postgresql/datanetworks: sonarnet: driver: bridgevolumes: sonarqube_conf: sonarqube_data: sonarqube_extensions: sonarqube_bundled-plugins: postgresql: postgresql_data:
将其保存到你的 Linux 服务器上,运行以下命令:
docker-compose up
如果需要重启的话则运行以下命令即可:
docker-compose restart sonarqube
1.4 新建项目
Sonar 镜像安装的默认管理员账号和密码都是 admin,直接输入进入到 Sonar 的项目管理界面。
步骤:
首先输入你的项目名称,生成一个 Token。
点击生成之后,点击 Continue ,这时候会提示你选择项目类型,并输入一个项目的唯一 Key,这里我还是输入的 TestProject。
点击 Done 之后右边会生成相关的 Scanner 执行步骤,你可以 Copy 下来。
2.分析
如果你需要分析项目的话,有两种选择,第一种就是使用工具1,而如果你是拥有 DotNet Core 2.1 环境的话可以使用 Global Tool 来直接安装分析器。
2.1 安装 dotnet scanner
参照 Sonar 官方的文档 ,运行命令行工具,并且键入以下命令:
dotnet tool install --global dotnet-sonarscanner --version 4.3.1
就成功安装好 Sonar Scanner 了。
2.2 分析项目
跳转到你需要分析的项目的根目录,这里我新建了一个测试用的控制台程序,代码很简单,传入了一个 NULL 对象,并且判断这个变量不等于空。
using System;namespace TestConsoleApp{ class Program { static void Main(string[] args) { string c = null; if (c != null) { Console.WriteLine("不可能执行的代码."); } Console.WriteLine("Hello World!"); } } }
在命令行工具当中分步执行以下命令:
dotnet sonarscanner begin /k:"TestProject" /d:sonar.host.url="http://192.168.100.107:9000" /d:sonar.login="cfe594fd605f2e4821835e43c69da82e489c2f23"dotnet builddotnet sonarscanner end /d:sonar.login="cfe594fd605f2e4821835e43c69da82e489c2f23"
这里的 /k 指定你的项目,/d 这些参数分别是你 Sonar 的地址与你刚才生成的 Token。
动图在这里:
2.3 查看结果
现在来到 Sonar 的站点就可以看到我们刚刚分析的结果啦。
可以看到说我有一个 BUG。
3.汉化
可能有的朋友需要中文界面,这个在 Sonar 社区里面提供了中文插件,地址如下 https://github.com/SonarQubeCommunity/sonar-l10n-zh。你可以根据你的 Sonar 版本来选择下载安装哪一个版本的插件,博主目前是基于 Sonar 的 7.1 镜像的,所以下载的是 1.21 版本。
下载完成之后,使用在之前运行容器的时候,加上 -v
参数,将容器目录 /opt/sonarqube/extensions/plugins
映射到你宿主机来,将你的这个文件拷贝到映射好的目录之下,然后重启 Sonar 容器即可。
如果你是使用的 Docker-Compose 文件来运行的容器,只需要找到相应的卷,比如说博主插件的数据卷目录在
/var/lib/docker/volumes/docker-ymls_sonarqube_extensions/_data
里面,我直接拷贝过去重启容器即可,大家的目录路径可能不一样,使用 docker volume ls
命令可以看到存在的数据卷,比如说我的:
DRIVER VOLUME NAMElocal 09d0144ebeb8fd9dc382bb14f33d35e156c6e7f29dcfa42ac52f2b82422fab98local 2c6c4d351a919c9550de94797ce77805fbe178c9226e71bf99c07c44fd303af1local c8b5b6cd301d4cea2e64866e12a9cf6a2bb4e257e5875449f62dede59ebc52c7local docker-ymls_postgresqllocal docker-ymls_postgresql_datalocal docker-ymls_sonarqube_bundled-pluginslocal docker-ymls_sonarqube_conflocal docker-ymls_sonarqube_datalocal docker-ymls_sonarqube_extensionslocal fd1127a3cec43dc992cbf0eefd053bd9dd8f3e93dc9fb0348c70048846f82308local portainer_data
可以看到插件目录是放在 docker-ymls_sonarqube_extensions 这个数据卷里面的。
汉化完成的界面如下:
4.结语
后面会分享如何与 Jenkins + Git(Gogs) 来进行集成的。