您可以尝试以下几种方法来缩短代码扫描分析的构建时间。
增加内存或 CPU 核心
如果您使用 GitHub 托管的 runner 进行代码扫描分析,建议升级到更大的 runner。这些 runner 拥有比标准 runner 更多的 RAM、CPU 和磁盘空间。有关更大 runner 和代码扫描的更多信息,请参阅 使用更大的运行器 和 为默认设置配置更大的运行器。
如果您使用自托管 runner 来运行代码扫描分析,可以增加这些 runner 的内存或 CPU 核心数。如果您使用 CodeQL 的高级设置进行分析,请检查 CodeQL 的推荐硬件资源,以确保自托管 runner 符合这些要求。有关更多信息,请参阅 运行 CodeQL 的推荐硬件资源。
使用矩阵构建并行化分析
要加快包含多个作业的工作流的分析速度,您可以修改工作流以使用矩阵。有关详细信息,请参阅 在工作流中运行作业变体。
默认的 CodeQL 分析工作流使用语言矩阵,这会使每种语言的分析并行运行。但如果您在“Initialize CodeQL”步骤中直接指定了要分析的语言(即使用高级设置),则各语言的分析会顺序进行。在此配置下,您可以通过将高级设置工作流改为使用矩阵来加快分析速度。示例请参阅 某些语言未在 CodeQL 高级设置中分析 中的工作流摘录。
减少单个工作流中被分析的代码量
分析时间通常与被分析代码的数量成正比。如果您使用 CodeQL 的高级设置,可以通过减少一次性分析的代码量来缩短分析时间。例如,排除测试代码,或将分析拆分为多个工作流,每次仅分析代码的一个子集。
在使用 build-mode: autobuild 或 build-mode: manual 时,对于 Java、Kotlin、Go、C、C++、C# 等编译型语言,CodeQL 会分析工作流运行期间构建的所有代码。要限制分析的代码量,请通过在 run 块中指定自己的构建步骤,仅构建您希望分析的代码。您还可以将自定义构建步骤与 paths 或 paths-ignore 过滤器配合,针对 pull_request 和 push 事件确保工作流仅在特定代码变更时运行。更多信息,请参阅 GitHub Actions 工作流语法。
对于 JavaScript、Python、TypeScript 等 CodeQL 在不编译源代码的情况下分析的语言,或对使用 build-mode: none 的编译型语言,您可以指定额外的配置选项以限制要分析的代码量。更多信息,请参阅 代码扫描工作流配置选项。
如果您将 CodeQL 分析拆分为多个工作流,仍建议至少保留一个在 schedule 上运行的工作流,以分析仓库中的全部代码。因为 CodeQL 会分析组件之间的数据流,一些复杂的安全行为仅能在完整构建时被检测到。
仅在 schedule 事件期间运行
您可能会发现分析在 push 或 pull_request 事件期间比较慢。如果是这种情况,您可以将分析触发仅设置为 schedule 事件。如果您使用 CodeQL 进行代码扫描分析,可通过高级设置工作流进行配置,默认设置无法实现此功能。更多信息,请参阅 了解 GitHub Actions。
检查工作流运行的查询或规则
另一种减少分析时间的办法是仅在 Pull Request 工作流中运行您认为关键的查询或规则。如果您使用第三方代码扫描工具,请查阅该工具的文档。
在 CodeQL 中,每种语言都有两套主要的查询套件可用。如果您已经优化了 CodeQL 数据库的构建,但过程仍然过长,可以考虑减少运行的查询数量。默认查询套件会自动运行:它在质量和速度之间提供了最佳的折衷。
如果您使用 CodeQL 的高级设置,除了默认查询外,可能还会运行额外的查询或查询套件。检查工作流是否通过 queries 元素定义了额外的查询套件或查询。您可以尝试禁用这些额外的查询套件或查询。更多信息,请参阅 代码扫描工作流配置选项。