分类
技术

教程:搭建 SonarQube 服务并测试自己的项目

之前分享过 SonarQube 的使用体验,今天写篇教程介绍下如何部署自己的服务器实例,及测试自己的项目。

官方文档写得很详细,推荐大家阅读学习:Install the Server。这篇博文我主要分享实操的经验教训。

0. 安装 Docker

2021年即将过去,建议大家,部署各种服务能用 Docker 最好都用 Docker。省时省力,集中精力写业务代码。

Windows、macOS 用户推荐使用 Docker hub,Linux 用户可以命令行安装 Docker Engine——你都用 Linux 了,应该不需要我详细解释,参考 官方文档 即可。

1. 部署 SonarQube

1.1 保存配置文件

有了 docker 之后,部署就很简单。先找个地方,将下面的内容保存成配置文件 sonarqube.yml

version: "3"

services:
  sonarqube:
    image: sonarqube:community
    depends_on:
      - db
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    ports:
      - "9000:9000"
  db:
    image: postgres:12
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:

注意第5行,“sonarqube:community”,是镜像的注册名称,默认是最新版本。如果你想使用长期支持(LTS)版,可以将其改成 sonarqube:lts-community。一般来说,LTS 版本新功能会落后于最新版本,但是会更稳定,安全系数也更高。目前这个时间点,如果你想部署中文版本,必须选择 LTS,也就是 8.9.x 版本,因为中文翻译插件最高只支持 9.1,在最新版 9.2 下会报错。

1.2 拉取镜像:

docker-compose -f sonarqube.yml pull

1.3 启动容器:

docker-compose -f sonarqube.yml up

第一次启动建议只用 up,方便看日志,判断状态。我的经验,不管是 Windows + WSL,还是云上小水管,都会报告:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 错误。这是虚拟机内存配置不够导致的,所以调高。

Linux

  1. 永久修改配置:编辑 /etc/sysctl,增加 vm.max_map_count = 262144
  2. 修改当前环境:执行 sysctl -w vm.max_map_count=262144
  3. 重启 docker 服务:systemctl restart docker

WSL

先进入 docker 环境:

wsl -d docker-desktop

然后

sysctl -w vm.max_map_count=262144

1.4 启动为服务

第一次启动会自动创建 Volumes(相当于磁盘),安装软件、部署各种功能、执行初始化操作等,会比较久。最后停下来时,如果 DB 服务和 SonarQube 服务都成功启动,就算完成。

默认服务端口是 9000,启动浏览器访问 localhost:9000,此时应该可以看到下图所示的登录界面。

默认用户名密码是 admin/admin,登录后会被要求修改。如果要对公网提供服务,建议尽量改得复杂一些。

如果刚才启动 SonarQube 的时候只用了 up,建议先停掉,改为 up -d 再次启动为后台服务。

2.0 配置 nginx 反向代理

Docker 启动的服务只能内部访问,所以我们通常需要把它开放到外面,这里还是用 nginx 做反向代理:

server {
    server_name sonarqube.meathill.com;
    root /var/www/sonarqube;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:9000;

    }
}

3.0 安装中文包

SonarQube 所有语言包都是以插件形式存在的,所以要汉化 SonarQube 只需要安装中文插件即可。

登录 SonarQube 后,进入 Administration > Marketplace,搜索 Chinese,安装简体中文包即可。安装之后需要重启,请耐心等待界面变化,按照提示一步一步走。

SonarQube 会根据浏览器语言配置自动选择语言,没有留出显式选项。

4.0 分析 FastTest

全部配置完成之后,可以开始第一次分析了。

首先我们新增项目(Add Project),选择手动(Manually)即可。当然,如果你是团队内部使用,也可以配置为以 GitHub、GitLab 为代码仓库。

输入 token 名称,创建一个 token,将 token 复制下来。

接下来你可以选择使用打包好的二进制文件,那就点击“继续”(Continue)然后按照提示下载二进制文件,再输入命令执行即可。我比较喜欢用 Docker,所以推荐用下面的命令,会自动拉取镜像并且执行:

