Skip to main content

发布及使用 CodeQL 包

共享或下载 CodeQL 包,然后分析 CodeQL 数据库。

谁可以使用此功能?

CodeQL 可用于以下存储库类型:

在 GitHub Enterprise Server 上使用 CodeQL 包

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

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

registries:
- packages:
  - 'codeql/*'
  - 'other-org/*'
  # Container registry on GitHub.com
  url: https://ghcr.io/v2/
- packages: '*'
  # Container registry hosted at `https://GHE_HOSTNAME`
  url: https://containers.GHE_HOSTNAME/v2/

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

          `registries` 列表也可以放在 `codeql-workspace.yml` 文件中。 这样,便可定义要在特定工作区中使用的注册表,以便可在工作区的其他 CodeQL 用户之间共享该注册表。 
          `registries` 中的 `codeql-workspace.yml` 列表将与全局 `qlconfig.yml` 中的列表合并,并优先于后者。 有关 `codeql-workspace.yml` 的详细信息,请参阅 [AUTOTITLE](/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/about-codeql-workspaces#about-codeql-workspaces)。

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

对 GitHub Container registries 进行身份验证

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

在 GitHub.com

上对 Container registries 进行身份验证

您可以通过两种方式对 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 registries 进行身份验证

同样,可以在 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 令牌或该 Container registry 的 personal access token。 这可确保每个令牌仅传递到指定的 Container registry。

例如,以下注册表身份验证字符串指定 CodeQL CLI 应按如下所示进行身份验证:

  • 使用令牌 <token1> 向 GitHub.com 上的 Container registry 进行身份验证。
  • 使用令牌 <token2> 对位于 https://containers.GHE_HOSTNAME/v2/ 的企业的 Container registry 进行身份验证。
https://ghcr.io/v2/=<token1>,https://containers.GHE_HOSTNAME/v2/=<token2>

发布 CodeQL 包

若要与其他人共享你的 CodeQL 包,你可以将其发布到 Container registry。

在发布前配置 qlpack.yml 文件

注意

本文介绍了 GitHub Enterprise Server 3.16 的初始发行版中包含的 CodeQL CLI 2.20.3 捆绑包中可用的功能。

如果站点管理员已将 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>
defaultSuite: # optional, one or more queries in the pack to run by default
    - query: <relative-path>/query-file>.ql
defaultSuiteFile: 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:` 必须采用 `<scope>/<pack>` 格式,其中 `<scope>` 是将发布到的 GitHub 组织,`<pack>` 是包的名称。
    
  • 最多只能选择 defaultSuitedefaultSuiteFile 中的一个。 有两种不同的方法来定义要运行的默认查询套件,第一种是直接在 qlpack.yml 文件中指定查询,第二种是在包中指定查询套件。

正在运行 codeql pack publish

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

codeql pack publish

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

注意

如果要将模型包发布到 GitHub Container registry,以便将覆盖范围扩展到组织中的所有存储库作为默认设置配置的一部分,则需要确保运行代码扫描的存储库可以访问这些模型包。 有关详细信息,请参阅 编辑默认设置配置配置包的访问控制和可见性

下载现有CodeQL包

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

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` 命令将其下载的包存储在不用于本地修改的内部位置。 如果在下载后修改包,可能会导致意外(且很难进行排除故障)的行为。 有关自定义包的详细信息,请参阅 [AUTOTITLE](/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/creating-and-working-with-codeql-packs)。