有些用户更喜欢直接使用 CodeQL 查询源代码,以便对开源共享查询进行工作或贡献。
1. 下载 CodeQL CLI tar 存档
CodeQL CLI 下载包是一个包含工具、脚本和各种 CodeQL 特定文件的 tar 存档。如果您没有 GitHub Enterprise 许可证,那么下载此存档即表示您同意GitHub CodeQL 条款和条件。
您应该从https://github.com/github/codeql-action/releases下载 CodeQL 捆绑包。该捆绑包包含
- CodeQL CLI 产品
- 兼容的查询和库版本,来自https://github.com/github/codeql
- 捆绑包中包含的所有查询的预编译版本
您应始终使用 CodeQL 捆绑包。这可确保兼容性,并且比单独下载 CodeQL CLI 并检出 CodeQL 查询的方式提供更好的性能。如果您只在单一平台上运行 CLI,请下载相应的 codeql-bundle-PLATFORM.tar.zst 文件。或者,您可以下载 codeql-bundle.tar.zst,其中包含所有受支持平台的 CLI。
捆绑包还有 tar.gz 变体,其内容与 tar.zst 变体相同,只是使用效率较低的 gzip 算法进行压缩。下载 tar.gz 变体的唯一原因是您使用的解压工具较旧,不支持 Zstandard 压缩算法。
2. 创建新的 CodeQL 目录
创建一个新目录,以放置 CLI 以及您想使用的任何查询和库。例如,$HOME/codeql-home。
CLI 的内置搜索操作会自动在其所有同级目录中查找用于数据库创建和分析的文件。将这些组件放在单独的目录中,可防止 CLI 搜索不相关的同级目录,同时确保所有文件可用,无需在命令行上指定额外选项。
3. 获取 CodeQL 查询的本地副本
CodeQL 仓库 包含对所有受支持语言进行 CodeQL 分析所需的查询和库。将该仓库的副本克隆到 codeql-home 中。
默认情况下,克隆的仓库根目录将命名为 codeql。请将此文件夹重命名为 codeql-repo,以免与您在第 1 步中解压的 CodeQL CLI 冲突。如果您在命令行使用 git,可以通过在 codeql-home 文件夹中运行 git clone git@github.com:github/codeql.git codeql-repo,一次性完成克隆并重命名仓库的操作。
在此仓库中,查询和库被组织为 CodeQL 包。除了查询本身,CodeQL 包还包含重要的元数据,指示 CodeQL CLI 如何处理查询文件。更多信息请参阅创建和使用 CodeQL 包。
注意
针对不同用户,CodeQL 查询有不同的版本。请检出适合您使用场景的正确版本
- 对于计划与最新 CodeQL CLI 发行版一起使用的查询,请检出标记为
codeql-cli/latest的分支。您应在使用 CodeQL CLI 构建的数据库或近期从 GitHub 下载的数据库时使用此分支。 - 要获取最新的 CodeQL 查询,请检出
main分支。该分支代表 CodeQL 分析的最新版本。
4. 解压 CodeQL CLI tar 存档
将 tar 存档解压到第 2 步创建的目录中。
例如,如果您复制的 CodeQL 仓库路径为 $HOME/codeql-home/codeql-repo,则将 CLI 解压到 $HOME/codeql-home/ 中。
5. 启动 codeql
解压后,您可以通过以下几种方式运行 codeql 可执行文件来执行 CodeQL 进程
- 通过执行
<extraction-root>/codeql/codeql,其中<extraction-root>为您解压 CodeQL CLI 包的文件夹。 - 通过将
<extraction-root>/codeql添加到您的PATH,即可直接使用codeql运行可执行文件。
此时,您可以执行 CodeQL 命令。要查看 CodeQL CLI 命令的完整列表,请参阅CodeQL CLI 命令手册。
6. 验证 CodeQL CLI 设置
CodeQL CLI 提供可执行的子命令,用于验证您是否已正确设置好创建和分析数据库的环境
- 运行
codeql resolve languages可显示可用于创建数据库的语言。这将列出您在 CodeQL CLI 包中默认支持的语言。 - 运行
codeql resolve qlpacks可显示 CLI 能找到的 CodeQL 包。这将展示所有直接供 CodeQL CLI 使用的 CodeQL 包名称。应包括以下内容- 每种受支持语言的查询包,例如
codeql/{language}-queries。这些包包含在每次分析中运行的标准查询。 - 每种受支持语言的库包,例如
codeql/{language}-all。这些包包含查询库,例如控制流和数据流库,对查询编写者可能有用。 - 每种受支持语言的示例包,例如
codeql/{language}-examples。这些包包含有用的 CodeQL 片段,供查询编写者参考。 - 旧版包,确保使用旧产品创建的自定义查询和库与您使用的 CodeQL 版本兼容。
- 每种受支持语言的查询包,例如