后置 SonarQube 发现代码问题太迟了,怎样与 vscode 亲密结合,提高代码质量?

3,838 阅读3分钟

众所周知,SonarQube 是一款优秀的代码质量保障工具,但很多厂里对它的使用,停留在代码提交之后的代码仓库质量横向对比、纵向趋势分析方面,作为一个普通的搬砖工,为了提高自己的搬砖质量,我们更应该关注的一个点是:代码提交之前,SonarQube 能帮我们做些什么?

vscode 插件库里搜索 sonar ,可以看到排名第一的是:SonarLint ,只要你的开发环境中安装着 jdk 8/11 和 node10+ ,这个插件几乎是开箱即用的,我们可以在 problems 面板中看到来自 sonarlint 的严谨提醒:

SonarLint 默认的规则集在 vscode 左侧面板中可以看到:

我们可以根据需求定制规则,激活或者挂起某项规则。

然而现实中,作为搬砖前线的一份子,我们并非单打独斗,团队每个人,都得遵循共同的编码规则,这时候,SonarQube 就出场了。

作为一个本地代码规范警告服务,我们不需要 SonarQube 使用那些花里胡哨的图标和文字展示什么问题数据,而只需要 SonarQube 服务为我们的团队提供一个远程的、公共的规则集,SonarLint 插件会为我们做好规则下载、检测工作,我们只需要在编辑器中进行简单的配置就可以了。

SonarLint 需要哪些配置信息?

SonarLint 官网 中写得很清楚,如果我们想使用远程的规则集,需要在 vscode 的 user settings 中添加配置:

{
    "sonarlint.connectedMode.connections.sonarqube": [
        { "serverUrl": "https://sonarqube.mycompany.com", "token": "<generated from SonarQube account/security page>" }
    ]
}

其次在项目下边新建 .vscode/settings.json ,配置如下:

{
    "sonarlint.connectedMode.project": {
        "projectKey": "the-project-key"
    }
}

看配置就知道了,我们的 SonarQube 服务,要能提供三个信息:url 、project key、project token。

安装 SonarQube

找一台机器,部署 SonarQube 服务。根据 Try out 中的步骤,我们选择比较简单的 docker 镜像部署这个方法。

$ docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest

如果想部署到别的端口,比如 7000 ,只需要把上边命令中的 9000:9000 改为 7000:9000 就可以了。

$ docker run -d --name mySonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 7000:9000 sonarqube:latest

查看服务:

$ docker ps

现在,访问 http://ip:7000

这个 http://ip:7000 就是 vscode 配置里需要的 serverUrl 里了,接下来还得配置一些项目信息。

配置 SonarQube 项目信息

登录,用户名密码都是 admin ,新建一个项目,随便叫什么,我们甚至可以叫做「commonProjectForShareRules」

创建一个 token:

你可能猜到了,配置信息中需要的 project-key 就是 commonProjectForShareRules ,而 token 就是这一串复杂的 e83c6119c94266aaf8a50ea477b3b4c9b398ae02

接着选择语言、平台:

配置规则

现在,我们可以自定义一些规则了,当我们想自定义规则的时候,看到按钮是处于禁用状态的,页面提示:

我们需要先自定义一份质量配置:

然后给这个配置选择一个项目,不用多说,选择我们之前创建的项目:

回到规则页,选择我们的自定义质量配置:

可以根据实际需求,选择激活、挂起某条规则,确定规则集之后,vscode 只需要 command + shift + p ,选择:

编辑器 output 面板会提示:

之后 vscode 中的 SonarLint 会按照更新后的规则集检查代码。

一些小问题

各处信息都配置好之后,如果 vscode 中执行 SonarLint 时发现报错:command 'SonarLint.ShowSonarLintOutput' not found 或者 command Update ... not found这样的报错,可能是 vscode 刚刚重启、或者 vscode 新开了个窗口的缘故,可以稍等一会,再次尝试。

如果启动一分钟左右 output 面板提示:org.sonarsource.nodejs.NodeCommandException: Failed to start server (60s timeout),很可能是没找到 node 服务(默认在 usr/local/bin 下寻找),vscode user settings.json 中可以加一行你自己的 node 配置:

"sonarlint.pathToNodeExecutable": "xxx/bin/node",

一般情况,SonarLint 会自动寻找 java ,找不到报错了的话,需要在 vscode user settings.json 中增加配置:

"sonarlint.ls.javaHome": "/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home",

以上。祝大家都写出诗一样的代码。