日常工作中,用gitlab做代码管理,sonarqube做代码静态扫描,是质量保障的常见方式。具体落地实践过程中,需要解决如下几个问题:
此处实现的方式方法较多,比如:
如果采用sonarqube本身提供的web界面去访问bug等信息,那么需要注意代码安全问题,保证非项目组成员不能查看项目和代码,此处具体落地过程中采用如下方式:
如此扫描任务完成之后,扫描结果无法直接访问
扫描结果的汇总,主要通过sonarqube的api获取,具体的api列表可以通过访问http://****:9000/web_api,访问方法如下:
Unirest.get(sonarUrl + uri).basicAuth(sonarToken, "")
.asString().getBody();
@Slf4j
public 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", "ncloc", "duplicated_lines_density", "code_smells", "bugs", "vulnerabilities", "sqale_debt_ratio"};
for(String metric : metrics){
try {
map.put(metric, measure(key, metric));
} catch (Exception e) {
log.error(e.getMessage(), e);
continue;
}
}
return JSON.toJSONString(map);
}
public String measure(String key, String metric) throws Exception{
String uriFormat = MEASURE_URI + "?key=%s&metric=%s";
String uri = String.format(uriFormat, key, metric);
String content = getToString(uri).toString();
//值在最后一个text中
Matcher matcher = PATTERN.matcher(content);
String value = "";
while(matcher.find()){
value = matcher.group(1);
}
return value;
}
}
比较简单,就不解释了。
前文解决了扫描谁、谁能看、怎么看的问题,另外一个关键问题是怎么扫的问题。一个落地方法是结合jenkins做持续集成,需要对jenkins做基于参数的构建:
可以看到,其中的几个参数即为我们在第一步中指明的那些参数,如果从jenkins执行,指明参数即可;如果从平台执行,则需要调用jenkins 的api,关键代码如下:
public void sonarJob(JenkinsSonarJobEntity entity) throws Exception{
log.info("提交{}开始执行代码扫描...", entity.getRepo());
Map params = new HashMap<>();
params.put("REPO", entity.getRepo());
params.put("PROJECT_NAME", entity.getProjectName());
params.put("SONAR_PROJECT_NAME", Utils.gitlabProjectToSonarProject(entity.getProjectName()));//sonar的project名字不支持/
params.put("BRANCH", entity.getBranch());
params.put("SONAR_BRANCH", Utils.gitlabProjectToSonarProject(entity.getBranch()));//分支不支持/
params.put("SOURCE", fixForJenkinsEnv(entity.getSource()));
params.put("TARGET", fixForJenkinsEnv(entity.getTarget()));
params.put("EXCLUSIONS", fixForJenkinsEnv(entity.getExclusions()));
String queue = jenkinsServer.getJob("SonarScan").build(params, false).getQueueItemUrlPart();
log.info("提交完成:{}", queue);
}
此处用到如下包:
com.offbytwo.jenkins
jenkins-client
0.3.8
综上,介绍了一个基于gitlab、sonarqube和jenkins的可以落地的静态代码扫描方法,后续在此基础上集成到质量平台时,可以做:
关注:测试领域专家(头条&微信)获取第一时间文章更新。