Skip to main content

代码扫描分析耗时过长

可以微调 code scanning 配置,以最大程度地减少分析时间。

可以尝试几种方法来减少 CodeQL 分析中的构建时间。

增加内存或内核

如果将 GitHub 托管的运行器用于 code scanning 分析,则可以考虑升级到 大型运行器。 这些是 GitHub 托管的运行器,其 RAM、CPU 和磁盘空间都高于标准运行器。 有关 大型运行器 和 code scanning 的详细信息,请参阅“关于较大的运行器”和“为默认设置配置更大的运行器”。

如果使用自托管运行器运行 code scanning 分析,可以增加这些运行器上的内存或内核数。 如果将 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 用于 code scanning 分析,则可以使用高级安装工作流来配置此功能,但不能在默认设置中对其进行配置。 有关详细信息,请参阅“了解 GitHub Actions”。

检查工作流运行哪些查询或规则

减少分析时间的另一种方法是仅运行认为在拉取请求上运行的工作流中至关重要的查询或规则。 如果将第三方工具用于 code scanning,则应参考该工具的文档。

在 CodeQL 中,有两个主要查询套件可用于每种语言。 如果已优化 CodeQL 数据库生成,但过程仍然太长,则可以减少运行的查询数。 默认查询套件自动运行:它提供质量与速度之间可能的最佳折中方案。

如果将 CodeQL 与高级安装结合使用,则除了默认查询之外,可能还会运行额外的查询或查询套件。 检查工作流是否定义了其他查询套件或要使用 queries 元素运行的其他查询。 您可以尝试禁用其他一个或多个查询套件。 有关详细信息,请参阅“自定义 代码扫描的高级设置”。