跳至主要内容

代码扫描分析耗时过长

您可以微调代码扫描配置以最大程度地减少分析时间。

您可以尝试几种方法来减少代码扫描分析中的构建时间。

增加内存或核心数

如果您使用的是 GitHub 托管运行器进行代码扫描分析,请考虑升级到大型运行器。这些是 GitHub 托管运行器,其 RAM、CPU 和磁盘空间比标准运行器更多。有关大型运行器和代码扫描的更多信息,请参阅“使用大型运行器”和“为默认设置配置大型运行器”。

如果您使用自托管运行器运行代码扫描分析,则可以增加这些运行器上的内存或核心数。如果您使用 CodeQL 的高级设置进行分析,请查看 CodeQL 的推荐硬件资源,以确保您的自托管运行器满足这些要求。有关更多信息,请参阅“运行 CodeQL 的推荐硬件资源”。

使用矩阵构建并行化分析

为了加快涉及多个作业的工作流的分析速度,您可以修改工作流以使用矩阵。有关更多信息,请参阅“在工作流中运行作业的变体”。

默认的 CodeQL 分析工作流使用语言矩阵,这会导致每种语言的分析并行运行。但是,如果您使用 CodeQL 的高级设置并且已在“初始化 CodeQL”步骤中直接指定了要分析的语言,则每种语言的分析将依次进行。在此配置中,您可以通过修改高级设置工作流以使用矩阵来加快分析速度。例如,请参阅“使用 CodeQL 高级设置未分析某些语言”中的工作流摘录。

减少单个工作流中分析的代码量

分析时间通常与分析的代码量成正比。如果您使用 CodeQL 的高级设置,则可以通过减少一次分析的代码量来减少分析时间。例如,通过排除测试代码,或将分析分解为多个工作流,每次仅分析代码的一个子集。

对于像 Java、Kotlin、Go、C、C++ 和 C# 这样的编译型语言,CodeQL 会分析工作流运行期间构建的所有代码。为了限制要分析的代码量,请在run块中指定您自己的构建步骤,仅构建您希望分析的代码。您可以将指定您自己的构建步骤与在pull_requestpush事件上使用pathspaths-ignore过滤器结合使用,以确保您的工作流仅在更改特定代码时运行。有关更多信息,请参阅“GitHub Actions 的工作流语法”。

对于像 JavaScript、Python 和 TypeScript 这样的 CodeQL 无需编译源代码即可分析的语言,您可以指定其他配置选项来限制要分析的代码量。有关更多信息,请参阅“自定义代码扫描的高级设置”。

如果您将 CodeQL 分析分成多个工作流,我们仍然建议您至少有一个工作流在schedule上运行,以分析存储库中的所有代码。因为 CodeQL 会分析组件之间的数据流,所以某些复杂的安全性行为可能只能在完整构建中检测到。

仅在schedule事件期间运行

您可能会发现您的分析在pushpull_request事件期间速度很慢。如果是这样,您可以将分析设置为仅在schedule事件上触发。如果您正在使用 CodeQL 进行代码扫描分析,则可以使用高级设置工作流配置此设置,但不能在默认设置中配置。有关更多信息,请参阅“了解 GitHub Actions”。

检查工作流运行的查询或规则

另一种减少分析时间的方法是在运行拉取请求的工作流中仅运行您认为关键的查询或规则。如果您使用第三方工具进行代码扫描,则应参考该工具的文档。

在 CodeQL 中,每种语言都有两个主要的查询套件可用。如果您已经优化了 CodeQL 数据库构建并且过程仍然太长,您可以减少运行的查询数量。默认查询套件会自动运行:它在质量和速度之间提供了最佳的折衷方案。

如果您正在使用带有高级设置的 CodeQL,除了默认查询之外,您可能还会运行额外的查询或查询套件。使用queries元素检查工作流是否定义了额外的查询套件或要运行的额外查询。您可以尝试禁用额外的查询套件或查询。有关更多信息,请参阅“自定义代码扫描的高级设置”。