这一章主要介绍devpos中质量控制,通过sonar在pipeline执行过程中对代码进行检查,并通过Webhooks的方式通知是否需要继续执行流水线,如果不满足质量控制的标准则让流水线失败,从而提供部署到生成环境的代码质量。
1. 质量门限
质量门限是在您的组织中执行质量策略的最佳方法。它的存在是为了回答一个问题:我今天能否将项目交付生产?
为了回答这个问题,您定义了一组基于度量阈值的布尔条件,根据这些阈值来度量项目。例如:
- 没有新的拦截器问题
- 新代码的代码覆盖率大于80%
- 等。
2. 部署sonar
这里将采用Helm将sonar部署到k8s集群中,Helm是一个k8s的包管理工具,关于它的安装及使用请参照官方文档。
2.1 下载sonarqube的chart文件
-
直接从helm仓库中检索安装
1.png -
安装
2.png出现这个问题的原因是,这里部署的k8s集群是v1.16的,不支持这个version的deployment(依赖的mysql和postgresql版本太低)
-
下载chart文件
helm pull stable/sonarqube --untar
2.2 修改dependencies和values.yaml文件
-
修改依赖
正如前面所说的主要是因为依赖的chart的版本太低,编辑requirement.yaml文件
dependencies: - name: postgresql version: 7.7.2 # 调整postgresql的版本 repository: https://kubernetes-charts.storage.googleapis.com/ condition: postgresql.enabled - name: mysql version: 1.4.0 # 调整mysql的版本,需要注意的是从sonar7.9开始已经不在对mysql进行支持了 repository: https://kubernetes-charts.storage.googleapis.com/ condition: mysql.enabled
-
修改values.yaml文件
image: repository: sonarqube tag: 7.8-community # 修改镜像的tag ..... ingress: enabled: true # 配置ingress # Used to create an Ingress record. hosts: - name: sonar.tlh.com # 配置的域名 # default paths for "/" and "/*" will be added path: / # If a different path is defined, that path and {path}/* will be added to the ingress resource # path: /sonarqube annotations: kubernetes.io/ingress.class: "devops-nginx-ingress" # 使用在不是Jenkins是创建的ingress的class .... postgresql: # Enable to deploy the PostgreSQL chart enabled: true .... postgresqlUsername: "sonarUser" # 修改参数的名称,在postgresql 7.7.2的版本中参数名有所变化 postgresqlPassword: "sonarPass" postgresqlDatabase: "sonarDB" # Specify the TCP port that PostgreSQL should use service: port: 5432
-
修改templates文件夹中的deploymen.yaml文件
env: {{- range $key, $value := .Values.extraEnv }} - name: {{ $key }} value: {{ $value }} {{- end }} - name: SONARQUBE_JDBC_USERNAME {{- if eq .Values.database.type "postgresql" }} value: {{ .Values.postgresql.postgresqlUsername | quote }} # 修改引用postgresql用户名的key {{- else if eq .Values.database.type "mysql" }} value: {{ .Values.mysql.mysqlUser | quote }} {{- end }}
2.3 部署安装
-
安装
helm install sonar stable/sonarqube -n kube-ops
-
查看ingress分配的IP,并配置到宿主机的hosts文件中
kubectl describe ingress -n kube-ops
4.png -
登陆:http://sonar.tlh.com,默认的用户名/密码:admin/admin
5.png -
安装语言插件(对某种语言的扫描规则)
登陆进入sonar,选择administration--->Marketplace,选择需要安装的语言插件。
12.png
3. 集成Jenkins
-
安装sonarqube插件
登陆进入Jenkins,选择管理Jenkins--->插件管理,检索:sonar
6.png -
配置Jenkins登录sonar的凭证
-
sonar中创建Jenkins账户
登陆进入sonar,选择administration--->security-->users,点击新建用户:
7.png -
生成token
点击Tokens创建一个token,用于作为Jenkins的凭证
9.png -
Jenkins中配置凭证
登陆进入Jenkins,选择管理Jenkins--->凭证
8.png
-
-
Jenkins配置sonar信息
登陆进入Jenkins,选择管理Jenkins--->configuration,找到sonar的配置
10.png -
sonar中配置Webhooks,用于在Jenkins中获取检查的结果
在整个Pipeline的执行流程中,在Jenkins中要获取sonar检查的结果,需要依赖于sonar的webhooks机制。登陆进入sonar,选择administration--->configuration--->Webhooks,点击新建(注意url地址,因为sonar和Jenkins都是部署在k8s中的,故url地址通过k8s提供的DNS解析来填写的):
11.png
4. Pipeline添加质量检查stage
-
修改tlhhup项目doc文件夹下的Jenkinsfile文件,添加sonar扫描和质量门限的stage
stages { stage('Build && SonarQube analysis') { steps{ container('maven') { # 使用sonar插件,注意sonar需要依赖于classes文件,所以需要compile阶段 withSonarQubeEnv(credentialsId: 'sonar', installationName: 'sonar') { sh 'mvn -DskipTests=true clean compile sonar:sonar' } sh 'mvn -DskipTests=true clean package' } } } stage("Quality Gate") { steps { # 等待获取sonar扫描的结果,失败则终止流水线 timeout(time: 1, unit: 'HOURS') { // Parameter indicates whether to set pipeline to UNSTABLE if Quality Gate fails // true = set pipeline to UNSTABLE, false = don't waitForQualityGate abortPipeline: true } } }
-
测试构建
选择构建Jenkins中之前创建的tlhhup_pipeline项目
13.png -
添加新的规则,测试是否会终止流水线
-
sonar的术语
- 质量门限:一系列条件表达式的集合,及用于判断扫描是否通过。
- 质量规则:质量配置文件是在分析期间应用的规则集合。通过用户设置或sonar内置的rules对code进行扫描、判定、计算,交由门限进行对比,最终根据门限设置的条件判定本次扫描是否通过,即质量规则是质量门限判定的基础。
-
自定义Quality Gates
进入sonar-->Quality Gates,点击复制default的Gate作为我们自定义的基础,点击添加condition,新增Cognitive Complexity,将值设置为15,方便测试,并添加需要应用的项目,否则使用的默认的。
14.png
-
-
测试构建
-
sonar结果
15.png -
Jenkins结果
16.png
-
5. 总结
- 不同的语言可以设置不同的Profile,而Gate一般公司都是统一一个标准。
- 不同项目使用不同的profile和gate可以通过sonar的ui进行设置。