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

为编译的语言配置 CodeQL 工作流

可以配置 GitHub 如何使用 CodeQL 分析工作流程 扫描用编译语言编写的代码以查找漏洞和错误。

谁可以使用此功能

If you have write permissions to a repository, you can configure code scanning for that repository.

Code scanning 可用于 GitHub.com 上的所有公共存储库。 Code scanning 也可用于使用 GitHub Enterprise Cloud 并拥有 GitHub Advanced Security 许可证的组织所拥有的专用存储库。 有关详细信息,请参阅“关于 GitHub 高级安全性”。

关于 CodeQL 分析工作流程 和编译语言

对于 CodeQL code scanning,你可以使用默认设置来分析代码并自动配置 code scanning,也可以使用高级设置来生成你可以编辑的工作流文件。 目前,默认设置不支持任何编译语言,因此必须使用高级设置。 有关详细信息,请参阅“为存储库配置代码扫描”。

一般情况下无需编辑 code scanning 的生成工作流文件。 但是,如果需要,您可以编辑工作流程以自定义某些设置。 例如,可以编辑 GitHub 的 CodeQL 分析工作流程 来指定扫描频率、要扫描的语言或目录,以及 CodeQL code scanning 在代码中查找的内容。 如果使用一组特定的命令来编译代码,可能还需要编辑 CodeQL 分析工作流程。有关配置 code scanning 和编辑工作流文件的一般信息,请参阅“自定义代码扫描”和“了解 GitHub Actions”。

关于 CodeQL 的自动构建

Code scanning 的工作原理是针对一个或多个数据库运行查询。 每个数据库都包含仓库中所有代码的单一语言表示形式。 对于编译语言 C/C++、C#、 Go、Kotlin 和 Java,填充此数据库的过程涉及构建代码和提取数据。 对于这些语言,CodeQL 分析生成的存储库中的源文件。 对于上述任何语言,可以禁用 autobuild 并改用自定义生成命令,以仅分析这些自定义命令生成的文件。

对于受支持的编译语言,你可使用 CodeQL 分析工作流程 中的 autobuild 操作来生成代码。 这样就无需为 C/C++、C#、Go、Kotlin 和 Java 指定显式生成命令。

如果你的工作流使用 language 矩阵,autobuild 会尝试生成矩阵中列出的每种编译语言。 如果不使用矩阵,则 autobuild 会尝试生成在存储库中具有最多源文件的受支持编译语言。 除 Go 以外,除非您提供明确的构建命令,否则您仓库中其他编译语言的分析将失败。

注意:如果使用 GitHub Actions 的自承载运行器,则可能需要安装其他软件才能使用 autobuild 进程。 此外,如果您的仓库需要特定版本的构建工具,您可能需要手动安装它。 有关详细信息,请参阅“关于 GitHub 托管的运行程序”。

C/C++

支持的系统类型系统名称
操作系统Windows、macOS 和 Linux
构建系统Windows:MSbuild 和生成脚本
Linux 和 macOS:Autoconf、Make、CMake、qmake、Meson、Waf、SCons、Linux Kbuild 和生成脚本

autobuild 步骤的行为因运行提取的操作系统而异。 在 Windows 上,autobuild 步骤尝试使用以下方法自动检测适合 C/C++ 的生成方法:

  1. 对离根最近的解决方案 (.sln) 或项目 (.vcxproj) 文件调用 MSBuild.exe。 如果 autobuild 在顶层目录下的相同(最短)深度检测到多个解决方案或项目文件,它将尝试生成所有这些文件。
  2. 调用看起来像生成脚本的脚本:build.bat、build.cmd 和 build.exe(按此顺序) 。

在 Linux 和 macOS 上,autobuild 步骤检查存储库中存在的文件,以确定使用的生成系统:

  1. 在根目录中查找构建系统。
  2. 如果未找到,则搜索子目录以查找含有 C/C++ 构建系统的唯一目录。
  3. 运行适当的命令来配置系统。

C#

支持的系统类型系统名称
操作系统Windows 和 Linux
构建系统.NET 和 MSbuild,以及构建脚本

