质量门限(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进行设置。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,132评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,457评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,411评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,147评论 1 301
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,145评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,611评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,962评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,948评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,479评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,514评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,640评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,228评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,973评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,402评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,551评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,210评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,714评论 2 366