Skip to main content

在现有 CI 系统上使用代码扫描

可以在第三方持续集成系统中用 CodeQL CLI 或其他工具分析代码,并将结果上传到 GitHub.com。 由此产生的 code scanning 警报与 GitHub 内生成的任何警报一起显示。

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

关于将 code scanning 与现有 CI 系统配合使用

作为使用 GitHub Actions 在 GitHub 中运行 code scanning 的替代方法,你可以在外部持续集成或持续交付/部署(CI/CD)系统中分析代码,然后将结果上传到 GitHub。

你可以将 CodeQL CLI 添加到你的第三方系统,或使用可以将结果生成为静态分析结果互换格式(SARIF)2.1.0 数据的另一个第三方静态分析工具。 有关支持的 SARIF 格式的详细信息,请参阅“对代码扫描的 SARIF 支持”。

CodeQL CLI 是可用于分析代码的独立代码行工具。 有关详细信息,请参阅“关于 CodeQL CLI”。

在外部生成的 code scanning 的警报显示方式与在 GitHub 内生成的 code scanning 的警报显示方式相同。 如果使用多个配置运行代码扫描,则有时多个配置会生成相同的警报。 如果警报来自多个配置,你可在警报页上查看每个配置的警报状态。 有关详细信息,请参阅“关于代码扫描警报”。

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

设置分析工具

首先需要下载所选分析工具,并使用 CI 系统进行设置。

如果你使用的是 CodeQL CLI,你需要将 CodeQL CLI 捆绑包的全部内容提供给要运行 CodeQL code scanning 分析的每个 CI 服务器。 有关详细信息,请参阅“设置 CodeQL CLI”。

将分析工具提供给 CI 系统中的服务器后,即可生成数据。

分析代码

若要使用 CodeQL CLI 或其他分析工具分析代码,需要检查要分析的代码并设置代码库环境,确保任何依赖项都可用。 你可能还需要查找代码库的生成命令,通常提供在 CI 系统的配置文件中。

然后,你可以完成分析代码库并生成结果的步骤,这些步骤将因所使用的静态分析工具而异。

如果使用 CodeQL CLI,则首先需要通过代码创建 CodeQL 数据库,然后分析数据库以生成 SARIF 结果。 有关详细信息,请参阅“为 CodeQL 分析准备代码”和“使用 CodeQL 查询分析代码”。

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

每个 CI 服务器都需要 GitHub App 或 personal access token 才能将结果上传到 GitHub,无论你是在使用 CodeQL CLI、REST API 还是其他方法。 必须使用具有 security_events 写入权限的访问令牌或 GitHub App。 如果 CI 服务器已使用具有此作用域的令牌从 GitHub 检出存储库,你可能会使用相同的令牌。 否则,应创建具有 security_events 写入权限的新令牌,然后将其添加到 CI 系统的机密存储中。 有关信息,请参阅“创建 GitHub 应用”和“管理个人访问令牌”。

有关将结果上传到 GitHub 的不同方法的详细信息,请参阅“将 SARIF 文件上传到 GitHub”。

将结果上传到 GitHub

分析代码、生成 SARIF 结果并确保可以使用 GitHub 进行身份验证后,你可以将结果上传到 GitHub。 有关上传结果可使用的不同方法的详细信息,请参阅“将 SARIF 文件上传到 GitHub”。

有关使用 CodeQL CLI 将结果上传到 GitHub 的特定详细信息,请参阅“将 CodeQL 分析结果上传到 GitHub”。

默认情况下, code scanning 预计每个仓库需要一个SARIF 结果文件。 因此,当您上传第二个 SARIF 结果文件进行提交时,将被视为原始数据集的替换。 例如,如果分析工具为它分析的每种语言或使用的每个规则集生成不同的 SARIF 文件,则可能需要上传两个不同的 SARIF 文件以进行一次分析。 如果你想上传多组结果以在存储库中提交,则必须将每组结果标识为唯一的一组结果。 为 SARIF 上传指定类别的方式因分析方法而异。 有关详细信息,请参阅“对代码扫描的 SARIF 支持”。