{"meta":{"title":"代码扫描分析耗时过长","intro":"可以微调 code scanning 配置，以最大程度地减少分析时间。","product":"安全性和代码质量","breadcrumbs":[{"href":"/zh/code-security","title":"安全性和代码质量"},{"href":"/zh/code-security/reference","title":"Reference"},{"href":"/zh/code-security/reference/code-scanning","title":"代码扫描"},{"href":"/zh/code-security/reference/code-scanning/troubleshoot-analysis-errors","title":"排查与解决分析错误"},{"href":"/zh/code-security/reference/code-scanning/troubleshoot-analysis-errors/analysis-takes-too-long","title":"分析耗时过长"}],"documentType":"article"},"body":"# 代码扫描分析耗时过长\n\n可以微调 code scanning 配置，以最大程度地减少分析时间。\n\n可以尝试几种方法来减少 code scanning 分析中的构建时间。\n\n## 增加内存或内核\n\n如果要将 GitHub 托管的运行器用于 code scanning 分析，请考虑升级到 大型运行器。 这些是 GitHub 托管的运行器，其 RAM、CPU 和磁盘空间都高于标准运行器。 有关 大型运行器 和 code scanning 的更多信息，请参阅 [使用较大运行器](/zh/actions/using-github-hosted-runners/about-larger-runners) 和 [为默认设置配置更大的运行器](/zh/code-security/code-scanning/managing-your-code-scanning-configuration/configuring-larger-runners-for-default-setup)。\n\n如果要使用自托管运行器运行 code scanning 分析，你可以增加这些运行器上的内存或内核数。 如果要将 CodeQL 与高级设置一起用于分析，请查看针对 CodeQL 推荐的硬件资源，以确保自托管运行器满足这些要求。 有关详细信息，请参阅“[推荐用于运行 CodeQL 的硬件资源](/zh/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/recommended-hardware-resources-for-running-codeql)”。\n\n## 使用矩阵构建来并行化分析\n\n若要加快对涉及多个作业的工作流的分析，可以修改工作流以使用矩阵。 有关详细信息，请参阅“[在工作流中运行作业变体](/zh/actions/using-jobs/using-a-matrix-for-your-jobs)”。\n\n默认 CodeQL 分析工作流程 使用语言矩阵，这会导致每种语言的分析并行运行。 但是，如果将 CodeQL 与高级安装结合使用，并且指定了要在“初始化 CodeQL”步骤中直接分析的语言，则每个语言的分析将按顺序进行。 在此配置中，可以通过修改高级安装工作流以使用矩阵来加快分析速度。 有关示例，请参阅 [某些语言未使用 CodeQL 高级设置进行分析](/zh/code-security/code-scanning/troubleshooting-code-scanning/some-languages-were-not-analyzed) 中的工作流提取。\n\n## 减少单个工作流程中要分析的代码量\n\n分析时间通常与所分析的代码量成正比。 如果将 CodeQL 用于高级安装，则可以通过减少一次分析的代码量来减少分析时间。 例如，通过排除测试代码或将分析分解为多个工作流，一次只分析代码的一部分。\n\n在使用 `build-mode: autobuild` 或 `build-mode: manual` 时，对于 Java、Kotlin、Go、C、C++ 和 C# 等已编译语言，CodeQL 将分析在工作流运行期间构建的所有代码。 要限制要分析的代码量，请通过在 `run` 块中指定自己的生成步骤，仅生成要分析的代码。 可以将指定自己的生成步骤与对 `paths` 和 `paths-ignore` 事件使用 `pull_request` 或 `push` 筛选器相结合，以确保工作流仅在特定代码更改时运行。 有关详细信息，请参阅“[GitHub Actions 的工作流语法](/zh/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore)”。\n\n对于 JavaScript、Python 和 TypeScript 等语言，CodeQL 在不编译源代码的情况下进行分析，或者对于使用编译的语言 `build-mode: none`，可以指定其他配置选项来限制要分析的代码量。 有关详细信息，请参阅“[代码扫描的工作流配置选项](/zh/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning#specifying-directories-to-scan)”。\n\n如果将 CodeQL 分析拆分为多个工作流，我们仍然建议至少保留一个按 `schedule` 运行的工作流，分析存储库中的所有代码。 因为 CodeQL 分析组件之间的数据流量，所以某些复杂的安全行为只能在完整的构建中检测到。\n\n## 仅在 `schedule` 事件期间运行\n\n可能会发现 `push` 或`pull_request` 事件期间分析速度缓慢。 如果是，可以将分析设置为仅对 `schedule` 事件触发。 如果将 CodeQL 用于 code scanning 分析，则可以使用高级安装工作流来配置此功能，但不能在默认设置中对其进行配置。 有关详细信息，请参阅“[了解GitHub Actions](/zh/actions/learn-github-actions/understanding-github-actions#events)”。\n\n## 检查工作流运行哪些查询或规则\n\n减少分析时间的另一种方法是仅运行认为在拉取请求上运行的工作流中至关重要的查询或规则。 如果将第三方工具用于 code scanning，则应参考该工具的文档。\n\n在 CodeQL 中，有两个主要查询套件可用于每种语言。 如果已优化 CodeQL 数据库生成，但过程仍然太长，则可以减少运行的查询数。 默认查询套件自动运行：它提供质量与速度之间可能的最佳折中方案。\n\n如果将 CodeQL 与高级安装结合使用，则除了默认查询之外，可能还会运行额外的查询或查询套件。 检查工作流是否定义了其他查询套件或要使用 `queries` 元素运行的其他查询。 您可以尝试禁用其他一个或多个查询套件。 有关详细信息，请参阅“[代码扫描的工作流配置选项](/zh/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning#using-queries-in-ql-packs)”。"}