Skip to main content

将 SARIF 文件上传到 GitHub

您可以将 SARIF 文件从第三方静态分析工具上传到 GitHub,并且在仓库中看到 code scanning 来自这些工具的警报。

谁可以使用此功能?

People with write permissions to a repository can upload code scanning data generated outside GitHub.

Code scanning 可用于 GitHub.com 上的所有公共存储库。 Code scanning 也可用于使用 GitHub Enterprise Cloud 并拥有 GitHub Advanced Security 许可证的组织所拥有的专用存储库。 有关详细信息,请参阅“关于 GitHub 高级安全性”。

关于 code scanning 的 SARIF 文件上传

GitHub 使用静态分析结果交换格式 (SARIF) 文件中的信息创建 code scanning 警报。 SARIF 文件可通过在用于上传文件的 GitHub Actions 工作流程中运行的 SARIF 兼容分析工具生成。 或者,当文件生成为仓库外部的构件时, 您可以直接将 SARIF 文件推送到仓库,并使用工作流程上传 SARIF 文件。 有关详细信息,请参阅“管理存储库的代码扫描警报”。

您可以使用许多静态分析安全测试工具来生成 SARIF 文件,包括 CodeQL。 结果必须使用 SARIF 版本 2.1.0。 有关详细信息,请参阅“对代码扫描的 SARIF 支持”。

可以使用 GitHub Actions、code scanning API 或 CodeQL CLI 上传结果。 最佳上传方法将取决于您如何生成 SARIF 文件,例如,如果您使用:

  • GitHub Actions 来运行 CodeQL 操作,则无需进一步操作。 CodeQL 操作在完成分析后自动上传 SARIF 文件。
  • GitHub Actions 运行与 SARIF 兼容的分析工具,您可以更新工作流程以包括上传结果的最后一步(见下文)。
  • CodeQL CLI 在 CI 系统中运行 code scanning,你可以使用 CLI 将结果上传到 GitHub(有关详细信息,请参阅“在现有 CI 系统上使用代码扫描”)。
  • 作为存储库外部工件生成结果的工具,你可以使用 code scanning API 上传文件(有关详细信息,请参阅“适用于代码扫描的 REST API 终结点”)。

注意:对于专用和内部存储库,code scanning 在对该资源库启用了 GitHub Advanced Security 功能时可用。 如果看到错误 Advanced Security must be enabled for this repository to use code scanning,请检查 GitHub Advanced Security 是否已启用。 有关详细信息,请参阅“管理存储库的安全和分析设置”。

通过 GitHub Actions 上传 code scanning 分析

要使用 GitHub Actions 将第三方 SARIF 文件上传到存储库,需要工作流程。 有关详细信息,请参阅“了解 GitHub Actions”。

工作流将需要使用 upload-sarif 操作,该操作是 github/codeql-action 存储库的一部分。 它包含可用于配置上传的输入参数。 您将使用的主要输入参数是:

  • sarif-file,用于配置要上传的 SARIF 文件的文件或目录。 目录或文件路径相对于存储库的根目录。
  • category(可选),用于为 SARIF 文件中的结果分配类别。 这使您能够以多种方式分析同一提交,并使用 GitHub 中的 code scanning 视图查看结果。 例如,您可以使用多个工具进行分析,在单存储库中,您可以根据已更改文件的子集分析存储库的不同片段。

有关详细信息,请参阅 upload-sarif 操作

upload-sarif 操作可以配置为在 pushscheduled 事件发生时运行。 有关 GitHub Actions 事件的详细信息,请参阅“触发工作流的事件”。

如果你的 SARIF 文件不包含 partialFingerprints,则 upload-sarif 操作将为你计算 partialFingerprints 字段并尝试防止重复警报。 仅当存储库同时包含 SARIF 文件和静态分析中使用的源代码时,GitHub 才能创建 partialFingerprints。 有关防止重复警报的详细信息,请参阅“对代码扫描的 SARIF 支持”。

