Skip to main content
我们经常发布文档更新,此页面的翻译可能仍在进行中。 有关最新信息,请访问英语文档

发布及使用 CodeQL 包

你可发布自己的 CodeQL 包,也可使用其他人发布的包。

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

如果你有 GitHub Enterprise 帐户和GitHub Advanced Security 许可证,则可以使用 CodeQL 进行自动分析、持续集成和持续交付。 可以通过联系销售团队来创建企业帐户。 有关详细信息,请参阅“关于 GitHub 高级安全性”。

注意:本文已于 2023 年 1 月从 CodeQL 文档网站迁移。

注意:CodeQL 包管理功能(包括 CodeQL 包)目前作为 beta 版本提供,可能会发生变化。 在 beta 版本发布期间,CodeQL 包只能使用 GitHub 包,即 Container registry。 若要使用此 beta 版本功能,请从以下位置安装最新版本的 CodeQL CLI 捆绑包: https://github.com/github/codeql-action/releases

在发布前配置 qlpack.yml 文件

可以在发布之前检查和修改 CodeQL 包的配置详细信息。 在你喜欢的文本编辑器中打开 qlpack.yml 文件。

library: # set to true if the pack is a library. Set to false or omit for a query pack
name: <scope>/<pack>
version: <x.x.x>
description: <Description to publish with the package>
default-suite: # optional, one or more queries in the pack to run by default
    - query: <relative-path>/query-file>.ql
default-suite-file: default-queries.qls # optional, a pointer to a query-suite in this pack
license: # optional, the license under which the pack is published
dependencies: # map from CodeQL pack name to version range
  • name: 必须采用 / 格式,其中 是将发布到的 GitHub 组织, 是包的名称。

  • 最多只能选择 default-suitedefault-suite-file 中的一个。 有两种不同的方法来定义要运行的默认查询套件,第一种是直接在 qlpack.yml 文件中指定查询,第二种是在包中指定查询套件。

正在运行 codeql pack publish

准备好将包发布到 GitHub Container registry 时,可在包目录的根目录中运行以下命令:

codeql pack publish

已发布的包将显示在 GitHub 组织的“包”部分中,该组织由 qlpack.yml 文件中的范围指定。

正在运行 codeql pack download <scope>/<pack>

若要运行其他人创建的包,必须先运行以下命令来下载它:

codeql pack download <scope>/<pack>@x.x.x
  • <scope>:将从中下载的 GitHub 组织的名称。
  • <pack>:要下载的包的名称。
  • @x.x.x:可选版本号。 如果省略,将下载最新版本。

此命令接受多个包的参数。

如果编写脚本来指定要下载的查询包的特定版本号,请记住,在将 CodeQL 的版本更新为更新的版本时,可能还需要切换到更新的查询包版本。 与固定到非常旧的版本的查询包一起使用时,较新版本的 CodeQL 可能会导致性能降低。 有关详细信息,请参阅“关于 CodeQL 包兼容性”。

使用 CodeQL 包分析 CodeQL 数据库

若要使用 CodeQL 包分析 CodeQL 数据库,请运行以下命令:

codeql database analyze <database> <scope>/<pack>@x.x.x:<path>
  • <database>:要分析的 CodeQL 数据库。
  • <scope>:将包发布到的 GitHub 组织的名称。
  • <pack>:正在使用的包的名称。
  • @x.x.x:可选版本号。 如果省略,将使用最新版本。
  • :<path>:查询、目录或查询套件的可选路径。 如果省略,将使用包的默认查询套件。

analyze 命令将运行任何指定的 CodeQL 包的默认套件。 可以指定多个用于分析 CodeQL 数据库的 CodeQL 包。 例如:

codeql <database> analyze <scope>/<pack> <scope>/<other-pack>

注意:codeql pack download 命令将其下载的包存储在不用于本地修改的内部位置。 如果在下载后修改包,可能会导致意外(且很难进行排除故障)的行为。 有关自定义包的详细信息,请参阅“创建和使用 CodeQL 包”。

关于 CodeQL 包兼容性

发布查询包时,它包括其中所有查询的预编译表示形式。 与在分析期间从头开始编译 QL 源相比,这些预编译查询的执行速度通常要快得多。 但是,预编译的查询也依赖于 QL 计算器的某些内部信息,因此如果执行分析的 CodeQL 的版本与运行 codeql pack publish 的版本差异太大,则可能需要改为在分析期间从源编译查询。 重新编译会自动进行,不会影响分析的结果,但会使分析速度明显变慢。

通常可以假设,如果包发布时包含 CodeQL 的一个版本,则 CodeQL 的更高版本可直接使用其中的预编译查询,只要发布日期之间的间隔不超过 6 个月即可。 我们将做出合理的努力,使新版本的兼容性保持更长时间,但不做出任何承诺。

还可以假设由 CodeQL 的最新公开版本发布的包可供 code scanning 和 GitHub Actions 使用的 CodeQL 版本使用,即使该版本通常略微更旧也是如此。

上述情形的例外情况是,使用低于 2.12.0 的 CodeQL 版本发布的包与任何更低或更高版本不兼容。 这些旧版本未按支持版本之间兼容性的格式编写预编译的查询。 这些版本发布的包仍可由较新版本使用,但分析速度更慢,因为必须先重新编译查询。

作为已发布的查询包的用户,你可通过检查使用查询包的分析运行中的终端输出来检查 CodeQL 是否利用了其中预编译的查询。 如果它包含如下所示的行,则已成功使用预编译的查询:

[42/108] Loaded /long/path/to/query/Filename.qlx.

但是,如果它们如下所示,则未能使用预编译的查询:

Compiling query plan for /long/path/to/query/Filename.ql.
[42/108 comp 25s] Compiled /long/path/to/query/Filename.ql.

在这种情况下,分析结果仍然不错,但为了获得最佳性能,可能需要升级到 CodeQL CLI 和/或查询包的更新版本。

如果你在 GitHub.com 上的 Container registry 上发布查询包供其他人使用,建议使用最新版本的 CodeQL 来运行 codeql pack publish,并在使用的版本已过 6 个月之前发布包含 CodeQL 更新版本的包的新版本。 这样,你可确保将 CodeQL 保持最新状态的包用户将受益于包中预编译的查询。

如果发布查询包的目的是在使用其捆绑的 CodeQL 二进制文件的 GitHub Enterprise Server 安装上使用查询包,请使用相同的 CodeQL 版本来运行 codeql pack publish。 较新版本可能会生成预编译的查询,而 GitHub Enterprise Server 中的查询可能无法识别。 GitHub Enterprise Server 管理员可选择定期升级到更新版本的 CodeQL。 如果是,请按照其指示操作。

对 GitHub Container registries 进行身份验证

可通过向相应的 GitHub Container registry 进行身份验证来发布包和下载专用包。

可通过两种方式向 GitHub.com 上的 Container registry 进行身份验证:

  1. --github-auth-stdin 选项传递给 CodeQL CLI,然后通过标准输入提供 GitHub Apps 令牌或 personal access token。
  2. GITHUB_TOKEN 环境变量设置为 GitHub Apps 令牌或 personal access token。