.NET Tools How-To's

使用 Qodana 提升 C# 代码质量:迈向完美

Read this post in other languages:

JetBrains IDE 以支持多种语言的强大静态代码分析而闻名。 在 Qodana 发布后,我们将这些知识统一到一个中央代码质量平台,也是每个开发流程的核心 – 您最喜欢的 CI/CD 工具。

Qodana 由提交或拉取请求触发,可为所有发现的代码质量和安全问题生成全面的分析报告 (SARIF)。 Qodana 让这些报告可供开发者、QA 工程师团队以及安全经理和法务/合规部门轻松访问。

Qodana 横幅

最近,Qodana 向我们的 .NET 工具系列迈出了第一步,大家可能已经猜到,它为 Rider 提供了出色集成。 分析本身的基础是熟悉的 InspectCodeEstablishing a zero-warning policy with ReSharper’s solution-wide analysisReSharper Command-Line Tools – Cross-Platform and Global Tools 等博文已经对其有过介绍。 InspectCode 运行的分析与探测 Rider 和 ReSharper 中代码问题的分析相同。 不过,在 CI/CD 代理上工作具有巨大优势,因为解决方案级分析不再需要在本地机器上运行,这意味着更好的开发体验、响应能力和电池寿命。

如果您想查看 Qodana 实时报告,请前往 FluentAssertionsNUKE 的公开报告。 如果您想在自己的项目中尝试 Qodana 并详细了解其在各种 CI/CD 环境和 Rider 本身中的专业功能,请继续阅读!

为 .NET 项目设置 Qodana

Qodana 在 Docker 容器中运行,因此您应该在本地和 CI/CD 环境中安装 Docker。 对于本地体验,还建议安装 Qodana CLI(您也可以直接调用 Docker):

  • 在 Windows 上使用 WinGet:winget install -e --id JetBrains.QodanaCLI
  • 在 Windows 上使用 Chocolatey:choco install qodana
  • 在 macOS 上:brew install jetbrains/utils/qodana
  • 在 Linux 上:curl -fsSL https://jb.gg/qodana-cli/install | bash

下一步,您可以调用 qodana init 来触发设置向导:

Qodana 初始化

选择适当的 linter 和解决方案文件后,Qodana 应该会创建一个 qodana.yml 配置文件,如下所示:

version: "1.0"

linter: jetbrains/qodana-dotnet:latest

dotnet:
  solution: MySolution.sln

有关 .NET 相关设置的更多信息,请参阅 Qodana for .NET 文档。

现在,您可以调用 qodana scan --show-report,执行本地 Qodana 扫描。 扫描完成后,Qodana 将在浏览器上从 http://localhost:8080 打开 HTML 报告。

初始扫描

除了通用 User interface overview(用户界面概览),对于.NET 项目,您也可以从 Tags(标签)下拉列表按目标框架进行筛选。 另外,您还可以与旭日图交互来筛选结果。

交互式旭日图

超酷! 😎

找到要调查的问题后,您可以将其展开,显示一般问题文本/类别/类型之外的更多详细信息。 在详细信息窗格中,您可以查看实际代码段以及文件路径和目标框架。 需要特别注意可以直接在 IDE 中打开文件的 Open file in Rider(在 Rider 中打开文件)按钮,以及包含我们的 Why is ReSharper suggesting this? 知识库链接的页脚注释:

问题详细信息视图

CI/CD 环境中的 Qodana 扫描

Qodana 集成到 CI/CD 环境后将充分发挥潜力。 每个构建都应生成一个新的分析报告,可以上传到 Qodana Cloud,也可以在 Rider 中下载和检查。 您还可以在构建管道中建立质量门,采用类似于 Establishing a zero-warning policy with ReSharper’s solution-wide analysis 博文中描述的方式。 在提交或拉取请求引入代码问题时,Qodana 会通过构建失败发出通知。

您可以通过三个简单的步骤启用代码质量门。 对于非新建项目,您可能最好将所有现有问题移至基线(类似于积压工作),减少障碍:

基线报告下载

其次,您需要使用 failThreshold 值扩展 qodana.yml 配置文件。 此属性指示与基线相比,在不导致构建失败的情况下可以出现多少个新问题:

version: "1.0"

