关于SonarQube社区版使用问题及解决方法_java


1

简介




在大规模使用SonarQube平台对代码进行扫描时可能会遇到以下几个问题

  • SonarQube平台数据问题(开源版本不支持不同分支)

  • SonarQube扫描规则问题(当配置了默认规则后新建项目如何指定新规则呢?)

  • SonarQube项目授权问题(新生产的项目如何配置权限?)



2

解决SonarQube平台数据问题


当我们在大规模使用SonarQube进行代码质量检查的时候,我们需要让开发人员每次都能看到当前特性分支的扫描分析数据,以尽快解决有问题的代码,提高代码的质量。开源版本会带来一些问题,因为不支持一个项目多分支的形式,所以我们按照特性分支的名称来生成相对应的扫描项目。(会产生很多Sonarqube项目)


例如: 服务名称是 demo-abcd-service 

之前我们的做法是不区分分支,在扫描所有分支的时候都会指定同一个sonar项目。这就是导致SonarQube平台此项目数据不稳定的根本原因。


现在的做法是: 假如这个项目有F1,F2等特性分支,在每次对其中特性分支构建扫描时会配置sonar扫描参数(projectName)为 “当前的服务名称_特性分支名称”,这样相当于每个特性分支都对应一个扫描项目,数据就不会出现问题了。


虽然解决了数据不稳定的问题,但又间接的带来了一些问题。

  • 每个特性分支生成一个项目,假如特性分支被删除呢?或者分支很多呢?

  • 对于SonarQube管理员来说很难管理,增加了任务负担。



总结一下如何解决问题呢?

  • 从长远角度来说最直接的方式当然是购买开发版本 。

  • 现在SonarQube已经具有多分支插件了,亲测可以使用。

  • 变更代码扫描的模式,比如将每次特性分支扫描的数据关联到提交的commit信息中。


总之,最简单的方式就是付费购买开发版、企业版。小型团队也可以使用生成多项目的方式管理。



3

解决SonarQube扫描规则问题



在搭建好SonarQube平台后,已经配置好了针对每种语言的"Sonar Way"质量配置。我们在大规模使用中,对扫描Java项目的规则做了一些定制,有一些新增的规则还有一部分弃用的规则,总之大部分还都是默认自带的java规则,配置好规则后并设置为默认的规则。其中有几十个团队用默认的规则,后来个别团队因需求要使用新的JAVA项目质量。如何为新建的项目自动配置好对应的质量呢?


分析

  • SonarQube平台中的项目不需要单独的新建,而是通过Jenkins构建过程中生成。

  • 当我们需要为项目指定新的质量配置的时候,通常在Sonar WebUi中进行配置。

  • 无法通过"-Dsonar.xxxx"方式指定每次分支时使用的质量名称。


应对

  • 由于SonarQube项目都是通过流水线扫描后生成的,于是在流水线中增加步骤。

  • 每次扫描之前先判断项目是否存在,然后指定新的质量,再执行代码扫描。


实施主要通过RESTAPI完成

  • 创建项目:api/projects/create

  • 更新质量:api/qualityprofiles/add_project

  • 查找项目:api/projects/search


JenkinsFile(ShareLibrary)参考如下:

package com.devops
//Http req  使用Jenkins插件封装的方法 哈哈哈def HttpReq(reqType,reqUrl,reqBody){    result = httpRequest authentication: '我的凭据的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    }}
//创建项目def CreateProject(projectName){    apiUrl = "http://我的sonar服务器地址/api/projects/create?name=${projectName}&project=${projectName}"    resultInfo = HttpReq("POST",apiUrl,'')}
//更新语言规则集def UpdateQuality(language,qualityProfile,projectName){    apiUrl = "http://我的sonar服务器地址/api/qualityprofiles/add_project?language=${language}&qualityProfile=${qualityProfile}&project=${projectName}"    resultInfo = HttpReq("POST",apiUrl,'')}

//项目授权def ApplyTemplate(projectKey,templateName){    apiUrl = "http://我的sonar服务器地址/api/permissions/apply_template?projectKey=${projectName}&templateName=${templateName}"    resultInfo = HttpReq("POST",apiUrl,'')}



4

SonarQube项目授权问题



我们在前面解决了SonarQube扫描前的一些问题,现在开始解决授权问题。


Sonarqube的授权配置

  • 用户首先登陆SonarQube平台(我们做了GitlabSSO/LDAP集成)

  • 根据不同的业务组对应创建一个group 


  • 然后将用户加入到对应的group中

  • 根据业务的简称创建对应的权限模板

  • 将组和管理员加入权限模板中

  • 然后将该业务的项目批量应用权限模板 


亲测: 新生成的项目还需要再应用权限模板后才能使对应的项目组成员访问。

解决:在项目扫描后,调用接口对当前项目应用对应的权限模板。

  • 项目授权(应用权限模板):api/permissions/apply_template  


请参考