SonarQube是一个用于持续检查代码质量的开源平台
version: '3'
services:
mydb:
image: postgres:11
volumes:
- ./data:/var/lib/postgresql/data
environment:
POSTGRES_USER: sonar
POSTGRES_DB: sonar
POSTGRES_PASSWORD: sonar
ports:
- "5433:5432"
restart:
always
sonarqube:
image: sonarqube
environment:
sonar.jdbc.username: sonar
sonar.jdbc.password: sonar
sonar.jdbc.url: jdbc:postgresql://mydb:5432/sonar
ports:
- "9823:9000"
restart:
always
networks:
postgresnetwork001:
driver: 'local'
PS:创建一个sonarqube目录,进入目录,保存上面代码为docker-compose.yml,然后执行shell脚本 docker-compose up,初次执行可能会下载镜像,请耐心等待!
执行成功示例如下:
MacdeMacBook-Pro:sonarqube mac$ docker-compose up
WARNING: Some networks were defined but are not used by any service: postgresnetwork001
Creating network "sonarqube_default" with the default driver
Creating sonarqube_sonarqube_1 ... done
Creating sonarqube_mydb_1 ... done
Attaching to sonarqube_mydb_1, sonarqube_sonarqube_1
sonarqube_1 | 2018.12.29 12:56:59 INFO app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /opt/sonarqube/temp
sonarqube_1 | 2018.12.29 12:56:59 INFO app[][o.s.a.es.EsSettings] Elasticsearch listening on /127.0.0.1:9001
sonarqube_1 | 2018.12.29 12:57:00 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='es', ipcIndex=1, logFilenamePrefix=es]] from [/opt/sonarqube/elasticsearch]: /opt/sonarqube/elasticsearch/bin/elasticsearch -Epath.conf=/opt/sonarqube/temp/conf/es
sonarqube_1 | 2018.12.29 12:57:00 INFO app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running
sonarqube_1 | 2018.12.29 12:57:02 INFO app[][o.e.p.PluginsService] no modules loaded
sonarqube_1 | 2018.12.29 12:57:02 INFO app[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin]
mydb_1 | 2018-12-29 12:57:07.566 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
mydb_1 | 2018-12-29 12:57:07.566 UTC [1] LOG: listening on IPv6 address "::", port 5432
mydb_1 | 2018-12-29 12:57:07.590 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
mydb_1 | 2018-12-29 12:57:07.956 UTC [25] LOG: database system was shut down at 2018-12-29 12:56:48 UTC
mydb_1 | 2018-12-29 12:57:08.048 UTC [1] LOG: database system is ready to accept connections
sonarqube_1 | 2018.12.29 12:57:21 INFO app[][o.s.a.SchedulerImpl] Process[es] is up
sonarqube_1 | 2018.12.29 12:57:21 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='web', ipcIndex=2, logFilenamePrefix=web]] from [/opt/sonarqube]: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/opt/sonarqube/temp -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom -cp ./lib/common/*:/opt/sonarqube/lib/jdbc/postgresql/postgresql-42.2.5.jar org.sonar.server.app.WebServer /opt/sonarqube/temp/sq-process8201383381839842178properties
sonarqube_1 | 2018.12.29 12:57:23 INFO web[][o.s.p.ProcessEntryPoint] Starting web
sonarqube_1 | 2018.12.29 12:57:25 INFO web[][o.a.t.u.n.NioSelectorPool] Using a shared selector for servlet write/read
sonarqube_1 | 2018.12.29 12:57:26 INFO web[][o.s.c.e.CoreExtensionsLoader] Loaded core extensions:
sonarqube_1 | 2018.12.29 12:57:27 INFO web[][o.e.p.PluginsService] no modules loaded
sonarqube_1 | 2018.12.29 12:57:27 INFO web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.join.ParentJoinPlugin]
sonarqube_1 | 2018.12.29 12:57:27 INFO web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
sonarqube_1 | 2018.12.29 12:57:27 INFO web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin]
sonarqube_1 | 2018.12.29 12:57:31 INFO web[][o.s.s.e.EsClientProvider] Connected to local Elasticsearch: [127.0.0.1:9001]
sonarqube_1 | 2018.12.29 12:57:31 INFO web[][o.s.s.p.LogServerVersion] SonarQube Server / 7.4.0.18908 / a4d0983e8057356b19996995343296311fbcc2ed
sonarqube_1 | 2018.12.29 12:57:31 INFO web[][o.sonar.db.Database] Create JDBC data source for jdbc:postgresql://mydb:5432/sonar
sonarqube_1 | 2018.12.29 12:57:34 INFO web[][o.s.s.p.ServerFileSystemImpl] SonarQube home: /opt/sonarqube
sonarqube_1 | 2018.12.29 12:57:34 INFO web[][o.s.s.u.SystemPasscodeImpl] System authentication by passcode is disabled
sonarqube_1 | 2018.12.29 12:57:35 INFO web[][o.s.s.p.d.m.h.MigrationHistoryTableImpl] Creating table schema_migrations
sonarqube_1 | 2018.12.29 12:57:35 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin Git / 1.6.0.1349 / 5324aafc7d16337ca792fec35903d0d313c9e2c7
sonarqube_1 | 2018.12.29 12:57:35 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin JaCoCo / 1.0.1.143 / 65c55e41e32c114704fd597ccea91fc55becb4ec
sonarqube_1 | 2018.12.29 12:57:35 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin LDAP / 2.2.0.608 / 79dc3fa4393a29667673c70182f3016288b548b7
sonarqube_1 | 2018.12.29 12:57:35 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarC# / 7.7.0.7192 / c46d44cdae6e75538626f380fe3fa7553e6cf93d
sonarqube_1 | 2018.12.29 12:57:35 INFO web[][o.s.s.p.ServerPluginRepository] Deploy plugin SonarCSS / 1.0.2.611 / 8db5e31b2e21ff683da69668ec577c7a026acf23
登录质量检查平台 http://127.0.0.1:9823 默认账户:admin/admin
Create New Project
在你的maven项目里,执行:
mvn sonar:sonar \
-Dsonar.host.url=http://127.0.0.1:9823 \
-Dsonar.login=b291a9e2da54ae906616e8e81eebc4fdea1e54c1
示例:
本地Maven处理完毕:
访问地址:http://127.0.0.1:9823/api/ce/task?id=AWf6F55wMScHXMBRS0oX,得到如下信息:
{"task":{"id":"AWf6F55wMScHXMBRS0oX","type":"REPORT","componentId":"AWf6F5nvMScHXMBRS0oR","componentKey":"com.lxinet:jeesns","componentName":"jeesns","componentQualifier":"TRK","status":"IN_PROGRESS","submittedAt":"2018-12-29T13:11:52+0000","submitterLogin":"admin","startedAt":"2018-12-29T13:11:52+0000","executionTimeMs":101134,"logs":false,"organization":"default-organization","warnings":[]}}
分析结果:
查看问题:
右侧编辑面板,标识 1号 、2号代码位置。
显然1号先执行了 findMember.getId() ,此处已经默认findMember不为空了,2号位置又执行了判断 findMember == null 。
毫无印象,这个 findMember == null 是永远不会执行的,因为即使为空,也在1号位置代码出报错了。
查看问题:
这次代码也标识出了问题,如果在2号代码位置抛出异常,那么4号位置代码就是null,因为1号代码处赋值为null,所以4号代码应该为2号代码下,try catch 语句块内,而不是try catch语句块外面。
PS:这个代码质量检查平台是不是非常强大!!!
Dockerfile
链接6.7.6-community
,6.7-community
,lts
(6.7.6社区/ Dockerfile)7.4-community
,latest
(7.4-community / Dockerfile)
哪里寻求帮助:
在SonarSource社区论坛,在Docker社区论坛,在DockerSlack社区,或Stackoverflow
凡到文件的问题:
https://github.com/SonarSource/docker-sonarqube/
维护者:
SonarSource
支持的架构 :( 更多信息)amd64
已发布的图像工件详细信息:
repo-info repo的repos/sonarqube/
目录(历史记录)
(图像元数据,传输大小等)
图片更新:
官方图片PR带有标签library/sonarqube
官方图片repo的library/sonarqube
文件(历史)
此描述的来源:
docs repo的sonarqube/
目录(历史)
支持的Docker版本:
最新版本(尽力降至1.6)
SonarQube是一种用于持续检查代码质量的开源产品。
此Docker镜像包含SonarQube的Community Edition。
服务器以这种方式启动:
$ docker run -d --name sonarqube -p 9000:9000 sonarqube
默认情况下,您可以admin
使用密码登录admin
,请参阅身份验证文档。
分析Maven项目:
# On Linux:
mvn sonar:sonar
# With boot2docker:
mvn sonar:sonar -Dsonar.host.url=http://$(boot2docker ip):9000
要分析其他类型的项目,有关详细信息,请参阅分析源代码文档。
默认情况下,映像将使用不适合生产的嵌入式H2数据库。
生产数据库被配置成与作为环境变量以下SonarQube属性:sonar.jdbc.username
,sonar.jdbc.password
和sonar.jdbc.url
。
$ docker run -d --name sonarqube \
-p 9000:9000 \
-e sonar.jdbc.username=sonar \
-e sonar.jdbc.password=sonar \
-e sonar.jdbc.url=jdbc:postgresql://localhost/sonar \
sonarqube
PS:请注意请保证事先您已经在生成环境上部署了postgresql,此处的username,password,localhost要改成生成环境上对应账户、密码、数据库IP
使用环境变量SONARQUBE_JDBC_USERNAME
,SONARQUBE_JDBC_PASSWORD
并且SONARQUBE_JDBC_URL
已弃用,并将在将来的版本中停止工作。
这里可以找到更多资料。
您可以将sonar.
配置属性作为Docker环境变量传递,如上面的示例所示,用于数据库配置。
图像包含SonarQube安装位置/opt/sonarqube
。您可以使用绑定挂载的持久卷来覆盖选定的文件或目录,例如:
sonarqube_conf:/opt/sonarqube/conf
:配置文件,如 sonar.properties
sonarqube_data:/opt/sonarqube/data
:数据文件,例如嵌入式H2数据库和Elasticsearch索引sonarqube_logs:/opt/sonarqube/logs
sonarqube_extensions:/opt/sonarqube/extensions
:插件,如语言分析器您还可以使用命令行中指定的绑定挂载配置,例如:
$ docker run -d --name sonarqube \
-p 9000:9000 \
-v /path/to/conf:/opt/sonarqube/conf \
-v /path/to/data:/opt/sonarqube/data \
-v /path/to/logs:/opt/sonarqube/logs \
-v /path/to/extensions:/opt/sonarqube/extensions \
sonarqube
在某些环境中,准备包含配置的自定义映像可能更有意义。A Dockerfile
实现这一点可能很简单:
FROM sonarqube:7.4-community
COPY sonar.properties /opt/sonarqube/conf/
然后,您可以使用以下内容构建和尝试图像:
$ docker build --tag=sonarqube-custom .
$ docker run -ti sonarqube-custom
管理指南可以在这里找到。
查看此映像中包含的软件的许可证信息。
与所有Docker映像一样,这些映像也可能包含其他许可证(例如来自基本分发版的Bash等,以及所包含的主要软件的任何直接或间接依赖关系)。
这是能够自动检测一些额外的许可信息可能中找到的repo-info
版本库的sonarqube/
目录。
对于任何预先构建的图像使用,图像用户有责任确保对此图像的任何使用都符合其中包含的所有软件的任何相关许可。
➢ 糟糕的复杂度分布:文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们,且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试
➢ 重复:显然程序中包含大量复制粘贴的代码是质量低下的,sonar 可以展示源码中重复严重的地方
➢ 缺乏单元测试:sonar 可以很方便地统计并展示单元测试覆盖率
➢ 没有代码标准:sonar 可以通过 PMD、CheckStyle、Findbugs 等等代码规则检测工具规范代码编写
➢ 没有足够的或者过多的注释:没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降。而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷
➢ 潜在的 bug:sonar 可以通过 PMD、CheckStyle、Findbugs 等等代码规则检测工具检测出潜在的 bug
。
参考来源:https://hub.docker.com/_/sonarqube/