跳至主要内容

在拉取请求中分类代码扫描警报

当代码扫描在拉取请求中识别出问题时,您可以查看突出显示的代码并解决警报。

谁可以使用此功能?

拥有**读取**访问权限的用户

关于拉取请求上的代码扫描结果

在将代码扫描配置为拉取请求检查的仓库中,代码扫描会检查拉取请求中的代码。默认情况下,这仅限于针对默认分支的拉取请求,但您可以在 GitHub Actions 或第三方 CI/CD 系统中更改此配置。

如果拉取请求中更改的代码行生成代码扫描警报,则警报将在拉取请求上的以下位置报告。

  • 拉取请求中的检查结果
  • 拉取请求的**讨论**选项卡,作为拉取请求审查的一部分
  • 拉取请求的**已更改的文件**选项卡

注意

只有当警报标识的所有代码行都存在于拉取请求差异中时,代码扫描才会在拉取请求中显示警报。有关更多信息,请参阅“代码扫描的 SARIF 支持”。

GitHub Copilot Autofix 将建议修复来自私有仓库中代码扫描分析(包括 CodeQL 分析)的警报。有关在拉取请求中使用 Copilot Autofix 建议的更多信息,请参阅“使用 Copilot Autofix 建议修复拉取请求上的警报”。

如果您对仓库拥有写入权限,则可以在**安全**选项卡上查看任何现有的代码扫描警报。有关仓库警报的信息,请参阅“评估您的仓库的代码扫描警报”。

在配置为每次推送代码时都进行扫描的仓库中,代码扫描还会将结果映射到任何打开的拉取请求,并将警报作为注释添加到与其他拉取请求检查相同的位置。有关更多信息,请参阅“自定义代码扫描的高级设置”。

如果您的拉取请求目标分支是受保护的分支,并且该分支使用代码扫描,并且仓库所有者已配置必需的状态检查,则在您可以合并拉取请求之前,“代码扫描结果”检查必须通过。有关更多信息,请参阅“关于受保护的分支”。

关于代码扫描作为拉取请求检查

将代码扫描配置为拉取请求检查有很多选项,因此每个仓库的确切配置会有所不同,有些仓库会进行多个检查。

代码扫描结果检查

对于所有代码扫描配置,包含代码扫描结果的检查是:**代码扫描结果**。每个使用的分析工具的结果都单独显示。任何在拉取请求中更改的代码行上的新警报都将显示为注释。

要查看已分析分支的完整警报集,请单击**查看所有分支警报**。这将打开完整的警报视图,您可以在其中按类型、严重性、标签等筛选分支上的所有警报。有关更多信息,请参阅“评估您的仓库的代码扫描警报”。

Screenshot of the Code scanning results check on a pull request. The "View all branch alerts" link is highlighted with a dark orange outline.

代码扫描结果检查失败

如果代码扫描结果检查发现任何严重性为errorcriticalhigh的问题,则检查将失败,并且错误将在检查结果中报告。如果代码扫描发现的所有结果的严重性较低,则警报将被视为警告或注释,并且检查将成功。

Screenshot of the merge box for a pull request. The "Code scanning results / CodeQL" check has "1 new alert including 1 high severity security v..."

您可以通过指定将导致拉取请求检查失败的严重性和安全严重性级别,来覆盖仓库设置中的默认行为。有关更多信息,请参阅“自定义代码扫描的高级设置”。

其他代码扫描检查

根据您的配置,您可能会看到在配置了代码扫描的拉取请求上运行的其他检查。这些通常是分析代码或上传代码扫描结果的工作流。这些检查对于在分析出现问题时进行故障排除非常有用。

