Skip to main content

代码扫描分析耗时过长

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

有几种方法可供尝试,以缩短在 code scanning 分析中的构建时间。

增加内存或内核

如果您在 GitHub 分析中使用 code scanning 托管的运行器,请考虑升级到 大型运行器。 这些是由 GitHub 托管的运行器,具有比标准运行器更多的 RAM、CPU 和磁盘空间。 有关 大型运行器 和 code scanning的详细信息,请参阅 使用较大运行器为默认设置配置更大的运行器

如果使用自承载运行程序来运行 code scanning 分析,则可以增加这些运行程序的内存或核心数。 如果你使用 CodeQL 的高级设置进行分析,请查看针对 CodeQL 的推荐硬件资源,以确保你的自托管运行器满足这些要求。 有关详细信息,请参阅“推荐用于运行 CodeQL 的硬件资源”。

使用矩阵构建来并行化分析

若要加快对涉及多个作业的工作流的分析,可以修改工作流以使用矩阵。 有关详细信息,请参阅“在工作流中运行作业变体”。

默认值 CodeQL 分析工作流程 使用语言矩阵,这会导致对每种语言的分析并行运行。 但是,如果使用 CodeQL 高级设置,并且指定了想要直接在“初始化 CodeQL”步骤中分析的语言,则每个语言的分析将按顺序进行。 在此配置中,可以通过修改高级安装工作流以使用矩阵来加快分析速度。 有关示例,请参阅 某些语言未使用 CodeQL 高级设置进行分析 中的工作流提取。

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

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

使用build-mode: autobuildbuild-mode: manual用于编译的语言(如 Java、Kotlin、Go、C、C、C++ 和 C#)时,CodeQL分析工作流运行期间生成的所有代码。 要限制要分析的代码量,请通过在 run 块中指定自己的生成步骤,仅生成要分析的代码。 可以将指定自己的生成步骤与对 pathspaths-ignore 事件使用 pull_requestpush 筛选器相结合,以确保工作流仅在特定代码更改时运行。 有关详细信息,请参阅“GitHub Actions 的工作流语法”。

对于 JavaScript、Python 和 TypeScript 等由 CodeQL 在不编译源代码的情况下进行分析的语言,或者对于使用 build-mode: none 的编译型语言,你可以指定额外的配置选项来限制要分析的代码量。 有关详细信息,请参阅“代码扫描的工作流配置选项”。

如果您将 CodeQL 分析拆分为多个工作流,我们仍建议您至少保留一个在 schedule 上运行、并分析代码库中所有代码的工作流。 由于 CodeQL 分析组件之间的数据流,因此某些复杂的安全行为只能在完整的生成中检测到。

仅在 schedule 事件期间运行

可能会发现 pushpull_request 事件期间分析速度缓慢。 如果是,可以将分析设置为仅对 schedule 事件触发。 如果您在CodeQL分析中使用code scanning,则可以通过高级设置工作流进行配置,但无法在默认设置中进行配置。 有关详细信息,请参阅“了解GitHub Actions”。

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

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

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

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