使用 CodeQL 自定义代码扫描工作流 - 第 1 部分

已完成

使用 CodeQL 的代码扫描工作流具有各种配置选项,你可以调整这些选项以更好地满足组织的需求。

使用 CodeQL 扫描代码时,CodeQL 分析引擎会从代码生成数据库并对其运行查询。 CodeQL 分析使用一组默认查询,但除了默认查询外,还可以指定运行其他查询。

如果这些查询属于发布到 GitHub 容器注册表的 CodeQL 包(beta),或者存储在存储库中的 QL 包,则可以运行额外的查询。

可以通过两个选项指定要在 CodeQL 代码扫描中运行的查询:

  • 使用代码扫描工作流
  • 使用自定义配置文件

本单元将介绍如何编辑工作流文件以引用其他查询,如何使用查询包中的查询,以及如何合并来自工作流文件的查询和自定义配置文件的查询。

在工作流文件中指定其他查询

可用于指定要运行的其他查询的选项有:

  • 使用 packs 安装一个或多个 CodeQL 查询包 (beta) 并运行这些包的默认查询套件或查询。
  • 使用 queries 指定单个 .ql 文件、包含多个 .ql 文件的目录、一个 .qls 查询套件定义文件或任意组合。

可以在同一工作流中同时使用包和查询。

不建议直接从 github/codeql 存储库引用查询套件,如 github/codeql/cpp/ql/src@main。 这类查询可能不会使用与其他查询相同的 CodeQL 版本进行编译,这可能会在分析期间导致错误。

使用 CodeQL 查询包

注意

CodeQL 包管理功能(包括 CodeQL 包)目前为 beta 版本,可能会发生变化。

要添加一个或多个 CodeQL 查询包 (beta),请在工作流的 with: packs: 部分中添加一个 uses: github/codeql-action/init@v1 条目。 在包中,可以指定要使用的一个或多个包,此外,还可以指定要下载的版本。 在未指定版本的情况下,将下载最新版本。 如果要使用不可公开使用的包,则需要将 GITHUB_TOKEN 环境变量设置为有权访问包的机密。

在下面的示例中,范围是发布包的组织或个人帐户。 工作流运行时,将从 GitHub 下载三个 CodeQL 查询包,并会运行每个包的默认查询或查询套件。 在以下示例中,列表中的每个包都将根据其规格下载:

  • 下载最新版本 pack1 ,并运行所有默认查询。
  • 下载版本 1.2.3 pack2 ,并运行所有默认查询。
  • 下载与版本 3.2.1 兼容的最新版本 pack3 ,并运行所有查询。
  • 已下载 pack4 的 4.5.6 版本,并只运行在 path/to/queries 中找到的查询。
- uses: github/codeql-action/init@v3
  with:
    # Comma-separated list of packs to download
    packs: scope/pack1,scope/pack2@1.2.3,scope/pack3@~3.2.1,scope/pack4@4.5.6:path/to/queries

注意

对于为多种语言生成 CodeQL 数据库的工作流,必须改为在配置文件中指定 CodeQL 查询包。

使用 QL 包中的查询

若要添加一个或多个查询,请在工作流的 with: queries: 部分中添加一个 uses: github/codeql-action/init@v3 条目。 如果查询在专用存储库中,请使用 external-repository-token 参数来指定具有签出专用存储库访问权限的令牌。

- uses: github/codeql-action/init@v3
  with:
    # Comma-separated list of queries / packs / suites to run.
    # This may include paths or a built in suite, for example:
    # security-extended or security-and-quality.
    queries: security-extended
    # Optional. Provide a token to access queries stored in private repositories.
    external-repository-token: ${{ secrets.ACCESS_TOKEN }}

还可以在 queries 的值中指定查询套件。 查询套件是查询的集合,通常按用途或语言进行分组。

以下查询套件内置于 CodeQL 代码扫描中,并可供使用:

查询套件 说明
security-extended 来自默认套件的查询,以及较低严重性和精度查询
security-and-quality 来自 security-extended 的查询,以及可维护性和可靠性查询。

其中每个查询套件都包含该语言的内置 CodeQL 查询包中随附的不同查询子集。 查询套件是使用每个查询的元数据自动生成的。

指定查询套件时,除了默认的一组查询外,CodeQL 分析引擎还将运行该套件中包含的查询。

合并工作流文件和自定义配置文件中的查询

如果还使用配置文件进行自定义设置,则将使用工作流中指定的任意其他包或查询,而不是配置文件中指定的包或查询。 如何要运行一组额外的包或查询的组合,请在工作流中的 packsqueries 的值前面加上 + 符号。

在下面的示例中,+ 符号确保指定的附加包和查询与引用的配置文件中指定的任何包和查询一起使用:

- uses: github/codeql-action/init@v3
  with:
    config-file: ./.github/codeql/codeql-config.yml
    queries: +security-and-quality,octo-org/python-qlpack/show_ifs.ql@main
    packs: +scope/pack1,scope/pack2@1.2.3,scope/pack3@4.5.6:path/to/queries