使用SonarQube扫描JS/TS代码的经验总结

less than 1 minute read

依赖

需要运行sonar-scanner的机器上安装有node。node 可执行文件要在系统环境变量 $PATH 中,否则要在扫描时通过 sonar.nodejs.executable 属性指定该文件的绝对路径。

执行扫描

最简单的情况下,设置好 sonar.projectKeysonar.projectName属性(通过sonar-project.properties文件定义或者通过命令行指定),然后执行sonar-scanner命令即可。

Troubleshooting

执行扫描时报错 Missing Typescript dependency

解决方法:在扫描前安装好依赖:npm install typescript。安装时可以指定源来加速。

npm install 时报错 gyp ERR

解决方法:对于 debian 系统,通过安装 build-essential 包即可,apt-get install build-essential

和Jenkins集成时碰到的问题

由于扫描需要node,我理所当然地想到Jenkins应该有类似于Java/Maven插件的tool在pipeline运行时提供node环境。搜索一下,确实有NodeJS插件。迅速安装好该插件试试。

问题来了,如果使用插件中默认的安装node方法,从官网nodejs.org安装,由于GFW,下载不了。

于是尝试另一种方法:通过解压压缩包安装。找了一个阿里镜像站提供的下载链接,下载很快,但是在Jenkins机器上却无法下载,报错“java.io.IOException: incorrect header check”。一番搜索后,没找到方法解决。

还有一种方式是通过运行命令安装。官方提供了在debian机器上安装node的标准命,但是在Jenkins机器上执行又出现了权限问题。这个权限问题应该可以解,不过觉得可能会投入过多时间,暂且搁置。

最后的解决方法是:先将node的安装压缩包下载到本地,再上传到artifactory上,选择“解压压缩包安装”,填入artifactory制品的下载链接。

另一个问题是,即使在Jenkinsfile中声明的node的tool,在stage中执行诸如node -v, npm -v的命令时,会提示找不到命令。按道理这是不符合预期的:tool应该将node,npm放入$PATH中呀。没办法,只好自行在Jenkinsfile中设置环境变量了:environment { PATH="$PATH:/dir/of/node/binary/" }

参考

  • https://docs.sonarqube.org/latest/analysis/languages/javascript/
  • https://github.com/SonarSource/SonarJS

Comments