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

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

If you have write permissions to a repository, you can configure 代码扫描 for that repository.

代码扫描 可用作 GitHub Advanced Security 的一部分,在测试期间免费使用。 更多信息请参阅“关于 GitHub Advanced Security”。

注意:代码扫描 目前处于测试阶段,可能会更改。

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

通过添加 GitHub Actions 工作流程到仓库,设置 GitHub 对仓库运行 代码扫描。 对于 CodeQL 代码扫描,您可以添加 CodeQL 分析工作流程。 更多信息请参阅“为仓库设置 代码扫描”。

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

关于 CodeQL 的自动构建

代码扫描的工作方式是对一个或多个数据库运行查询。 每个数据库都包含仓库中所有代码的单一语言表示形式。 对于编译语言 C/C++、C# 和 Java,填充此数据库的过程涉及构建代码和提取数据。 CodeQL 也运行 Go 项目的构建来设置项目。 但是,与其他编译语言相比,仓库中的所有 Go 文件都是提取的,而不仅仅是构建的文件。 您可以使用自定义构建命令跳过提取未受构建影响的 Go 文件。

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

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

注意:有关如何确定 AE 托管的运行器 已安装所需软件的说明,请参阅“创建自定义映像”。

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.batbuild.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. 调用一个看起来像构建脚本的脚本—buildbuild.sh(对于 Linux,按此顺序)或 build.batbuild.cmdbuild.exe(对于 Windows,按此顺序)。

Java

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

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

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

添加编译语言的构建步骤

如果仓库中的 C/C++、C# 或 Java 代码含有非标准的构建过程,autobuild 可能会失败。 您需要从工作流程中删除 autobuild 步骤,然后手动添加构建步骤。 如果您要指定仓库中的哪个 Go 文件要提取,则需要添加生成步骤。 有关如何编辑工作流程文件的更多信息,请参阅“配置 代码扫描”。

删除 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@v1

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

有关 if 条件的更多信息,请参阅“GitHub 操作的工作流程语法”。

有关为什么 autobuild 无法构建代码的更多提示和技巧,请参阅“CodeQL 工作流程疑难解答”。

如果您为编译语言添加了手动构建步骤,但 代码扫描 仍然无法处理您的仓库,请联系 your site administrator。

此文档对您有帮助吗?

隐私政策

帮助我们创建出色的文档!

所有 GitHub 文档都是开源的。看到错误或不清楚的内容了吗?提交拉取请求。

做出贡献

或, 了解如何参与。