JetBrains

借助 Qodana 和 Unity 提高游戏开发中的代码质量 | 实用教程

如果您还不熟悉 JetBrains Qodana,它是一个将静态分析扩展到 CI/CD 系统中的团队审查的代码质量平台。

它的一部分作用是能够让您的团队更有效地进行协作 – 特别是在设置代码审查标准和质量门时。此过程还可以促进每位团队成员都更严格地遵守这些标准。

我们的 VR Unity 团队决定将 Qodana 用于一个内部 Unity 项目 – Archipelago,这是一款以山脉形式直观呈现销售数据的虚拟现实应用。Qodana 将 Rider 的 Unity 检查全部引入到了 CI 分析中,使整个团队都可以进行代码审查,这是我们非常感兴趣的方式。我们安排一名初级开发者帮助进行了分析,以确定它是否适合初学者。

我们希望这能够为一些初级开发者提供一次学习经历,也希望这会是一个能够提高代码质量的实用工具。事实证明它的作用远不止于此,它帮助初级开发者交付了更高级别的代码。在下文中,我们的团队详细介绍了他们运行分析所采取的步骤,并分享了他们的体验。

先决条件:管道设置

在开始使用 Qodana 之前,我们已经在 TeamCity 中配置了构建管道。此管道借助包含 Docker 化版本 Unity 编辑器的 Linux Docker 镜像来构建 Unity 项目。每当我们在主分支上创建拉取请求时,这都会为我们提供项目的构建 APK。

为了获得 Qodana 分析报告,我们采取了以下步骤:

1. 在 Qodana Cloud 上创建项目

2. 生成解决方案并安装所有必需软件包。

Unity 项目通常不包含 C# 解决方案和项目文件,我们需要生成这些文件以便 Qodana 对其进行处理。我们在构建环境中安装了相应的 .NET SDK,并在每次构建时执行以下脚本:

#!/usr/bin/env bash

${UNITY_EXECUTABLE:-xvfb-run --auto-servernum --server-args='-screen 0 640x480x24' unity-editor} 

 -batchmode -quit -projectPath $UNITY_DIR -executeMethod Packages.Rider.Editor.RiderScriptEditor.SyncSolution

3. 将 qodana.yaml 文件添加到我们项目的仓库根目录。

ide: QDNET

version: "1.0"

baseProfile: "qodana.recommended"

4. 在管道配置中设置名为 QODANA_TOKEN 的环境变量,以便 Qodana 对其进行访问。该令牌应从 Qodana Cloud 中的项目页面获取。

5. 开始 Qodana 分析。

由于我们使用的是自定义构建管道,我们决定使用 Qodana CLI 以原生模式(在构建计算机上)启动 Qodana,而非启动容器来对其进行托管。要在 Linux 计算机上执行此操作,我们必须下载 Qodana CLI。对于 GitHub、GitLab 或 Azure DevOps 管道,则无需下载。您可以在此处了解有关 Qodana 与各种 CI 系统集成的更多信息。

为了正确运行分析,我们需要在项目所在文件夹中执行以下命令。然后,在 /report 文件夹中生成输出和报告。为了方便起见,我们修改了构建管道配置,以便通过构建工件访问报告。

curl -fsSL https://jb.gg/qodana-cli/install | bash

qodana scan -i $(pwd) -o /report

因此,每次对主分支进行更改时,我们不仅会获得一个 APK 文件,还会在 Qodana Cloud 中获得一份报告,我们可以在浏览器中查看或在 Rider 中打开该报告。

Qodana 报告设置

我们最初得到了一份包含近 33,000 个问题的报告。不要惊慌,这些并非全部是我们的问题!使用默认配置文件触发分析时,我们意外得到了源自于资源商店中所有 Unity 库和资源的问题。

Image
初步 Qodana 分析:我们的第一份报告。

在 UI 中选择 Scripts 文件夹后,我们得到了大约 400 个问题。在我们看来,问题仍然很多,但我们决定进行更深入的研究。

Image
使用文件夹筛选器后的第一份报告。

我们能够使用此报告,但如果我们尝试在 IDE 中将其打开,仍会得到包含 32,856 个问题的完整报告,这并不实用。为了仅对我们的代码库而非整个项目进行分析,我们添加了一个自定义配置文件。然后,我们更新了我们的 qodana.yaml 文件,使其仅包含指向我们配置文件的链接,从而更易于使用。