docker run \
    --rm \
    -e SONAR_HOST_URL="http://${SONARQUBE_URL}" \
    -e SONAR_LOGIN="${myAuthenticationToken}" \
    -v "/path/to/repo:/usr/src" \
    sonarsource/sonar-scanner-cli

上面的参数中:

  • SONAR_HOST_URL 即部署后提供服务的地址
  • SONAR_LOGIN 即上一步中复制的 token
  • /path/to/repo 需要是绝对路径,如果是 Windows 系统,正常使用 \ 即可,比如 C:\works\fasttest,不需要转义
  • 如果你的 SonarQube 跑在 docker 里,又使用 docker 启动分析,那么需要增加 --network=host 参数,不然两个 container 之间无法互相访问

最终得到的分析结果大约是这样:

报告内容我这次就不详细解析了,回头慢慢分享。

总结

好,SonarQube 的部署和分析过程就分享完了,建议大家都学习使用一下,能学到很多安全性、可维护性的知识,能很好的提升团队的代码质量。如果绑定到 GitHub、GitLab 等代码仓库,还可以自动分析 PR、MR,成为工作流程的一部分。

感兴趣又不想自己动手(或没条件)的同学可以联系我,我可以在我的服务器上给你开通账号试用。

注意:不要上传公司的业务代码!

注意:不要上传公司的业务代码!

注意:不要上传公司的业务代码!

分类
js

SonarQube + SonarJS 体验笔记

试用了一下 SonarSource 开发的代码质量静态分析工具,记录一些过程和体验。

SonarQube

SonarQube 是 SonarSource 开发的代码质量静态分析工具,有四个不同的收费级别,分别是:

  1. 社区版(免费)
  2. 开发者版(个人版)
  3. 企业版
  4. 数据中心版

很自然我会选择社区版来体验。社区版支持 15 种语言,包括我们前端要用到的 CSS、HTML、JS、TS,以及衍生出来的 React、Vue。基本上就够我们用了。社区版支持自主部署,后面三个付费版基本上对主要功能(代码质量静态分析)没有变化,只是增加语言类型、代码行数和并发,属于企业级需求,可以说对商业相当友好,起步完全免费。

安装和使用

官方提供安装文档:Install the Server | SonarQube Docs

安装后,可以使用 SonarScanner 对代码仓库进行扫描,并将结果上传到 SonarCube 实例上,以供查看。

分析结果很全面,包含可靠性、安全性、可维护性、覆盖率、重复性、复杂度等等。用他们自己的话说,SonarJS “可能”是最好的静态分析工具,此言非虚。

SonarJS

从 SonarQube 的安装文档可以看出,一套完整 Qube 产品由三个部分组成:

  1. 数据库,用来存储数据
  2. Web 服务器,用来提供我们查阅的界面
  3. 各种 scanner,用来扫描项目

SonarJS 就是其中之一,可以单独使用。不过我没仔细研究。

eslint-plugin-sonarjs

我们还可以把 sonarjs 整合到现有开发流程当中,通过添加 eslint-plugin-sonarjs 插件。

(小小吐个槽,作为质量管理工具,eslint-plugin-sonarjs 上来就往我的项目中添加了 33 个威胁,其中 11 个中等威胁, 22 个高等威胁……)

使用方式比较简单:

  1. npm i eslint-plugin-sonarjs -D 安装插件
  2. 修改配置文件,添加 { plugins: ['sonarjs'] },以及规则集 { extends: ['plugin:sonarjs/recommended'] } 即可
  3. 如果需要启动全部规则,则需要使用 @typescript-eslint/parser。具体的还是看官方文档吧。

不过这个 eslint 插件里的规则似乎并不够多,粗粗一数也就 30 左右,远远少于 SonarJS 号称 240+的规则,可能还是受限于 ESLint 本身吧。可能的话还是要通过 scanner 来做检查。

总结

作为一款免费工具,SonarQube 很是给了我一些惊喜。我准备自己搭一个服务器端,然后把 eslint-plugin-sonarjs 加到我所有个人项目中。