可以检查 SARIF 属性是否具有支持上传的大小,以及该文件是否与代码扫描兼容。 有关详细信息,请参阅“对代码扫描的 SARIF 支持”。

在存储库外部生成的 SARIF 文件的工作流程示例

您可以创建一个新的工作流程,以在将 SARIF 文件提交到仓库后上传它们。 当 SARIF 文件作为存储库外部的工件生成时,这很有用。

只要提交被推送到仓库,此示例工作流程就会运行。 操作使用 partialFingerprints 属性来确定是否发生了更改。 除了在推送提交时运行,工作流计划为每周运行一次。 有关详细信息,请参阅“触发工作流的事件”。

此工作流上传位于存储库根目录中的 results.sarif 文件。 有关创建工作流文件的详细信息,请参阅“了解 GitHub Actions”。

或者,您也可以修改此工作流程以上传 SARIF 文件的目录。 例如,您可以将所有 SARIF 文件放在存储库根目录中名为 sarif-output 的目录中,并将操作的输入参数 sarif_file 设置为 sarif-output。 请注意,如果上传目录,则每个 SARIF 文件都必须包含唯一的 runAutomationDetails.id 才能定义结果的类别。 有关详细信息,请参阅“对代码扫描的 SARIF 支持”。

name: "Upload SARIF"

# Run workflow each time code is pushed to your repository and on a schedule.
# The scheduled workflow runs every Thursday at 15:45 UTC.
on:
  push:
  schedule:
    - cron: '45 15 * * 4'

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      # required for all workflows
      security-events: write
      # only required for workflows in private repositories
      actions: read
      contents: read
    steps:
      # This step checks out a copy of your repository.
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Upload SARIF file
        uses: github/codeql-action/upload-sarif@v3
        with:
          # Path to SARIF file relative to the root of the repository
          sarif_file: results.sarif
          # Optional category for the results
          # Used to differentiate multiple results for one commit
          category: my-analysis-tool

运行 ESLint 分析工具的示例工作流程

如果在持续集成 (CI) 工作流中生成第三方 SARIF 文件,则可以在运行 CI 测试后将 upload-sarif 操作添加为一个步骤。 如果您还没有 CI 工作流程,可以使用 GitHub Actions 模板创建一个。 有关详细信息,请参阅“GitHub Actions 快速入门”。

只要提交被推送到仓库,此示例工作流程就会运行。 操作使用 partialFingerprints 属性来确定是否发生了更改。 除了在推送提交时运行,工作流计划为每周运行一次。 有关详细信息,请参阅“触发工作流的事件”。

工作流程显示了将 ESLint 静态分析工具作为工作流程中一个步骤运行的示例。 Run ESLint 步骤运行 ESLint 工具并输出 results.sarif 文件。 然后,工作流使用 upload-sarif 操作将 results.sarif 文件上传到 GitHub。 有关创建工作流文件的详细信息,请参阅“了解 GitHub Actions”。

name: "ESLint analysis"

# Run workflow each time code is pushed to your repository and on a schedule.
# The scheduled workflow runs every Wednesday at 15:45 UTC.
on:
  push:
  schedule:
    - cron: '45 15 * * 3'

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      # required for all workflows
      security-events: write
      # only required for workflows in private repositories
      actions: read
      contents: read
    steps:
      - uses: actions/checkout@v4
      - name: Run npm install
        run: npm install
      # Runs the ESlint code analysis
      - name: Run ESLint
        # eslint exits 1 if it finds anything to report
        run: node_modules/.bin/eslint build docs lib script spec-main -f node_modules/@microsoft/eslint-formatter-sarif/sarif.js -o results.sarif || true
      # Uploads results.sarif to GitHub repository using the upload-sarif action
      - uses: github/codeql-action/upload-sarif@v3
        with:
          # Path to SARIF file relative to the root of the repository
          sarif_file: results.sarif

延伸阅读

-“排查 SARIF 上传问题