關(guān)于SonarQube社區(qū)版使用問題及解決方法
1 簡介
在大規(guī)模使用SonarQube平臺對代碼進行掃描時可能會遇到以下幾個問題
- SonarQube平臺數(shù)據(jù)問題(開源版本不支持不同分支)
 - SonarQube掃描規(guī)則問題(當配置了默認規(guī)則后新建項目如何指定新規(guī)則呢?)
 - SonarQube項目授權(quán)問題(新生產(chǎn)的項目如何配置權(quán)限?)
 
2 解決SonarQube平臺數(shù)據(jù)問題
當我們在大規(guī)模使用SonarQube進行代碼質(zhì)量檢查的時候,我們需要讓開發(fā)人員每次都能看到當前特性分支的掃描分析數(shù)據(jù),以盡快解決有問題的代碼,提高代碼的質(zhì)量。開源版本會帶來一些問題,因為不支持一個項目多分支的形式,所以我們按照特性分支的名稱來生成相對應的掃描項目。(會產(chǎn)生很多Sonarqube項目)
例如: 服務名稱是 demo-abcd-service
之前我們的做法是不區(qū)分分支,在掃描所有分支的時候都會指定同一個sonar項目。這就是導致SonarQube平臺此項目數(shù)據(jù)不穩(wěn)定的根本原因。
現(xiàn)在的做法是: 假如這個項目有F1,F(xiàn)2等特性分支,在每次對其中特性分支構(gòu)建掃描時會配置sonar掃描參數(shù)(projectName)為 “當前的服務名稱_特性分支名稱”,這樣相當于每個特性分支都對應一個掃描項目,數(shù)據(jù)就不會出現(xiàn)問題了。
雖然解決了數(shù)據(jù)不穩(wěn)定的問題,但又間接的帶來了一些問題。
- 每個特性分支生成一個項目,假如特性分支被刪除呢?或者分支很多呢?
 - 對于SonarQube管理員來說很難管理,增加了任務負擔。
 
總結(jié)一下如何解決問題呢?
- 從長遠角度來說最直接的方式當然是購買開發(fā)版本 。
 - 現(xiàn)在SonarQube已經(jīng)具有多分支插件了,親測可以使用。
 - 變更代碼掃描的模式,比如將每次特性分支掃描的數(shù)據(jù)關(guān)聯(lián)到提交的commit信息中。
 
總之,最簡單的方式就是付費購買開發(fā)版、企業(yè)版。小型團隊也可以使用生成多項目的方式管理。
3 解決SonarQube掃描規(guī)則問題
在搭建好SonarQube平臺后,已經(jīng)配置好了針對每種語言的"Sonar Way"質(zhì)量配置。我們在大規(guī)模使用中,對掃描Java項目的規(guī)則做了一些定制,有一些新增的規(guī)則還有一部分棄用的規(guī)則,總之大部分還都是默認自帶的java規(guī)則,配置好規(guī)則后并設置為默認的規(guī)則。其中有幾十個團隊在用默認的規(guī)則,后來個別團隊因需求要使用新的JAVA項目質(zhì)量。如何為新建的項目自動配置好對應的質(zhì)量呢?
分析
- SonarQube平臺中的項目不需要單獨的新建,而是通過Jenkins構(gòu)建過程中生成。
 - 當我們需要為項目指定新的質(zhì)量配置的時候,通常在Sonar WebUi中進行配置。
 - 無法通過"-Dsonar.xxxx"方式指定每次分支時使用的質(zhì)量名稱。
 
應對
- 由于SonarQube項目都是通過流水線掃描后生成的,于是在流水線中增加步驟。
 - 每次掃描之前先判斷項目是否存在,然后指定新的質(zhì)量,再執(zhí)行代碼掃描。
 
實施主要通過RESTAPI完成
- 創(chuàng)建項目:api/projects/create
 - 更新質(zhì)量:api/qualityprofiles/add_project
 - 查找項目:api/projects/search
 
JenkinsFile(ShareLibrary)參考如下:
- package com.devops
 - //Http req 使用Jenkins插件封裝的方法 哈哈哈
 - def HttpReq(reqType,reqUrl,reqBody){
 - result = httpRequest authentication: '我的憑據(jù)的ID',
 - httpMode: reqType,
 - contentType: "APPLICATION_JSON",
 - consoleLogResponseBody: true,
 - ignoreSslErrors: true,
 - requestBody: reqBody,
 - //responseHandle: 'NONE',
 - url: reqUrl
 - //quiet: true
 - return result
 - }
 - //查找項目
 - def SearchProject(projectName){
 - apiUrl = "http://我的sonar服務器地址/api/projects/search?projects=${projectName}"
 - resultInfo = HttpReq("GET",apiUrl,'')
 - def result = readJSON text: """${resultInfo.content}"""
 - if (result["paging"]["total"] == 0 ){
 - return "false"
 - } else {
 - return result
 - }
 - }
 - //創(chuàng)建項目
 - def CreateProject(projectName){
 - apiUrl = "http://我的sonar服務器地址/api/projects/create?name=${projectName}&project=${projectName}"
 - resultInfo = HttpReq("POST",apiUrl,'')
 - }
 - //更新語言規(guī)則集
 - def UpdateQuality(language,qualityProfile,projectName){
 - apiUrl = "http://我的sonar服務器地址/api/qualityprofiles/add_project?language=${language}&qualityProfile=${qualityProfile}&project=${projectName}"
 - resultInfo = HttpReq("POST",apiUrl,'')
 - }
 - //項目授權(quán)
 - def ApplyTemplate(projectKey,templateName){
 - apiUrl = "http://我的sonar服務器地址/api/permissions/apply_template?projectKey=${projectName}&templateName=${templateName}"
 - resultInfo = HttpReq("POST",apiUrl,'')
 - }
 
4 SonarQube項目授權(quán)問題
我們在前面解決了SonarQube掃描前的一些問題,現(xiàn)在開始解決授權(quán)問題。
Sonarqube的授權(quán)配置
- 用戶首先登陸SonarQube平臺(我們做了GitlabSSO/LDAP集成)
 - 根據(jù)不同的業(yè)務組對應創(chuàng)建一個group
 - 然后將用戶加入到對應的group中
 - 根據(jù)業(yè)務的簡稱創(chuàng)建對應的權(quán)限模板
 - 將組和管理員加入權(quán)限模板中
 - 然后將該業(yè)務的項目批量應用權(quán)限模板
 
親測: 新生成的項目還需要再應用權(quán)限模板后才能使對應的項目組成員訪問。
解決:在項目掃描后,調(diào)用接口對當前項目應用對應的權(quán)限模板。
- 項目授權(quán)(應用權(quán)限模板):api/permissions/apply_template
 
請參考👆問題解決中的Jenkinsfile文件。
5 總結(jié)
今天我們解決了常用的幾個問題,當然還有可能還會有很多問題待解決??偨Y(jié)一下我們解決問題的思路。
我們將Jenkins和SonarQube做了集成,通過API能夠滿足我們的需求。
我們也可以在Jenkins上面創(chuàng)建一個項目,比如用戶Sonar項目授權(quán)等等。
















 
 
 




 
 
 
 