Skip to main content

此版本的 GitHub Enterprise Server 已于以下日期停止服务 2024-03-26. 即使针对重大安全问题,也不会发布补丁。 为了获得更好的性能、更高的安全性和新功能,请升级到最新版本的 GitHub Enterprise。 如需升级帮助,请联系 GitHub Enterprise 支持

代码扫描分析耗时过长

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

注意:本文介绍了此版 GitHub Enterprise Server 的初始发行版中包含的 CodeQL 操作版本和相关 CodeQL CLI 捆绑包中可用的功能。 如果企业使用较新版本的 CodeQL 操作,请参阅本文的 GitHub Enterprise Cloud 版本,了解有关最新功能的信息。 有关使用最新版本的信息,请参阅“为设备配置代码扫描”。

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

增加内存或内核

在这种情况下,可能需要增加运行器上可用的内存或磁盘空间。 如果使用 CodeQL 进行 code scanning 分析,则可以查看 CodeQL 的建议硬件资源,以确保运行程序满足这些要求。 有关详细信息,请参阅“推荐用于运行 CodeQL 的硬件资源”。

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

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

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

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

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

对于 Java、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 元素运行的其他查询。 您可以尝试禁用其他一个或多个查询套件。 有关详细信息,请参阅“自定义 代码扫描的高级设置”。