用于 .Net Framework 和 .Net Core 的 TeamCity 和 SonarQube 依赖项检查器

Posted

技术标签:

【中文标题】用于 .Net Framework 和 .Net Core 的 TeamCity 和 SonarQube 依赖项检查器【英文标题】:Dependency Checker with TeamCity and SonarQube for .Net Framework and .Net Core 【发布时间】:2020-06-19 15:02:31 【问题描述】:

我在将依赖检查器输出从构建代理发送到 SonarQube 服务器时遇到问题。 我不确定它是我与依赖检查器一起使用的命令还是服务器/客户端上的 SonarQube 设置。我将 .cs、.js、.css 等的扫描输出报告到 SonarQube 中。但是依赖项扫描的输出在依赖项检查器小部件中不可见。但是,如果我检查特定构建的工作文件夹,则从 owasp 依赖检查器创建的三个文件尚未被拾取。

扫描前我做了哪些准备工作:

从https://jeremylong.github.io/DependencyCheck/dependency-check-cli/index.html 下载了 OWASP 依赖检查-cli 将 OWASP 依赖项检查 cli 提取到目录中,并将路径添加为构建代理服务器上的环境值 通过标记位置在 SonarQube 上安装了依赖检查器插件 通过构建代理在构建代理服务器上安装了声纳扫描器 服务帐号 从 SonarQube 的依赖检查插件的报告字段中删除了 $Workspace/ 值 该值现在只是dependency-check-report.html/json/xml(在字段上等待)。

我用来通过 .Net Core 安装 dotnet-sonarscanner 的命令:

dotnet tool install --global dotnet-sonarscanner

OWASP dependency-check-cli 命令(从构建代理的 checkoutDir 根目录运行):

dependency-check.bat --project "%system.teamcity.projectName%" --scan . -f ALL --log D:\DependencyLogs\verbose.log

为了让 RetireJs 功能正常工作,我必须调试日志并直接下载无法直接检索的 json 文件。我想我还需要通过使用 java 参数 (/d:) 为 https 的代理添加覆盖

声纳扫描仪开始命令:

dotnet sonarscanner begin /k:%ProjectKey% /n:"%ProjectName%" /d:sonar.login=%SonarQube.UserToken% /d:sonar.host.url=%SonarQube.Host.Url%"

如果我 f.ex 添加参数 /d:sonar.dependencyCheck.xmlReportPath=%system.teamcity.checkoutDir%/dependency-check-report.xml,它会解析为 checkoutdir,并在后面添加 /src/依赖检查报告.xml

声纳扫描仪结束命令:

dotnet sonarscanner /d:sonar.login=%SonarQube.UserToken% end

如果我添加

%system.teamcity.build.workingDir%/dependency-check-report.html

到 sonarqube 插件属性中的 html、xml 或 json 字段:

[23:19:08]  [Step 1/1] INFO: Dependency-Check JSON report does not exists. Please check property sonar.dependencyCheck.jsonReportPath:D:\TeamCityBuildAgent\work\a7450333ae6fcf0c\%system.teamcity.build.workingDir%\dependency-check-report.json
[23:19:08]  [Step 1/1] INFO: JSON-Analysis skipped/aborted due to missing report file
[23:19:08]  [Step 1/1] INFO: Using XML-Reportparser
[23:19:08]  [Step 1/1] INFO: Dependency-Check XML report does not exists. Please check property sonar.dependencyCheck.xmlReportPath:D:\TeamCityBuildAgent\work\a7450333ae6fcf0c\%system.teamcity.build.workingDir%\dependency-check-report.xml
[23:19:08]  [Step 1/1] INFO: XML-Analysis skipped/aborted due to missing report file
[23:19:08]  [Step 1/1] INFO: Dependency-Check HTML report does not exists. Please check property sonar.dependencyCheck.htmlReportPath:D:\TeamCityBuildAgent\work\a7450333ae6fcf0c\%system.teamcity.build.workingDir%\dependency-check-report.html
[23:19:08]  [Step 1/1] INFO: HTML-Dependency-Check report does not exist.

如果我删除了工作目录,那么它在 sonarqube 中看起来像这样:

dependency-check-report.html

输出如下:

[23:26:38]  [Step 1/1] INFO: Sensor Dependency-Check [dependencycheck]
[23:26:38]  [Step 1/1] INFO: Process Dependency-Check report
[23:26:38]  [Step 1/1] INFO: Using JSON-Reportparser
[23:26:39]  [Step 1/1] WARN: JSON-Analysis aborted
[23:26:39]  [Step 1/1] INFO: Using XML-Reportparser
[23:26:39]  [Step 1/1] INFO: We doesn't found any Project configuration file e.g. pom.xml, gradle.build, build.gradle.kts, package-lock.json and can not link dependencies
[23:26:39]  [Step 1/1] INFO: Linking 662 dependencies to project
[23:26:39]  [Step 1/1] INFO: Upload Dependency-Check HTML-Report
[23:26:39]  [Step 1/1] INFO: Process Dependency-Check report (done) | time=959ms
[23:26:39]  [Step 1/1] INFO: Sensor Dependency-Check [dependencycheck] (done) | time=960ms

所以这应该有效。 Dependency-Check HTML 已完成并上传,但是当我查看 SonarQube 中报告的依赖项时,视图为空。我错过了什么..?

输出在那里:

【问题讨论】:

【参考方案1】:

目前SonarQube的官方插件(2.0.2版),有一个不显示html结果的bug。

如果你想让它工作,你目前需要从这个分支获取最新的快照 https://github.com/dependency-check/dependency-check-sonar-plugin/tree/rewrite_javascript

【讨论】:

以上是关于用于 .Net Framework 和 .Net Core 的 TeamCity 和 SonarQube 依赖项检查器的主要内容,如果未能解决你的问题,请参考以下文章

.NET framework 和.NET有区别?啥区别?

用于 xml 架构编译的 Full Framework 和 .NET Core 的不同行为

用于任意数字精度的 .NET Framework 库

用于向后移植新的 .NET Framework 功能的“兼容包”?

.NET Framework的含义

什么.net framework 4.5有什么用