例如,如果仓库使用 CodeQL 分析工作流,则在结果检查运行之前,将为每种语言运行**CodeQL / 分析 (LANGUAGE)** 检查。如果存在配置问题,或者拉取请求破坏了分析编译的语言(例如,C/C++、C#、Go、Java、Kotlin 和 Swift)的构建,则分析检查可能会失败。

与其他拉取请求检查一样,您可以在**检查**选项卡上查看检查失败的完整详细信息。有关配置和故障排除的更多信息,请参阅“自定义代码扫描的高级设置”或“代码扫描故障排除”。

查看拉取请求中的警报

您可以通过查看**对话**选项卡来查看拉取请求更改差异中包含的任何代码扫描警报。代码扫描会发布拉取请求审查,该审查会将每个警报显示为触发警报的代码行的注释。您可以直接在注释中评论警报、关闭警报和查看警报路径。您可以点击“显示更多详细信息”链接查看警报的完整详细信息,这将带您进入警报详细信息页面。

Screenshot of an alert annotation on the "Conversations" tab of a pull request. The "Show more details" link is outlined in dark orange.

您也可以在**已更改的文件**选项卡中查看拉取请求更改差异中包含的所有代码扫描警报。

如果您在拉取请求中添加新的代码扫描配置,您会在拉取请求中看到一条评论,指导您进入存储库的**安全**选项卡,以便您可以查看拉取请求分支上的所有警报。有关查看存储库警报的更多信息,请参阅“评估存储库的代码扫描警报”。

如果您对存储库具有写入权限,则某些注释包含带有警报额外上下文的链接。在上例中,来自 CodeQL 分析,您可以点击**用户提供的值**查看不受信任的数据进入数据流的位置(这被称为源)。在这种情况下,您还可以通过点击**显示路径**查看从源到使用数据的代码(接收器)的完整路径。这使得很容易检查数据是否不受信任,或者分析是否未能识别源和接收器之间的数据清理步骤。有关使用 CodeQL 分析数据流的信息,请参阅“关于数据流分析”。

要查看有关警报的更多信息,具有写入权限的用户可以点击注释中显示的**显示更多详细信息**链接。这允许您在警报视图中查看工具提供的所有上下文和元数据。在下面的示例中,您可以看到显示问题的严重性、类型和相关常见弱点枚举 (CWE) 的标签。该视图还显示了哪个提交引入了问题。

即使警报存在于其他分支中,警报页面上的状态和详细信息也只反映存储库默认分支上警报的状态。您可以在警报页面右侧的**受影响的分支**部分查看非默认分支上警报的状态。如果默认分支中不存在警报,则警报状态将显示为“在拉取请求中”或“在分支中”,并以灰色显示。

在警报的详细视图中,某些代码扫描工具(如 CodeQL 分析)还包括问题的描述和一个**显示更多**链接,其中包含有关如何修复代码的指导。

Screenshot showing the description for a code scanning alert. A link labeled "Show more" is highlighted with a dark orange outline.

评论拉取请求中的警报

您可以评论出现在拉取请求中的任何代码扫描警报。警报作为注释显示在拉取请求的**对话**选项卡中,作为拉取请求审查的一部分,也显示在**已更改的文件**选项卡中。

您可以选择要求在合并拉取请求之前解决拉取请求中的所有对话,包括有关代码扫描警报的对话。有关更多信息,请参阅“关于受保护的分支”。

修复拉取请求中的警报

任何对拉取请求具有推送访问权限的用户都可以修复在该拉取请求中识别的代码扫描警报。如果您提交对拉取请求的更改,这将触发拉取请求检查的新运行。如果您的更改解决了问题,则警报将关闭并删除注释。

使用 Copilot 自动修复建议处理拉取请求中的警报

GitHub Copilot 自动修复是对代码扫描的扩展,它为您提供有针对性的建议,以帮助您修复拉取请求中的代码扫描警报(包括 CodeQL 警报)。潜在的修复是由大型语言模型 (LLM) 使用来自代码库、拉取请求和代码扫描分析的数据自动生成的。

注意

您无需订阅 GitHub Copilot 即可使用 GitHub Copilot 自动修复。Copilot 自动修复适用于 GitHub.com 上的所有公共存储库,以及拥有 GitHub 高级安全许可证的 GitHub Enterprise Cloud 企业中的私有存储库。

Screenshot of the check failure for a code scanning alert in a pull request. Part of the "autofix" suggestion is outlined in dark orange.

生成 Copilot 自动修复建议并发布到拉取请求

当为存储库启用 Copilot 自动修复时,警报会像往常一样显示在拉取请求中,并且代码扫描发现的任何警报信息都会自动发送到 LLM 进行处理。LLM 分析完成后,任何结果都将作为评论发布到相关警报。有关更多信息,请参阅“负责任地使用 Copilot 自动修复进行代码扫描”。

注意

  • Copilot 自动修复支持一部分 CodeQL 查询。有关 Copilot 自动修复可用性的信息,请参阅从“CodeQL 查询套件”链接的查询表。
  • 分析完成后,所有相关结果将一次性发布到拉取请求。如果拉取请求中的至少一个警报有 Copilot 自动修复建议,则应假设 LLM 已完成对代码的潜在修复的识别。
  • 对于由 Copilot 自动修复不支持的查询生成的警报,您会看到一条说明该查询不受支持的注释。如果对受支持查询的建议未能生成,您会在警报上看到一条注释,提示您尝试推送另一个提交或联系支持。

通常,当您建议对拉取请求进行更改时,您的评论包含对拉取请求中更改的单个文件的更改。以下屏幕截图显示了一个 Copilot 自动修复评论,该评论建议对显示警报的index.js文件进行更改。由于潜在的修复需要对escape-html的新依赖项,因此评论还建议将此依赖项添加到package.json文件中,即使原始拉取请求没有对该文件进行任何更改。

Screenshot of the Copilot Autofix suggestion with explanation and change in the current file. A suggested change in "package.json" is outlined in dark orange.

评估和提交 Copilot 自动修复建议

每个 Copilot 自动修复建议都演示了代码库中代码扫描警报的潜在解决方案。您必须评估建议的更改,以确定它们是否适合您的代码库,并确保它们保持预期的行为。有关 Copilot 自动修复建议的局限性的信息,请参阅“建议的局限性”和“减轻建议的局限性”(在“负责任地使用 Copilot 自动修复进行代码扫描”中)。

  1. 点击**编辑**以显示编辑选项并选择您首选的方法。

    • 在**使用 GitHub CLI 编辑**下,按照说明在本地检出拉取请求并应用建议的修复。

    • 选择**编辑文件名**以直接在 GitHub 上编辑应用了建议修复的文件。

    注意

    如果您是 PR 的 Copilot Workspace 公共预览版的一部分,则可以点击 Copilot 自动修复建议上的**在 Workspace 中打开**,直接在 GitHub 上打开 Copilot Workspace。PR 的 Copilot Workspace 允许您查看和编辑所有 Copilot 自动修复建议和其他拉取请求审查建议,运行 CI 测试以确认它们仍然通过,然后在一个提交中应用多个更改。有关更多信息,请参阅“使用 Copilot 帮助您处理拉取请求”。

  2. 或者,如果您更愿意在本地存储库或分支上应用修复,请选择建议中的下拉菜单。

    • 选择**查看自动修复补丁**以显示将建议的修复应用于任何本地存储库或分支的说明。
    • 选择**复制修改的行行号**以复制建议的特定行。
  3. 根据需要测试和修改建议的修复。

  4. 完成测试更改后,提交更改并将其推送到您的分支。

  5. 将更改推送到您的分支将触发拉取请求的所有常用测试。确认您的单元测试仍然通过,并且代码扫描警报现在已修复。

关闭 Copilot 自动修复建议

如果您决定拒绝 Copilot 自动修复建议,请点击评论中的**关闭建议**以关闭建议的修复。

关闭拉取请求中的警报

关闭警报的另一种方法是将其关闭。如果您认为不需要修复警报,则可以将其关闭。例如,仅用于测试的代码中的错误,或者修复错误的努力大于改进代码的潜在好处。如果您对存储库具有写入权限,则代码注释和警报摘要中将提供**关闭警报**按钮。当您点击**关闭警报**时,系统会提示您选择关闭警报的原因。

Screenshot of a check failure for code scanning. The "Dismiss alert" button is highlighted in dark orange. The "Dismiss alert" drop-down is shown.

从下拉菜单中选择适当的原因非常重要,因为这可能会影响查询是否继续包含在未来的分析中。或者,您可以在关闭时发表评论以记录警报关闭的上下文。关闭评论将添加到警报时间线,并可在审核和报告期间用作证明。您可以使用代码扫描 REST API 检索或设置注释。注释包含在alerts/{alert_number}端点的dismissed_comment中。有关更多信息,请参阅“代码扫描的 REST API 端点”。

如果您将 CodeQL 告警驳回为误报,例如因为代码使用了不受支持的清理库,请考虑为 CodeQL 代码库贡献代码并改进分析。有关 CodeQL 的更多信息,请参阅“参与 CodeQL 项目”。

有关驳回告警的更多信息,请参阅“解决代码扫描告警”。