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 文件

注意:本文介绍了 GitHub Enterprise Server 3.7 的初始发行版中包含的 CodeQL CLI 2.10.5 捆绑包中可用的功能。

如果站点管理员已将 CodeQL CLI 版本更新为较新版本,请参阅本文的 GitHub Enterprise Cloud 版本,了解有关最新功能的信息。

可以在发布之前检查和修改 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 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>

在 GitHub Enterprise Server 上使用 CodeQL 包

默认情况下,CodeQL CLI 预期从 GitHub.com 上的 Container registry 下载 CodeQL 包,并将这些包发布到此位置。 不过,也可通过创建 qlconfig.yml 文件来告知 CLI 每个包使用哪个 Container registry,使用 GitHub Enterprise Server 上的 Container registry 中的 CodeQL 包。

使用首选文本编辑器创建 ~/.codeql/qlconfig.yml 文件,并添加条目来指定要用于一个或多个包名称模式的注册表。 例如,以下 qlconfig.yml 文件将所有包与位于 GHE_HOSTNAME 的 GitHub Enterprise Server 的 Container registry 进行关联,但与 codeql/\* 匹配的包除外,它们与 GitHub.com 上的 Container registry 关联:

registries:
- packages:
  - 'codeql/*'
  - 'other-org/*'
  url: https://ghcr.io/v2/
- packages: '*'
  url: https://containers.GHE_HOSTNAME/v2/

CodeQL CLI 将通过查找 registries 列表中具有与该包名称匹配的 packages 属性的第一项来确定要用于给定包名称的注册表。 这意味着,通常需要先定义最具体的包名称模式。 packages 属性可以是单个包名称、glob 模式,也可以是包名称和 glob 模式的 YAML 列表。

registries 列表也可以放在 codeql-workspace.yml 文件中。 这样,便可定义要在特定工作区中使用的注册表,以便可在工作区的其他 CodeQL 用户之间共享该注册表。 codeql-workspace.yml 中的 registries 列表将与全局 qlconfig.yml 中的列表合并,并优先于后者。 有关 codeql-workspace.yml 的详细信息,请参阅关于 CodeQL 工作区

现在可以使用 codeql pack publishcodeql pack downloadcodeql database analyze 来管理 GitHub Enterprise Server 上的包。

对 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。

同样,可以向 GitHub Enterprise Server Container registry 进行身份验证,或者通过两种方式同时向多个注册表进行身份验证(例如,从多个注册表下载或运行专用包):

  1. --registries-auth-stdin 选项传递给 CodeQL CLI,然后通过标准输入提供注册表身份验证字符串。
  2. CODEQL_REGISTRIES_AUTH 环境变量设置为注册表身份验证字符串。

注册表身份验证字符串是一个逗号分隔的 <registry-url>=<token> 对列表,其中 registry-url 是 Container registry URL(例如 https://containers.GHE_HOSTNAME/v2/),token 是 GitHub Apps 令牌或该 GitHub Container registry 的 personal access token。 这可确保每个令牌仅传递到指定的 Container registry。 例如,以下注册表身份验证字符串指定 CodeQL CLI 应使用 <token1> 令牌向 GitHub.com 上的 Container registry 进行身份验证,使用 GHE_HOSTNAME 令牌向位于 <token2> 的 GHES 实例的 Container registry 进行身份验证:

https://ghcr.io/v2/=<token1>,https://containers.GHE_HOSTNAME/v2/=<token2>