終結: 持續集成 &代碼質量平台(三)

  • 2020 年 2 月 19 日
  • 筆記

引導 您好,本章主要我們主要學習與質量管理平台Sonarqube集成。主要包含以下內容:1. 使用sonarqube接口 2. 配置多分支掃描 適合人群: 所有對DevOps感興趣的同學。

1. 使用SonarQube接口

為什麼要使用接口? 不知道大家有沒有在使用SonarQube進行掃描的時候遇到這種問題: 當存在多個質量閾的時候,默認是給新項目配置默認的質量閾。也就是第一次掃描的項目直接使用的是默認的質量閾,而不是自己定義的質量閾。這種場景下就需要掃描前先指定質量閾再進行掃描了!

調研接口

可參考官方的文檔,找到自己要操作的接口及使用方法。

//查找項目  api/projects/search?projects=${projectName}"    //創建項目  api/projects/create?name=${projectName}&project=${projectName}"    //更新語言規則集  api/qualityprofiles/add_project?language=${language}&qualityProfile=${qualityProfile}&project=${projectName}"    //項目授權  api/permissions/apply_template?projectKey=${projectKey}&templateName=${templateName}"    //更新質量閾  api/qualitygates/select?projectKey=${projectKey}&gateId=${gateId}"  

共享庫封裝

package org.devops      //封裝HTTP    def HttpReq(reqType,reqUrl,reqBody){      def sonarServer = "http://192.168.1.200:30090/api"        result = httpRequest authentication: 'sonar-admin-user',              httpMode: reqType,              contentType: "APPLICATION_JSON",              consoleLogResponseBody: true,              ignoreSslErrors: true,              requestBody: reqBody,              url: "${sonarServer}/${reqUrl}"              //quiet: true        return result  }      //獲取Sonar質量閾狀態  def GetProjectStatus(projectName){      apiUrl = "project_branches/list?project=${projectName}"      response = HttpReq("GET",apiUrl,'')        response = readJSON text: """${response.content}"""      result = response["branches"][0]["status"]["qualityGateStatus"]        //println(response)       return result  }    //搜索Sonar項目  def SerarchProject(projectName){      apiUrl = "projects/search?projects=${projectName}"      response = HttpReq("GET",apiUrl,'')        response = readJSON text: """${response.content}"""      result = response["paging"]["total"]        if(result.toString() == "0"){         return "false"      } else {         return "true"      }  }    //創建Sonar項目  def CreateProject(projectName){      apiUrl =  "projects/create?name=${projectName}&project=${projectName}"      response = HttpReq("POST",apiUrl,'')      println(response)  }    //配置項目質量規則    def ConfigQualityProfiles(projectName,lang,qpname){      apiUrl = "qualityprofiles/add_project?language=${lang}&project=${projectName}&qualityProfile=${qpname}"      response = HttpReq("POST",apiUrl,'')      println(response)  }      //獲取質量閾ID  def GetQualtyGateId(gateName){      apiUrl= "qualitygates/show?name=${gateName}"      response = HttpReq("GET",apiUrl,'')      response = readJSON text: """${response.content}"""      result = response["id"]        return result  }    //配置項目質量閾    def ConfigQualityGates(projectName,gateName){      gateId = GetQualtyGateId(gateName)      apiUrl = "qualitygates/select?gateId=${gateId}&projectKey=${projectName}"      response = HttpReq("POST",apiUrl,'')      println(response)println(response)  }  

應用實踐

stage("QA"){      steps {          script{              //搜索項目              result = sonarapi.SerarchProject("${JOB_NAME}")              println(result)                //判斷項目是否存在              if (result == "false"){                  println("${JOB_NAME}---項目不存在,準備創建項目---> ${JOB_NAME}!")                  sonarapi.CreateProject("${JOB_NAME}")              } else {                  println("${JOB_NAME}---項目已存在!")              }                //配置項目質量規則              qpName="${JOB_NAME}".split("-")[0]   //Sonar%20way              sonarapi.ConfigQualityProfiles("${JOB_NAME}","java",qpName)                //配置質量閾              sonarapi.ConfigQualityGates("${JOB_NAME}",qpName)                //代碼掃描              sonar.SonarScan("test","${JOB_NAME}","${JOB_NAME}","src")                  sleep 30              //獲取掃描結果              result = sonarapi.GetProjectStatus("${JOB_NAME}")                  println(result)              if (result.toString() == "ERROR"){                  error " 代碼質量閾錯誤!請及時修復!"              } else {                  println(result)              }          }      }  }

2. SonarQube配置多分支

將插件放到兩個目錄中,然後重啟sonar

掃描參數增加 –Dsonar.branch.name=

效果