autobuild 进程尝试使用以下方法自动检测适合 C# 的构建方法:

  1. 对离根最近的解决方案 (.sln) 或项目 (.csproj) 文件调用 dotnet build
  2. 对离根最近的解决方案或项目文件调用 MSbuild (Linux) 或 MSBuild.exe (Windows)。 如果 autobuild 在顶层目录下的相同(最短)深度检测到多个解决方案或项目文件,它将尝试生成所有这些文件。
  3. 调用看起来像生成脚本的脚本:build 和 build.sh(对于 Linux,按此顺序)或 build.bat、build.cmd 和 build.exe(对于 Windows,按此顺序) 。

Go

支持的系统类型系统名称
操作系统Windows、macOS 和 Linux
构建系统Go 模块、dep 和 Glide,以及生成脚本,包括 Makefiles 和 Ninja 脚本

autobuild 过程尝试在提取所有 .go 文件之前自动检测安装 Go 存储库所需的依赖项的合适方法:

  1. 调用 makeninja./build./build.sh(按该顺序),直到其中一个命令成功,后续 go list ./... 也成功,这表示已安装所需的依赖项。
  2. 如果这些命令都没有成功,请查找 go.modGopkg.tomlglide.yaml,并分别运行 go get(除非正在使用供应商)、dep ensure -vglide install 以尝试安装依赖项。
  3. 最后,如果未找到这些依赖项管理器的配置文件,请重新排列适合添加到 GOPATH 的存储库目录结构,并使用 go get 安装依赖项。 提取完成后,目录结构恢复为正常。
  4. 提取存储库中的所有 Go 代码,类似于运行 go build ./...

Java 和 Kotlin

支持的系统类型系统名称
操作系统Windows、macOS 和 Linux(无限制)
构建系统Gradle、Maven 和 Ant

autobuild 进程尝试通过应用此策略来确定 Java 代码库的生成系统:

  1. 在根目录中搜索构建文件。 先后检查 Gradle、Maven 和 Ant 构建文件。
  2. 运行找到的第一个构建文件。 如果 Gradle 和 Maven 文件都存在,则使用 Gradle 文件。
  3. 否则,在根目录的直接子目录中搜索构建文件。 如果只有一个子目录包含构建文件,则运行该子目录中标识的第一个文件(使用与 1 相同的首选项)。 如果多个子目录包含构建文件,则报告错误。

添加编译语言的构建步骤

如果 autobuild 失败,或者你想要分析与 autobuild 进程生成的源文件不同的一组源文件,则需要从工作流中删除 autobuild 步骤,并手动添加生成步骤。 对于 C/C++、C#、Go、Kotlin 和 Java 项目,CodeQL 将分析由指定的生成步骤生成的任何源代码。有关如何编辑工作流文件的信息,请参阅“自定义代码扫描”。

删除 autobuild 步骤后,取消注释 run 步骤并添加适合存储库的生成命令。 工作流 run 步骤会使用操作系统的 shell 来运行命令行程序。 可以修改这些命令并添加更多命令以自定义生成过程。

- run: |
    make bootstrap
    make release

要详细了解 run 密钥,请参阅“GitHub Actions 的工作流语法”。

如果存储库包含多个编译语言,可以指定特定于语言的生成命令。 例如,如果存储库包含 C/C++、C# 和 Java,而 autobuild 正确生成了 C/C++ 和 C#,但未能生成 Java,那么在 init 步骤之后,可以在工作流中使用以下配置。 这指定了 Java 的生成步骤,同时仍然为 C/C++ 和 C# 使用 autobuild

- if: matrix.language == 'cpp' || matrix.language == 'csharp'
  name: Autobuild
  uses: github/codeql-action/autobuild@v2

- if: matrix.language == 'java'
  name: Build Java
  run: |
    make bootstrap
    make release

有关 if 条件的详细信息,请参阅“GitHub Actions 的工作流语法”。

有关为什么 autobuild 不能生成代码的更多提示和技巧,请参阅“对 CodeQL 的高级设置进行故障排除”。

如果您为编译语言添加了手动构建步骤,但 code scanning 仍然无法处理您的仓库,请联系 GitHub 支持