Docker搭建SonarQube代码质量检查平台

SonarQube是一个用于持续检查代码质量的开源平台

Docker搭建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链接

快速参考

什么是SonarQube?

SonarQube是一种用于持续检查代码质量的开源产品。

商标

Docker镜像包含SonarQube的Community Edition。

运行SonarQube

服务器以这种方式启动:

$ 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

要分析其他类型的项目,有关详细信息,请参阅分析源代码文档

高级配置

选项1:数据库配置

默认情况下,映像将使用不适合生产的嵌入式H2数据库。

生产数据库被配置成与作为环境变量以下SonarQube属性:sonar.jdbc.usernamesonar.jdbc.passwordsonar.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_USERNAMESONARQUBE_JDBC_PASSWORD并且SONARQUBE_JDBC_URL已弃用,并将在将来的版本中停止工作。

这里可以找到更多资料。

选项2:通过Docker环境变量使用参数

您可以将sonar.配置属性作为Docker环境变量传递,如上面的示例所示,用于数据库配置。

选项3:使用绑定挂载的持久卷

图像包含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

选项4:自定义图像

在某些环境中,准备包含配置的自定义映像可能更有意义。A Dockerfile实现这一点可能很简单:

FROM sonarqube:7.4-community
COPY sonar.properties /opt/sonarqube/conf/

然后,您可以使用以下内容构建和尝试图像:

$ docker build --tag=sonarqube-custom .
$ docker run -ti sonarqube-custom

管理

管理指南可以在这里找到。

License

查看此映像中包含的软件的许可证信息

与所有Docker映像一样,这些映像也可能包含其他许可证(例如来自基本分发版的Bash等,以及所包含的主要软件的任何直接或间接依赖关系)。

这是能够自动检测一些额外的许可信息可能中找到repo-info版本库的sonarqube/目录

对于任何预先构建的图像使用,图像用户有责任确保对此图像的任何使用都符合其中包含的所有软件的任何相关许可。

SonarQube 能检测如下问题

➢ 糟糕的复杂度分布:文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们,且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试

➢ 重复:显然程序中包含大量复制粘贴的代码是质量低下的,sonar 可以展示源码中重复严重的地方

➢ 缺乏单元测试:sonar 可以很方便地统计并展示单元测试覆盖率

➢ 没有代码标准:sonar 可以通过 PMD、CheckStyle、Findbugs 等等代码规则检测工具规范代码编写

➢ 没有足够的或者过多的注释:没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降。而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷

➢ 潜在的 bug:sonar 可以通过 PMD、CheckStyle、Findbugs 等等代码规则检测工具检测出潜在的 bug

参考来源:https://hub.docker.com/_/sonarqube/

猜你喜欢

转载自blog.csdn.net/Aria_Miazzy/article/details/85344917