如何強制性管控代碼質量

一、背景

在之前的文章中,我們已經描述了jenkins和sonarqube是如何集成起來的,今天我們在該篇文章中描述下:如何使用gerrit+jenkins+sonar進行代碼質量管控.主要是利用sonarqube分析代碼的能力來管控.

一般流程是開發者只需要提交代碼,然後會自動觸發 CI/CD,根據編譯結果來判斷代碼是否能被merge進去.而代碼的質量卻無法被管控到. 那麼我們如何來進行管控呢?總體上是採用以下的流程:gerrit提交代碼-->觸發jenkins job--->編譯後上傳sonar報告-->shell腳本調用sonar的API,得到關鍵的質量數據後判斷是否滿足條件--->jenkins將執行結果返回給gerrit-->根據jenkins的返回結果判斷是否merge代碼


二、具體實現

在這個簡單的流程中,最基本的是gerrit和jenkins的集成以及如何上傳sonarqube報告. 當然本文不是講解該如何集成,本文主要是講解: shell腳本應該如何寫.

整個shell腳本大概可以分爲以下三步:

  1. 判斷sonar報告已經上傳成功,保證是這次提交對應的sonar報告
  2. curl命令去調用api,得到關鍵質量數據
  3. 根據質量數據返回不同的值,返回1表示質量不過關,jenkins job也會失敗,同時jenkins會給gerrit返回-1操作;返回0表示質量過關,jenkins job會是成功狀態,jenkins 會給gerrit返回+1操作

後面考慮將第一步抽離出來,因爲可能各個team關注的質量指標不同,但是各個腳本都需要執行第一步.於是就有了兩個腳本:sonarCheckStatus.sh、sonarCheckQuality.sh

第一步sonarCheckStatus.sh的具體實現如下:

#!/bin/bash

#set -ox

projectName=$1
url="$SONAR_address"

function getStatus(){
    urls=$url'api/ce/component?component='$projectName;
    flag=12;
    while [ $flag -gt 5  ]
    do
        result=`curl -k -X GET $urls`;
        #if sonar project is private
        #result=`curl -k -u $username:$password -X GET $urls`;
        analyze=`echo $result | awk -F : '{print $11}' | awk -F '"' '{print $2}' `;
        if [ "$analyze" == "SUCCESS" ];then
          echo "sonarqube report analyze successfully!!!!! Please execute check script"  
          break;
        fi
        echo "report is analyzing!!! sleep 20 seconds and scanning again"
    sleep 20;
    ((flag--));
    done
  if [ $flag -le 5 ];then
    echo "Don't get the analysis result, please adjust the value of flag or check url & projectName"
    return 1;
  fi
}

getStatus

這個腳本主要是考慮到一般sonarqube分析項目時都不會超過兩分鐘,因此每次調用sonar的api來判斷報告是否更新,如果更新了,就返回0,如果sonar還在分析報告,就睡眠20秒後繼續調用該API,再繼續判斷,如果120秒都沒成功,腳本就返回-1,jenkins job就失敗了.

第二步sonarCoverageCheck.sh腳本也是類似的思想,但是相比於第一步更加複雜,因爲涉及到浮點數的比較.這裏介於篇幅就不上代碼了,如果有想要該shell腳本的朋友,留言或者私聊都行.


三、其他

1.爲什麼使用shell腳本,而不是python腳本?

因爲最開始的考慮是所有的linux系統都可以直接使用shell腳本,而python腳本需要手動安裝python,出於最小影響的考慮,選擇用shell.但是後來發現其實現在的系統會自動安裝Python2.7.大家選擇自己會的語言即可.

2.sonarqube的報告一直處於pending狀態,導致腳本一直返回-1,代碼一直無法merge進去

這個問題是由於sonarqube本身導致的,sonarqube的任務執行是單隊列的形式,當有任務阻塞的時候,會block住其他的任務.而代碼無法merge是因爲jenkins給gerrit返回了-1,開發同學看到-1後不會同意合併代碼到主分支.(在gerrit上也可以設置:只要jenkins返回了-1,就不準任何人merge代碼)

3.腳本應該放在哪裏

腳本放在jenkins job中,是通過腳本返回1或0來管控jenkins job的狀態,從而給gerrit返回對應的狀態碼


4.流程的優缺點
優點是:該流程在整體上滿足質量管控的需求,可以對關鍵質量數據進行卡點. 而且不需要太多額外的依賴
缺點是:由於是通過sonarqube的能力來管控質量,因此需要依賴sonarqube的狀態,當sonar出現異常時,該流程無法正常運行. 而且,需要額外的成本來完成並管理shell腳本


微信公衆號: DevOps入門指南

大家關注下微信公衆號!另外,新建了一個微信羣,主要是devops/ci/cd相關的話題討論以及問題解決方案。大家感興趣的話可以加微信:crazy_boy-smile

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章