此版本的 GitHub Enterprise 已停止服务 2021-09-23. 即使针对重大安全问题,也不会发布补丁。 要获得更好的性能、改进的安全性和新功能,请升级到 GitHub Enterprise 的最新版本。 如需升级方面的帮助,请联系 GitHub Enterprise 支持

将 SARIF 文件上传到 GitHub

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

People with write permissions to a repository can upload 代码扫描 data generated outside GitHub.

代码扫描 在您拥有 GitHub Advanced Security 的许可证时可用。

注: 代码扫描 正在测试用于 GitHub Enterprise Server 2.22。 对于代码扫描的一般可用版本,请升级到最新版本的 GitHub Enterprise Server。

注:站点管理员必须为 您的 GitHub Enterprise Server 实例 启用 代码扫描,然后您才可使用此功能。 更多信息请参阅“为设备配置 代码扫描”。

关于 代码扫描 的 SARIF 文件上传

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

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

您可以使用 GitHub Actions(如果您的组织正在参与测试计划,则可以使用)、代码扫描 API 或 CodeQL runner 上传结果。 最佳上传方法将取决于您如何生成 SARIF 文件,例如,如果您使用:

  • GitHub Actions 来运行 CodeQL 操作,则无需进一步操作。 CodeQL 操作在完成分析后自动上传 SARIF 文件。
  • "管理工作流程运行"
  • GitHub 将在仓库中显示来自上传的 SARIF 文件的 代码扫描 警报。 如果您阻止自动上传,在准备上传结果时可以使用 upload 命令(更多信息请参阅“在 CI 系统中运行 CodeQL 代码扫描”)。
  • 作为仓库外部构件生成结果的工具,您可以使用 代码扫描 API 上传文件(更多信息请参阅“将分析作为 SARIF 数据上传”)。

通过 GitHub Actions 上传 代码扫描 分析

要将第三方 SARIF 文件上传到 GitHub,需要 GitHub Actions 工作流程。 更多信息请参阅“了解 GitHub Actions”和“了解 GitHub Actions”。

您的工作流需要使用 upload-sarif 操作,该操作包含可用于配置上传的输入参数。 它包含可用于配置上传的输入参数。 您将要使用的主要输入参数是 sarif-file,它会配置要上传的文件或 SARIF 文件的目录。 目录或文件路径相对于仓库的根目录。 更多信息请参阅 upload-sarif 操作

upload-sarif 操作可配置为在 push and scheduled 事件发生时运行。 有关 GitHub Actions 事件的更多信息,请参阅“触发工作流程的事件”。

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

注意:

  • SARIF upload supports a maximum of 1000 results per upload. 超过此限制的任何结果均被忽略。 如果工具产生太多结果,则应更新配置,以专注于最重要的规则或查询的结果。

  • For each upload, SARIF upload supports a maximum size of 10 MB for the gzip-compressed SARIF file. Any uploads over this limit will be rejected. If your SARIF file is too large because it contains too many results, you should update the configuration to focus on results for the most important rules or queries.

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

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

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

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

或者,您也可以修改此工作流程以上传 SARIF 文件的目录。 例如,您可以将所有 SARIF 文件放在仓库根目录中的 sarif-output 目录中,并将操作的输入参数 sarif_file 设置为 sarif-output

name: "Upload SARIF"

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

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # This step checks out a copy of your repository.
      - name: Checkout repository
        uses: actions/checkout@v2
      - name: Upload SARIF file
        uses: github/codeql-action/upload-sarif@v1
        with:
          # Path to SARIF file relative to the root of the repository
          sarif_file: results.sarif

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

如果将第三方 SARIF 文件生成为持续集成 (CI) 工作流程的一部分,您可以将 upload-sarif 操作添加为运行 CI 测试后的一个步骤。 如果您还没有 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 Monday at 15:45 UTC.
on:
  push:
  schedule:
    - cron: '45 15 * * 1'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - 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@v1
        with:
          # Path to SARIF file relative to the root of the repository
          sarif_file: results.sarif

延伸阅读