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。