质量门限(10)

这一章主要介绍devpos中质量控制,通过sonar在pipeline执行过程中对代码进行检查,并通过Webhooks的方式通知是否需要继续执行流水线,如果不满足质量控制的标准则让流水线失败,从而提供部署到生成环境的代码质量。


质量门限

1. 质量门限

质量门限是在您的组织中执行质量策略的最佳方法。它的存在是为了回答一个问题:我今天能否将项目交付生产?
为了回答这个问题,您定义了一组基于度量阈值的布尔条件,根据这些阈值来度量项目。例如:

  • 没有新的拦截器问题
  • 新代码的代码覆盖率大于80%
  • 等。

2. 部署sonar

这里将采用Helm将sonar部署到k8s集群中,Helm是一个k8s的包管理工具,关于它的安装及使用请参照官方文档

2.1 下载sonarqube的chart文件
  1. 直接从helm仓库中检索安装

    1.png
  2. 安装

    2.png

    出现这个问题的原因是,这里部署的k8s集群是v1.16的,不支持这个version的deployment(依赖的mysql和postgresql版本太低)

  3. 下载chart文件

     helm pull stable/sonarqube --untar
    
2.2 修改dependencies和values.yaml文件
  1. 修改依赖

    正如前面所说的主要是因为依赖的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
    
  2. 修改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
    
  3. 修改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 部署安装
  1. 安装

     helm install sonar stable/sonarqube -n kube-ops
    
  2. 查看ingress分配的IP,并配置到宿主机的hosts文件中

     kubectl describe ingress -n kube-ops
    
    4.png
  3. 登陆:http://sonar.tlh.com,默认的用户名/密码:admin/admin

    5.png
  4. 安装语言插件(对某种语言的扫描规则)

    登陆进入sonar,选择administration--->Marketplace,选择需要安装的语言插件。

    12.png

3. 集成Jenkins

  1. 安装sonarqube插件

    登陆进入Jenkins,选择管理Jenkins--->插件管理,检索:sonar

    6.png
  2. 配置Jenkins登录sonar的凭证

    1. sonar中创建Jenkins账户

      登陆进入sonar,选择administration--->security-->users,点击新建用户:

      7.png
    2. 生成token

      点击Tokens创建一个token,用于作为Jenkins的凭证

      9.png
    3. Jenkins中配置凭证

      登陆进入Jenkins,选择管理Jenkins--->凭证

      8.png
  3. Jenkins配置sonar信息

    登陆进入Jenkins,选择管理Jenkins--->configuration,找到sonar的配置

    10.png
  4. sonar中配置Webhooks,用于在Jenkins中获取检查的结果

    在整个Pipeline的执行流程中,在Jenkins中要获取sonar检查的结果,需要依赖于sonar的webhooks机制。登陆进入sonar,选择administration--->configuration--->Webhooks,点击新建(注意url地址,因为sonar和Jenkins都是部署在k8s中的,故url地址通过k8s提供的DNS解析来填写的):

    11.png

4. Pipeline添加质量检查stage

  1. 修改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
                 }
             }
         }
    
  2. 测试构建

    选择构建Jenkins中之前创建的tlhhup_pipeline项目

    13.png
  3. 添加新的规则,测试是否会终止流水线

    1. sonar的术语

      1. 质量门限:一系列条件表达式的集合,及用于判断扫描是否通过
      2. 质量规则:质量配置文件是在分析期间应用的规则集合。通过用户设置或sonar内置的rules对code进行扫描、判定、计算,交由门限进行对比,最终根据门限设置的条件判定本次扫描是否通过,即质量规则是质量门限判定的基础
    2. 自定义Quality Gates

      进入sonar-->Quality Gates,点击复制default的Gate作为我们自定义的基础,点击添加condition,新增Cognitive Complexity,将值设置为15,方便测试,并添加需要应用的项目,否则使用的默认的。

      14.png
  4. 测试构建

    1. sonar结果


      15.png
    2. Jenkins结果


      16.png

5. 总结

  1. 不同的语言可以设置不同的Profile,而Gate一般公司都是统一一个标准。
  2. 不同项目使用不同的profile和gate可以通过sonar的ui进行设置。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容