ide: QDNET

version: 1.0

profile:

   path: profile.yaml

qodana.yaml

profile.yaml 文件包含针对我们完整分析的检查。我们只想查看 Scripts 文件夹,我们为此使用了作用域。

baseProfile: "qodana.recommended"

inspections:

  - group: ALL

    ignore:

- "scope#!file:Assets/Scripts//*"

profile.yaml



使用报告

当我们选择正确的配置文件并获得正确的报告后,我们更为细致地查看了警报。您可以在文档中详细了解如何将 Qodana 报告与 Rider 进行链接。大多数警报识别的是冗余和约束违规问题,例如冗余 using 指令或命名空间与文件位置不符。

借助 IDE 中的上下文操作,只需点击几下即可修正此类问题。

Image
修正诸如“using 指令不为代码所需,可以安全移除”等问题

除了冗余和约束违规问题之外,还有许多涉及语法错误或与常见做法不符的警报。大多数情况下,问题都源于缺少 private 修饰符或可设为 private 的成员。

接下来,我们仅针对 Unity 和 Unity 性能检查选择了单独的类别。这些问题可以通过在 IDE 中使用上下文操作提供的快速修复来解决,这些改进有助于提高代码效率和可读性。

Image
Unity 性能问题。

对于诸如方法调用开销较大等问题,我们需要重写一些代码。其中最常见的方案通常涉及将 GetComponent 方法从性能关键型上下文移动到 Awake 或 Start 事件函数,如此处所述。

使用基线

我们逐渐遇到了修正方法更为复杂的问题。例如,创建构建时使用了 BuildCommand.cs 类和 PerformBuild 方法,但在 Unity 中却未对其进行调用。

接下来,在我们的案例中,DateContext.cs 中存在被标记为开销较大的方法调用。我们决定将此类问题放入基线当中,因为这些问题被视为对于我们的项目布局无足轻重的问题。下图显示了我们选择不修正的错误的列表。

Image
未解决/未修正的错误。

Image
将无需修正的技术债务或问题添加到基线。

为了向我们的项目添加基线,我们从 Qodana Cloud 下载了 qodana.sarif.json 文件并将其移动到我们的根目录。

Image
将基线添加到项目中。

然后,我们向构建步骤添加了一个基线形参。

curl -fsSL https://jb.gg/qodana-cli/install | bash

qodana scan -i $(pwd) -o /report --baseline ./qodana.sarif.json

Baseline parameter.

此后,我们将仅获得包含新问题的报告。而目前看来,似乎一切正常。

Image
我们的新结果。


深入研究结果

在本次实验过程中,我们将 Qodana 添加到了 TeamCity 管道中,配置了配置文件,获得了多份分析报告,并修正了项目中的几乎所有问题!

使用 Qodana 对审查我们项目的代码并使其更加简洁有效起到了很大帮助。Qodana 的真正实力在于团队协作,但它在帮助团队实现静态代码分析方面也是一个非常宝贵的工具,特别是对于那些使用 JetBrains IDE(本例中为 Rider)或 VS Code(借助 Qodana VS Code 扩展程序)的团队而言。

安装 Qodana 并按照这些说明亲自试用。如果您想更全面地了解我们的经验,欢迎随时发表评论。

特邀贡献者:Ekaterina Trukhan,VR Unity 开发者


来自 Qodana 团队的消息

感谢 Ekaterina 和团队尝试 Qodana 和 Unity。如果您对如何着手使用有任何疑问,我们会随时为您提供帮助 – 只需留言告诉我们或在 Qodana 的 YouTrack 项目上提交问题。

开启 Qodana 60 天免费试用!

本博文英文原作者:

Ekaterina Trukhan, Kerry Beetge

Image

Qodana 相关阅读

Image
Image
Image
Image

关于 Qodana

Qodana 是一款代码质量监控平台,可用于评估您拥有、协作或购买的代码的完整性。它将您所喜爱的 JetBrains IDE 中的所有智能功能以及诸如克隆检测和许可证审查等项目级检查引入到您的 CI/CD 管道中。

进一步了解 Qodana

Image

⏬ 戳「阅读原文」了解更多信息