日常工作中,用gitlab做代码管理,sonarqube做代码静态扫描,是质量保障的常见方式。具体落地实践过程中,需要解决如下几个问题:
- 从gitlab中获取需要做静态扫描的项目信息,包括地址、分支等
- sonarqube中访问扫描结果的权限问题
- sonarqube扫描结果的报告汇总
获取需要扫描的项目信息
此处实现的方式方法较多,比如:
- 使用gitlab4j的api从gitlab中拉取项目列表和分支信息,如果不需要扫描所有的项目和分支,可以对需要进行扫描的项目和分支进行约定,比如基于group或者项目名称或者分支名称等等
- 另外一种方式就是提供白名单,只扫描白名单中的项目,比如:
sonarqube中访问扫描结果的权限
如果采用sonarqube本身提供的web界面去访问bug等信息,那么需要注意代码安全问题,保证非项目组成员不能查看项目和代码,此处具体落地过程中采用如下方式:
- 首先,修改项目模板,将项目的默认访问权限改为private:
如此扫描任务完成之后,扫描结果无法直接访问
- 然后从gitlab中获取该项目的访问权限列表,包括group和member的,然后采用定时任务调用sonarqube的api,添加group和member的访问权限给该扫描结果,如此进行基本权限控
sonarqube扫描结果的报告汇总
扫描结果的汇总,主要通过sonarqube的api获取,具体的api列表可以通过访问http://****:9000/web_api,访问方法如下:
- 首先在MyAccount页面生成token
- 然后使用api列表中指明的GET/POST等方法调用相应的接口进行请求,注意sonar采用HTTP Basic Auth的方式进行身份验证,此处的username为token,密码为空,比如我们采用Unirest进行请求的代码如下:
Unirest.get(sonarUrl + uri).basicAuth(sonarToken, "") .asString().getBody();
- 扫描结果的获取,主要使用badges/measure这个API,获取的度量包括bug数、代码行数等,关键代码如下:
@Slf4jpublic class SonarBadgesApi extends SonarBaseApi { public SonarBadgesApi(String sonarUrl, String sonarToken){ super(sonarUrl, sonarToken); } static final String MEASURE_URI = "api/badges/measure"; static final Pattern PATTERN = Pattern.compile("(.*?)"); /** * 获取所有需要的measure * @param key * @return */ public String measures(String key){ Map map = new HashMap(); String[] metrics = {"bugs