目录

  • 1、环境介绍
    • 1.1、kubernetes集群环境
    • 1.2、存储环境
    • 1.3、sonarqube版本
  • 2、部署sonarqube
    • 2.1、部署PostgreSQL
    • 2.2、部署SonarQube
    • 2.3、访问检查


SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。
Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。

Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题。

  1. 不遵循代码标准
    sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。

  2. 潜在的缺陷
    sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷。

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

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

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

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

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

1、环境介绍

1.1、kubernetes集群环境

[root@k8s-master-01 ~]# kubectl versionClient Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.3", GitCommit:"b3cbbae08ec52a7fc73d334838e18d17e8512749", GitTreeState:"clean", BuildDate:"2019-11-13T11:23:11Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.3", GitCommit:"b3cbbae08ec52a7fc73d334838e18d17e8512749", GitTreeState:"clean", BuildDate:"2019-11-13T11:13:49Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}[root@k8s-master-01 ~]# kubectl get nodesNAME            STATUS   ROLES    AGE    VERSIONk8s-master-01   Ready    master   5d5h   v1.16.3k8s-master-02   Ready    master   5d4h   v1.16.3k8s-master-03   Ready    master   5d4h   v1.16.3k8s-node-01     Ready    <none>   5d4h   v1.16.3k8s-node-02     Ready    <none>   5d4h   v1.16.3k8s-node-03     Ready    <none>   5d4h   v1.16.3

1.2、存储环境

本集群中kubernetes底层存储使用的是glusterfs,并且以glusterfs作为存储创建了storageclass便于动态创建pv

[root@k8s-master-01 ~]# kubectl get scNAME             PROVISIONER               AGEgluster-heketi   kubernetes.io/glusterfs   4d22h

1.3、sonarqube版本

SonarQube版本:7.9.1

2、部署sonarqube

SonarQube需要依赖数据库存储数据,且SonarQube7.9及其以后版本将不再支持Mysql,所以这里推荐设置PostgreSQL作为SonarQube的数据库。

2.1、部署PostgreSQL

在k8s集群部署PostgreSQL,需要将数据库的数据文件持久化,因此需要创建对应的pv,本次安装通过storageclass创建pv。由于postgre只需要集群内部连接,因此采用Headless service来创建数据库对应的svc,数据库的端口是5432,最终的yaml如下

apiVersion: apps/v1kind: Deploymentmetadata:  name: postgres-sonar  labels:    app: postgres-sonarspec:  replicas: 1  selector:    matchLabels:      app: postgres-sonar  template:    metadata:      labels:        app: postgres-sonar    spec:      containers:      - name: postgres-sonar        image: postgres:11.4        imagePullPolicy: IfNotPresent        ports:        - containerPort: 5432        env:        - name: POSTGRES_DB          value: "sonarDB"        - name: POSTGRES_USER          value: "sonarUser"        - name: POSTGRES_PASSWORD           value: "123456"        resources:          limits:            cpu: 1000m            memory: 2048Mi          requests:            cpu: 500m            memory: 1024Mi        volumeMounts:          - name: data            mountPath: /var/lib/postgresql/data      volumes:        - name: data          persistentVolumeClaim:            claimName: postgres-data---apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: postgres-data spec:  accessModes:    - ReadWriteMany  storageClassName: "gluster-heketi"  resources:    requests:      storage: 1Gi---apiVersion: v1kind: Servicemetadata:  name: postgres-sonar  labels:    app: postgres-sonarspec:  clusterIP: None  ports:  - port: 5432    protocol: TCP    targetPort: 5432  selector:    app: postgres-sonar

执行kubectl apply创建资源,并检查对应的pv,pvc以及日志

[root@k8s-master-01 ~]# kubectl get pv,pvcNAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS     REASON   AGEpersistentvolume/pvc-f0157e05-427b-45af-8c09-9803b11f7036   1Gi        RWX            Retain           Bound    default/postgres-data    gluster-heketi            133mNAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGEpersistentvolumeclaim/postgres-data    Bound    pvc-f0157e05-427b-45af-8c09-9803b11f7036   1Gi        RWX            gluster-heketi   133m[root@k8s-master-01 ~]# kubectl get podsNAME                               READY   STATUS    RESTARTS   AGE[root@k8s-master-01 ~]# kubectl get pods|grep postgrespostgres-sonar-75d7f8d99-sxdnn     1/1     Running   0          136m

