1:环境
Kubernetes |
1.24 |
SonarQube |
lts |
2:简介
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检测单个任务规则的应用情况, 检测耦合。
3:部署
存储环境:
本集群中kubernetes底层存储使用的是NFS,并且以NFS作为存储创建了storageclass便于动态创建pv
[root@kubernetes-master-1 sonarqube]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
managed-nfs-storage fuseim.pri/ifs Delete Immediate false 13h
# 部署PostgreSQL
在k8s集群部署PostgreSQL,需要将数据库的数据文件持久化,因此需要创建对应的pv,本次安装通过storageclass创建pv。由于postgre只需要集群内部连接,因此采用Headless service来创建数据库对应的svc,数据库的端口是5432,最终的yaml如下
[root@kubernetes-master-1 sonarqube]# cat pgsql.yaml
apiVersion: v1
kind: Namespace
metadata:
name: sonarqube
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-data
namespace: sonarqube
spec:
accessModes:
- ReadWriteMany
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-sonar
namespace: sonarqube
spec:
replicas: 1
selector:
matchLabels:
app: postgres-sonar
template:
metadata:
labels:
app: postgres-sonar
spec:
imagePullSecrets:
- name: harbor
containers:
- name: postgres-sonar
image: registry.kubernetes-devops.cn/library/postgres:14.2
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: "sonarDB"
- name: POSTGRES_USER
value: "sonarUser"
- name: POSTGRES_PASSWORD
value: "123456"
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
volumes:
- name: data
persistentVolumeClaim:
claimName: postgres-data
[root@kubernetes-master-1 sonarqube]# kubectl apply -f pgsql.yaml
namespace/sonarqube unchanged
persistentvolumeclaim/postgres-data unchanged
deployment.apps/postgres-sonar unchanged
service/postgres-sonar created
[root@kubernetes-master-1 sonarqube]# kubectl get pod,svc,pvc -n sonarqube
NAME READY STATUS RESTARTS AGE
pod/postgres-sonar-74cb68dfc9-mvtnb 1/1 Running 0 113s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/postgres-sonar ClusterIP None <none> 5432/TCP 9s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/postgres-data Bound pvc-99ebecf8-3d6e-4929-802d-81bbeebce9e2 1Gi RWX managed-nfs-storage 113s
# 部署SonarQube
[root@kubernetes-master-1 sonarqube]# cat sonarqube.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sonarqube-data
namespace: sonarqube
spec:
accessModes:
- ReadWriteMany
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sonarqube
namespace: sonarqube
labels:
app: sonarqube
spec:
replicas: 1
selector:
matchLabels:
app: sonarqube
template:
metadata:
labels:
app: sonarqube
spec:
imagePullSecrets:
- name: harbor
initContainers:
- name: init-sysctl
image: registry.kubernetes-devops.cn/library/busybox:latest
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
containers:
- name: sonarqube
image: registry.kubernetes-devops.cn/library/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
volumeMounts:
- mountPath: /opt/sonarqube/conf
name: data
- mountPath: /opt/sonarqube/data
name: data
- mountPath: /opt/sonarqube/extensions
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: sonarqube-data
---
apiVersion: v1
kind: Service
metadata:
name: sonarqube
namespace: sonarqube
labels:
app: sonarqube
spec:
type: NodePort
ports:
- name: sonarqube
port: 9000
targetPort: 9000
protocol: TCP
selector:
app: sonarqube
[root@kubernetes-master-1 sonarqube]# kubectl apply -f sonarqube.yaml
persistentvolumeclaim/sonarqube-data created
deployment.apps/sonarqube created
service/sonarqube created
[root@kubernetes-master-1 sonarqube]# kubectl get po,svc -n sonarqube
NAME READY STATUS RESTARTS AGE
pod/postgres-sonar-74cb68dfc9-zx7fq 1/1 Running 1 (2m41s ago) 8m51s
pod/sonarqube-59b79db98d-7gjxf 1/1 Running 0 92s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/postgres-sonar ClusterIP None <none> 5432/TCP 21m
service/sonarqube NodePort 200.1.180.235 <none> 9000:32668/TCP 92s
1:实践中value: "jdbc:postgresql://postgres-sonar:5432/sonarDB"中的postgres-sonar直接写入集群IP也可以的
2:通过官方的sonar镜像部署,通过环境变量指定连接数据库的地址信息,同样通过storageclass来提供存储卷,通过NodePort方式暴露服务。
3:与常规部署不同的是,这里对sonar通过init container进行了初始化,执行修改了容器的vm.max_map_count大小。修改这里的原因可以参考官方文档(https://docs.sonarqube.org/latest/requirements/requirements/)
![image](https://img2022.cnblogs.com/blog/2222036/202205/2222036-20220508014827620-39481584.png)
账号:admin
密码:admin
![image](https://img2022.cnblogs.com/blog/2222036/202205/2222036-20220508014921119-317916313.png)
更新一下密码
![image](https://img2022.cnblogs.com/blog/2222036/202205/2222036-20220508020106185-1435380849.png)