SonarQube in kubernetes

SonarQube是一个开源的代码质量管理系统,可用来快速定位代码中的Bug、漏洞以及不优雅的代码。它支持几乎所有的常见编程语言,例如Java、JavaScript、TypeScript、Kotlin、Ruby、Go, Scala等。并且还有插件机制,利用插件,可以让SonarQube更加强大,例如可以整合Findbugs、PMD、Checkstyle等。可以说,SonarQube是一款提升项目代码质量必备的根据。

系统需求:

  • k8s:1.13.5以上版本

  • pgsql 10及以上

docker-compose

官方提供了docker-compose的文件,把data、log、extensions目录挂载到了本机目录,以便管理文件以及查看日志。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#docker-compose.yml
version: "3"

services:
sonarqube:
image: sonarqube:lts-community #8.9.2
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://pgsql/sonarqube?currentSchema=my_schema
SONAR_JDBC_USERNAME: postgres
SONAR_JDBC_PASSWORD: passwd
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
#将data、log、extensions目录挂载到本机目录
ports:
- "9000:9000"
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:

kubernetes-yaml

通过kompose将转换为k8s的yaml文件,需要创建三个pv以及pvc,用于挂载文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#sonarqube-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: sonarqube
name: sonarqube
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: sonarqube
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: sonarqube
spec:
containers:
- env:
- name: SONAR_JDBC_PASSWORD
value: passwd
- name: SONAR_JDBC_URL
value: jdbc:postgresql://pgsql/sonarqube?currentSchema=public
- name: SONAR_JDBC_USERNAME
value: postgres
image: sonarqube:lts-community
name: sonarqube
ports:
- containerPort: 9000
resources: {}
volumeMounts:
#将data、log、extensions目录挂载到机器目录
- mountPath: /opt/sonarqube/data
name: sonarqube-data
- mountPath: /opt/sonarqube/extensions
name: sonarqube-extensions
- mountPath: /opt/sonarqube/logs
name: sonarqube-logs
restartPolicy: Always
volumes:
- name: sonarqube-data
persistentVolumeClaim:
claimName: sonarqube-data
- name: sonarqube-extensions
persistentVolumeClaim:
claimName: sonarqube-extensions
- name: sonarqube-logs
persistentVolumeClaim:
claimName: sonarqube-logs
status: {}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#sonarqube-service.yaml


apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.26.0 (40646f47)
creationTimestamp: null
labels:
io.kompose.service: sonarqube
name: sonarqube
spec:
ports:
- name: "9000"
port: 9000
targetPort: 9000
selector:
io.kompose.service: sonarqube
status:
loadBalancer: {}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# sonarqube-extensions-persistentvolumeclaim.yaml


apiVersion: v1
kind: PersistentVolume
metadata:
name: sonarqube-extensions
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: sonarqube-extensions
nfs:
path: /nfs/sonarqube-extensions
server: nfs-server-ip
# nfs路径



kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: sonarqube-extensions
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: sonarqube-extensions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# sonarqube-logs-persistentvolumeclaim.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
name: sonarqube-logs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: sonarqube-logs
nfs:
path: /nfs/sonarqube-logs
server: nfs-server-ip
# nfs路径


kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: sonarqube-logs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: sonarqube-logs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# sonarqube-data-persistentvolumeclaim.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
name: sonarqube-data
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: sonarqube-data
nfs:
path: /nfs/sonarqube-data
server: nfs-server-ip
# nfs路径


kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: sonarqube-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: sonarqube-data

新的需求

在容器化安装了sonarqube之后,又提出了新的要求,需要安装一个新的插件,需要把指定的文件放到指定的文件夹下面并修改权限为775。为了完成他的这个需求,有只有重新在原本镜像的基础上进行重新打包。

新的需求是为了让sonarqube支持多分支,需要安装一个插件sonarqube-community-branch-plugin。因此我们先准备好插件文件sonarqube-community-branch-plugin-1.8.1.jar以及在sonarqube安装目录下的配置文件sonarqube/conf/sonar.properties。具体安装步骤为:

1、将jar文件拷贝到sonar安装目录下extensions/plugins/ 及 lib/common下, 并将权限设为775
2、在sonar安装目录下的config/sonar.properties中添加:
sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=web
sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=ce

重新打包镜像

据此我们编写dockerfile

1
2
3
4
5
FROM sonarqube:lts-community
ADD sonarqube-community-branch-plugin-1.8.1.jar /opt/sonarqube/extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar
ADD sonarqube-community-branch-plugin-1.8.1.jar /opt/sonarqube/lib/common/sonarqube-community-branch-plugin-1.8.1.jar
ADD sonar.properties /opt/sonarqube/conf/sonar.properties
RUN chmod 775 /opt/sonarqube/lib/common/sonarqube-community-branch-plugin-1.8.1.jar

引用原本的镜像,在此基础上,添加两个jar文件到指定的目录。并且手动编辑好sonar.properties文件,复制到镜像里面覆盖原来的配置。最后将lib/common/sonarqube-community-branch-plugin-1.8.1.jar权限设为775。

编写好之后,开始打镜像docker build -t image-name .

编写好的镜像可以直接运行,就可以实现多分支功能啦。

部署到k8s

根据之前我们已经编写过k8s的deployment-yaml了。我们只需要更改镜像的版本就好了。

注意:如果您使用的是之前将extensions/plugins挂载到本机,则需要将文件复制到挂载出的目录/opt/sonarqube/extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar下面,因为k8s的挂载会覆盖原本的数据。同时也可以删除ADD sonarqube-community-branch-plugin-1.8.1.jar /opt/sonarqube/extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar