介绍

前面两篇介绍sonar的安装和配置,并且简单介绍了下如何使用,可以点击以下连接回顾下

根据前面的介绍,我们知道,你可以通过maven工具或者sonar-scanner将代码上传到sonar,如果你只是搭一个demo自己测试自己玩,这样一点问题都没有,如果你准备搭建一个代码质量平台,希望推广到全公司,给所有的人用,不是把环境搭起来甩一篇使用文档就完事了,所有的工具都是这样的,给你的只是砖头,具体要盖平房还是高楼取决于用砖头的人。

目标

这次我们的目标希望能达到以下目的

  • 自定义前端界面,员工登录后可以提交代码质量检测请求,请求内容比较重要的两个字段就是git地址和git分支。
  • 可以通过前端界面跳转到sonar系统中对结果进行查看。

前后端分工完毕,后端负责开发接口,接口只有三个字段

  • git地址
  • git分支
  • 当前用户

方案

虽然只有三个字段,但这个接口并不好写,你要完成以下几个事

  • 拉取git代码
  • 创建sonar用户
  • 创建sonar项目
  • 上传代码到sonar

首先想到到是jenkins,jenkins能够完成git代码的拉取,借助sonar的jenkins插件还可以上传代码,但jenkins有几个问题

  • sonar插件对jenkins版本有要求,很不幸,我们公司的jenkins版本不符合要求,如果升级成本很高
  • sonar插件需要提前在sonar中创建好项目和用户

为什么一定要动态创建sonar用户?我们考虑过这个问题,其实是可以不创建的,把项目设为公开就可以跳过用户这一块,但带来的问题是所有人都可以看到项目,肯定是不行的。但jenkins可以拉取git和执行命令行,所以可以把事情分开做。

jenkins负责
  • 拉取git代码
  • 执行sonar-scanner将代码上传到sonar(是执行命令行,主机上安装sonar-scanner,不是安装jenkins插件)
接口负责
  • 创建jenkins项目
  • 创建sonar用户
  • 创建sonar项目
  • 触发jenkins流水线

好在jenkins和sonar都有完善的api,以上这些都可以实现,接口的核心代码如下:

/**
 * 调用函数
 *
 * @param git    项目git地址
 * @param branch git分支
 * @param uid    用户名称(作为sonar登录用户)
 * @return
 */
public InvokeResult invoke(String git, String branch, String uid) {
    //1. 解析项目名称
    LocalProject project = this.parseProjectName(git);
    project.setBranch(branch);
    project.setJenkinsProjectName(project.getProjectName() + "-" + uid);
    project.setSonarProjectName(project.getProjectName() + "-" + uid);
    //2. 查询并创建sonar用户
    SonarUser sonarUser = sonar.findUser(uid);
    if (sonarUser == null) {
        sonarUser = sonar.createUser(uid);
    }
    //3. 查询并创建sonar项目
    SonarProject sonarProject = sonar.findProject(project.getSonarProjectName());
    if (sonarProject == null) {
        sonarProject = sonar.createProject(project.getSonarProjectName(), sonarUser);
    }
    //4. 查询并创建jenkins项目
    JenkinsProject jenkinsProject = jenkins.findProject(project.getJenkinsProjectName() + "-" + uid);
    if (jenkinsProject == null) {
        jenkinsProject = jenkins.createProject(project, git);
    }
    //5. 触发jenkins流水线
    this.invokeJenkins(jenkinsProject);
    InvokeResult result = new InvokeResult(sonarUser);
    result.setUrl(sonarProject.getUrl());
    return result;
}

写代码的时候可以先把核心的函数写出来再慢慢去实现一个个小功能。

接口返回一个InvokeResult,InvokeResult包含sonar的用户名密码和项目地址。

public class InvokeResult {
    private String username;
    private String password;
    private String url;
    private String code;
    private String message;
}

因为只有一个接口,而且请求参数并不复杂,因此这次没有用spring boot开发,而且用了一个无容器的java web框架blade,有兴趣可以了解下。

前端

前端需要开发吗?不需要,我们有DAP

Trackback

no comment untill now

Add your comment now