简介

​ Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从多个维度检测代码质量通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测

糟糕的复杂度分布

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

重复

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

缺乏单元测试

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

没有代码标准

​ sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写

没有足够的或者过多的注释

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

潜在的bug

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

糟糕的设计

通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系
可以检测自定义的架构规则
通过sonar可以管理第三方的jar包
可以利用LCOM4检测单个任务规则的应用情况
检测耦合

安装

pg.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  replicas: 1
  template:
    metadata:
      name: postgres
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:10
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 5432
        env:
          - name: POSTGRES_USER
            value: sonar
          - name: POSTGRES_PASSWORD
            value: sonar
        volumeMounts:
          - mountPath: /var/lib/postgresql/data
            name: postgres-data
      restartPolicy: Always
      volumes:
        - name: postgres-data
          emptyDir: {}
  selector:
    matchLabels:
      app: postgres
---
apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  selector:
    app: postgres
  ports:
  - port: 5432

sonar.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sonar
  labels:
    app: sonar
spec:
  replicas: 1
  template:
    metadata:
      name: sonar
      labels:
        app: sonar
    spec:
      containers:
      - name: sonar
        image: sonarqube:latest
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 9000
        env:
          - name: SONARQUBE_JDBC_USERNAME
            value: sonar
          - name: SONARQUBE_JDBC_PASSWORD
            value: sonar
          - name: SONARQUBE_JDBC_URL
            value: jdbc:postgresql://postgres:5432/sonar
      restartPolicy: Always
  selector:
    matchLabels:
      app: sonar
---
apiVersion: v1
kind: Service
metadata:
  name: sonar
spec:
  selector:
    app: sonar
  ports:
  - port: 9000
  type: NodePort

使用方式(java项目)

在项目根目录下创建: sonar-project.properties

sonar.projectKey=product-service
sonar.projectName=product-service
sonar.projectVersion=v1
sonar.sources=./jwell-product-service-provider/,./jwell-product-service-api/

如果是多模块项目,则使用此模式:

sonar.projectKey=product-service
sonar.projectName=product-service
sonar.projectVersion=v1
sonar.modules=provider

java-module.sonar.projectName=provider
java-module.sonar.language=java
java-module.sonar.sources=./jwell-product-service-provider/
java-module.sonar.projectBaseDir=src
sonar.binaries=classes

在项目的pom.xml文件夹下运行

mvn sonar:sonar \
  -Dsonar.host.url=http://10.0.60.28:32620 \
  -Dsonar.login=bfc62d2312cf6dab1672c62d0ec3314ef2481cbd \
  -Dsonar.java.binaries=target/sonar

查看分析结果

使用浏览器打开 http://10.0.60.28:32620

管理sonarqube-server

账号:admin
密码:admin