linter: jetbrains/qodana-dotnet:latest
failThreshold: 0

dotnet:
  solution: MySolution.sln

第三,您必须配置构建管道,才能将当前代码问题集与基线对比。 向 Qodana 扫描调用传递 --baseline qodana.sarif.json 即可。 查阅 Qodana 文档,进一步了解如何在 CI/CD 环境中启用质量门

如果您想利用 Qodana Cloud,可以将 QODANA_TOKEN 添加为环境变量,使 Qodana 持续上传报告,详细展示其历史进程。 另外,您也可以使用 qodana show 命令在本地提供下载的报告。

下一次 Qodana 扫描应如下所示,所有问题均已移至 Baseline(基线)标签页:

清理扫描

接下来的几节将讲解 Qodana 如何与市场上最流行的 CI/CD 环境集成。 有关详情,请参阅 GitHub ActionsAzure PipelinesTeamCityGitLabCircleCISpace Automation 和 Jenkins 上的文档。

GitHub Actions 中的 Qodana

在 GitHub Actions 中,Qodana 可以充当构建的每个提交和拉取请求的状态检查

GitHub Actions 检查

特别是对于拉取请求,Qodana 将添加代码注解,帮助代码审查者和提交者立即发现问题:

GitHub 代码注解

Azure Pipelines 中的 Qodana

Qodana 以 SARIF 文件(行业标准)形式生成报告,可以通过 SARIF SAST Scans Tab 将这些报告集成到 Azure Pipelines 中:

Azure Pipelines SARIF Scans Tab

TeamCity 中的 Qodana

通过我们自己的强大 CI/CD 工具 TeamCity,Qodana 报告作为单独的标签页直接进入构建详细信息视图。 您还可以比较不同构建的报告,查看变化:

TeamCity 构建标签页

专家提示:您可以将自己的标签页添加到 TeamCity

另一个巧妙功能是您可以将代码问题视为失败的测试。 这让您可以使用现有的调查和忽略构建失败实现更有效的团队工作流:

TeamCity 代码问题调查指派

Rider 中的 Qodana 报告

当然,Qodana 与 Rider 和其他 IntelliJ IDEA 衍生产品完全集成。 Problems(问题)工具窗口中的专属 Qodana 标签页可供浏览所有发现的问题、在单独的窗格中预览,以及将其修正(或者禁止更改其严重性):

Rider Qodana 工具窗口

我们计划向工具窗口添加更多筛选和分组功能,包括以目标框架为条件。

根据您的偏好,Qodana 报告可以自动从 Qodana Cloud 拉取,也可以从报告文件中手动加载。

如果您使用的是 Qodana Cloud,可以直接从设置对话框登录。 登录后,Rider 允许您将当前项目与 Qodana Cloud 中的项目关联:

Rider Qodana 项目链接通知

如果您没有 Qodana Cloud 帐户或者更喜欢手动加载报告,可以使用 Open Qodana Analysis Report…(打开 Qodana 分析报告…)操作:

Open Qodana Analysis Report(打开 Qodana 分析报告)操作

未来计划

Qodana 发展迅速,最近迈出了进入 .NET 生态系统的第一步。 由于分析基于已经存在多年的组件 (InspectCode),协同效应非常显著。 接下来,Qodana 团队还有更多集成计划!

保持冷静,按 Alt-Enter! 如果 CI 可以为您自动应用代码问题和样式违规的快速修复,那怎么样? 虽然这个目标必然需要更多时间,但开发者一定会喜欢花更少时间输入样板代码,将更多精力放在项目的商业价值上。

目前正在积极开发的一个功能是许可证审核。 这种扫描可以帮助您验证项目许可证是否符合依赖项(例如 NuGet 软件包)及其所有传递依赖项的许可证。

许可证审核

结论

Qodana 是在代码库中协作提高代码质量的绝佳途径。 它与所有 JetBrains IDE 以及您的首选 CI/CD 环境无缝集成。

安装 Qodana CLI 并在解决方案中试用,或者注册 Qodana Cloud,轻松持续跟踪代码质量进度。

感谢阅读,如果您有任何意见或问题,请在评论区留言。

图片来源:Jesse Gardner

本博文英文原作者:

image description

Discover more