Skip to main content

GitHub AE 目前处于受限版。

对编译语言进行 CodeQL 代码扫描

了解自动构建方法 CodeQL 分析如何为编译语言生成代码,并了解如果需要,如何自定义生成命令。

谁可以使用此功能

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

Code scanning 可用于 GitHub AE 中的组织拥有的存储库。 这是一个 GitHub Advanced Security 功能(在 beta 版本期间免费)。 有关详细信息,请参阅“关于 GitHub 高级安全性”。

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

Code scanning 的工作原理是针对一个或多个数据库运行查询。 每个数据库都包含仓库中所有代码的单一语言表示形式。 对于编译语言 C/C++、C#、 和 Java,填充此数据库的过程涉及生成代码和提取数据。

CodeQL 分析存储库中生成的 C/C++、C#、 和 Java 源文件。

基本 CodeQL 分析工作流程 使用 autobuild 操作来生成代码。 或者,可以禁用 autobuild 并改为指定显式生成命令,以仅分析这些自定义命令生成的文件。

通过添加 GitHub Actions 工作流程到仓库,设置 GitHub 对仓库运行 code scanning。 对于 CodeQL code scanning,可以添加 CodeQL 分析工作流程。 有关详细信息,请参阅“配置代码扫描”。

有关最新版本的 CodeQL 中支持的语言、库和框架的信息,请参阅 CodeQL 文档中的“支持的语言和框架”。 有关运行最新版本 CodeQL 的系统要求信息,请参阅 CodeQL 文档中的“系统要求”。

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

关于用于 CodeQL 的 autobuild

CodeQL 分析存储库中生成的 C/C++、C#、 和 Java 源文件。

基本 CodeQL 分析工作流程 使用 autobuild 操作来生成代码。 或者,可以禁用 autobuild 并改为指定显式生成命令,以仅分析这些自定义命令生成的文件。

注意:必须在自托管运行程序上安装所需的软件。 有关自托管运行程序的详细信息,请参阅“托管您自己的运行器”。

适用于 C/C++ 的 autobuild

支持的系统类型系统名称
操作系统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. 运行适当的命令来配置系统。

对于自托管运行器,可能需要安装 gcc 编译器,并且特定项目可能还需要访问 clangmscv 可执行的文件。 还需要安装项目所依赖的生成系统(例如 msbuildmakecmakebazel)和实用工具(例如 pythonperllexyacc)。

适用于 C# 的 autobuild

支持的系统类型系统名称
操作系统Windows、macOS 和 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,按此顺序) 。

对于自托管运行器上的 .NET Core 应用程序开发,需要 .NET SDK(适用于 dotnet)。

对于 .NET Framework 应用程序开发,在 Windows 上需要 Microsoft 生成工具(适用于 msbuild)和 Nuget CLI(适用于 nuget)。 在 Linux 和 macOS 上,需要 Mono 运行时(来运行 monomsbuildnuget)。

适用于 Java

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

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

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

如果使用的是自托管运行器,则应提供所需的 Java 版本:

  • 如果运行器用于分析需要单一版本 Java 的存储库,则需要安装相应的 JDK 版本,并需要将其放在 PATH 变量中(以便找到 javajavac)。

  • 如果运行器用于分析需要多个版本 Java 的存储库,则需要安装相应的 JDK 版本,并且可以通过 toolchains.xml 文件指定。 这是 Apache Maven 通常使用的配置文件,该文件允许指定工具的位置、工具的版本以及使用这些工具所需的任何其他配置。 有关详细信息,请参阅 Apache Maven 文档中的“工具链使用指南”。

以下可执行文件可能是一系列 Java 项目所必需的,并且应该存在于 PATH 变量中,但并非在所有情况下都是必需的:

  • mvn (Apache Maven)
  • gradle (Gradle)
  • ant (Apache Ant)

还需要安装项目所依赖的生成系统(例如 makecmakebazel)和实用工具(例如 pythonperllexyacc)。

添加编译语言的构建步骤

如果 autobuild 失败,或者你想要分析与 autobuild 进程生成的源文件不同的一组源文件,则需要从工作流中删除 autobuild 步骤,并手动添加生成步骤。 对于 C/C++、C#、Go、和 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 不能生成代码的更多提示和技巧,请参阅“编译的语言的自动生成失败”。

如果您为编译语言添加了手动构建步骤,但 code scanning 仍然无法处理您的仓库,请联系 你的企业所有者。