Skip to main content

此版本的 GitHub Enterprise Server 已于以下日期停止服务 2024-03-26. 即使针对重大安全问题,也不会发布补丁。 为了获得更好的性能、更高的安全性和新功能,请升级到最新版本的 GitHub Enterprise。 如需升级帮助,请联系 GitHub Enterprise 支持

将 CodeQL 分析结果上传到 GitHub

可以使用 CodeQL CLI 将 CodeQL 分析结果上传到 GitHub Enterprise Server。

谁可以使用此功能?

GitHub CodeQL 在安装后按用户授权。 根据许可证限制,只能将 CodeQL 用于某些任务。 有关详细信息,请参阅“关于 CodeQL CLI”。

如果你有 GitHub Advanced Security 许可证,则可以使用 CodeQL 进行自动分析、持续集成和持续交付。 有关详细信息,请参阅“关于 GitHub 高级安全性”。

关于 SARIF 输出

GitHub 使用静态分析结果交换格式 (SARIF) 文件中的信息创建 code scanning 警报。 SARIF 旨在表示各种静态分析工具的输出,SARIF 规范中有许多被视为“可选”的功能。 结果必须使用 SARIF 版本 2.1.0。 有关详细信息,请参阅“对代码扫描的 SARIF 支持”。

使用 CodeQL CLI 分析 CodeQL 数据库后,你将获得包含结果的 SARIF 文件。 有关详细信息,请参阅“使用 CodeQL 查询分析代码”。 然后,可以使用 CodeQL CLI 将结果上传到 GitHub。

如果使用 CodeQL CLI 以外的方法生成结果,可以使用其他上传方法。 有关详细信息,请参阅“将 SARIF 文件上传到 GitHub”。

注意:上传 SARIF 数据以显示为 GitHub Enterprise Server 中的 code scanning 结果适用于启用了 GitHub Advanced Security 的组织拥有的数据库 。 有关详细信息,请参阅“管理存储库的安全和分析设置”。

使用 GitHub Enterprise Server 生成用于身份验证的令牌

在将结果上传到 GitHub Enterprise Server 之前,首先需要生成具有 security_events 写入权限的 personal access token。 有关详细信息,请参阅“管理个人访问令牌”。

如果已在第三方 CI 系统中安装了 CodeQL CLI 以创建结果,从而以代码扫描警报的形式显示在 GitHub 中,则可以使用 GitHub App 或 personal access token 将结果上传到 GitHub Enterprise Server。 有关详细信息,请参阅“在现有 CI 系统上使用代码扫描”。

上传结果到 GitHub Enterprise Server

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

在将结果上传到 GitHub Enterprise Server 之前,必须确定将 GitHub App 或前一部分创建的 personal access token 传递到 CodeQL CLI 的最佳方式。 建议查看 CI 系统有关安全使用机密存储的指南。 CodeQL CLI 支持:

  • 使用 --github-auth-stdin 选项(建议)与机密存储库进行交互。
  • 将机密保存在环境变量 GITHUB_TOKEN 中,并在不包含 --github-auth-stdin 选项的情况下运行 CLI。
  • 出于测试目的,可以传递 --github-auth-stdin 命令行选项,并通过标准输入提供临时令牌。

为配置确定最安全可靠的方法后,请在每个 SARIF 结果文件上运行 codeql github upload-results 并包含 --github-auth-stdin,除非该令牌在环境变量 GITHUB_TOKEN 中可用。

# GitHub App or personal access token available from a secret store
<call-to-retrieve-secret> | codeql github upload-results \
    --repository=<repository-name> \
    --ref=<ref> --commit=<commit> \
    --sarif=<file> --github-url=<URL> \
    --github-auth-stdin

# GitHub App or personal access token available in GITHUB_TOKEN
codeql github upload-results \
    --repository=<repository-name> \
    --ref=<ref> --commit=<commit> \
    --sarif=<file> --github-url=<URL> \
    
选项必选使用情况
--repository指定要将数据上传到的存储库的所有者/名称。 所有者必须是拥有 GitHub Advanced Security 许可证的企业内的组织,而必须为存储库启用 GitHub Advanced Security。 有关详细信息,请参阅“管理存储库的安全和分析设置”。
--ref指定你签出和分析的 ref 的名称,以便使结果与正确的代码匹配。 用于分支:refs/heads/BRANCH-NAME,用于拉取请求的头提交:refs/pull/NUMBER/head,或者用于拉取请求的 GitHub 生成的合并提交:refs/pull/NUMBER/merge
--commit指定分析的提交的完整 SHA。
--sarif指定要加载的 SARIF 文件。
--github-url指定 GitHub Enterprise Server 的 URL。
--github-auth-stdin通过标准输入,将为对 GitHub 的 REST API 进行身份验证而创建的 GitHub App 或 personal access token 从机密存储库传递给 CLI。 如果命令有权访问使用此令牌设置的 GITHUB_TOKEN 环境变量,则不需要执行此操作。

有关详细信息,请参阅“github upload-results”。

注意: 如果你针对某个提交分析了一个以上的 CodeQL 数据库,则必须为此命令生成的每组结果指定 SARIF 类别。 当您上传结果到 GitHub Enterprise Server 时,code scanning 使用此类别来分别存储每种语言的结果。 如果忘记执行此操作,则每次上传都会覆盖之前的结果。 有关详细信息,请参阅“使用 CodeQL 查询分析代码”。

将结果上传到 GitHub Enterprise Server 的基本示例

下面的示例将结果从 SARIF 文件 temp/example-repo-js.sarif 上传到存储库 my-org/example-repo。 它告诉 code scanning API,结果用于 main 分支上的提交 deb275d2d5fe9a522a0b7bd8b6b6a1c939552718。 该示例假设为对 GitHub 的 REST API 进行身份验证而创建的 GitHub App 或 personal access token 使用 GITHUB_TOKEN 环境变量。

codeql github upload-results \
    --repository=my-org/example-repo \
    --ref=refs/heads/main --commit=deb275d2d5fe9a522a0b7bd8b6b6a1c939552718 \
    --sarif=/temp/example-repo-js.sarif --github-url=https://github.example.com \
    

除非上传未成功,否则此命令不会输出。 上传完成并开始数据处理时,命令提示返回。 在较小的代码库中,您应该能够在稍后的 GitHub Enterprise Server 中探索 code scanning 警告。 可以直接在拉取请求或分支的“安全性”选项卡中查看警报,具体取决于检出的代码。有关详细信息,请参阅“鉴定拉取请求中的代码扫描警报”和“管理存储库的代码扫描警报”。