2.2、部署SonarQube

先看看yaml,后面附上说明:

apiVersion: apps/v1kind: Deploymentmetadata:  name: sonarqube  labels:    app: sonarqubespec:  replicas: 1  selector:    matchLabels:      app: sonarqube  template:    metadata:      labels:        app: sonarqube    spec:      initContainers:      - name: init-sysctl        image: busybox        imagePullPolicy: IfNotPresent        command: ["sysctl", "-w", "vm.max_map_count=262144"]        securityContext:          privileged: true      containers:      - name: sonarqube        image: sonarqube:lts        ports:        - containerPort: 9000        env:        - name: SONARQUBE_JDBC_USERNAME          value: "sonarUser"        - name: SONARQUBE_JDBC_PASSWORD          value: "123456"        - name: SONARQUBE_JDBC_URL          value: "jdbc:postgresql://postgres-sonar:5432/sonarDB"        livenessProbe:          httpGet:            path: /sessions/new            port: 9000          initialDelaySeconds: 60          periodSeconds: 30        readinessProbe:          httpGet:            path: /sessions/new            port: 9000          initialDelaySeconds: 60          periodSeconds: 30          failureThreshold: 6        resources:          limits:            cpu: 2000m            memory: 2048Mi          requests:            cpu: 1000m            memory: 1024Mi        volumeMounts:        - mountPath: /opt/sonarqube/conf          name: data          subPath: conf        - mountPath: /opt/sonarqube/data          name: data          subPath: data        - mountPath: /opt/sonarqube/extensions          name: data          subPath: extensions      volumes:      - name: data        persistentVolumeClaim:          claimName: sonarqube-data  ---apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: sonarqube-data spec:  accessModes:    - ReadWriteMany  storageClassName: "gluster-heketi"  resources:    requests:      storage: 10Gi---apiVersion: v1kind: Servicemetadata:  name: sonarqube  labels:    app: sonarqubespec:  type: NodePort  ports:    - name: sonarqube      port: 9000      targetPort: 9000      nodePort: 30003      protocol: TCP  selector:    app: sonarqube
  • 通过官方的sonar镜像部署,通过环境变量指定连接数据库的地址信息,同样通过storageclass来提供存储卷,通过NodePort方式暴露服务。
  • 与常规部署不同的是,这里对sonar通过init container进行了初始化,执行修改了容器的vm.max_map_count大小。修改这里的原因可以参考官方文档

修改此权限需要授权能执行系统命令

securityContext:  privileged: true

2.3、访问检查

上述部署完成后,检查控制器创建的pod是否正常,并通过nodeport方式访问即可,默认登录的用户名和密码是admin/admin
中文插件名称:Chinese Pack,安装过程在界面操作,这里省略

©著作权归作者所有:来自51CTO博客作者仙人技术的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. confluence wiki如何部署
  2. 什么是JAMStack?
  3. jira如何部署
  4. tomcat环境部署
  5. LVS负载均衡之DR模式部署
  6. Git与GitLab
  7. SVN服务的部署及使用
  8. 使用kubeadm部署Kubernetes v1.13.3
  9. Gitlab安装部署及基础操作

随机推荐

  1. JavaScript原型彻底理解2---继承中的原型
  2. 【Java】通过原始Servlet写最基本的Web应
  3. java文件上传输入输出流的问题
  4. JAVAONE 2016大会的所见所感
  5. eclipse 中安装android ADT时问题解决‘o
  6. java调用Kettle总结
  7. idea使用spring boot 热更新、热加载
  8. 20155320 《Java程序设计》实验五网络编
  9. “树”不倒,人不散—数据结构的核心
  10. 关于JAVA回调函数的使用