我们经常发布文档更新,此页面的翻译可能仍在进行中。有关最新信息,请访问英文文档。如果此页面上的翻译有问题,请告诉我们

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

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

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

代码扫描 可用于公共仓库,以及具有 Advanced Security 许可的组织拥有的私有仓库。 更多信息请参阅“GitHub 的产品”。

本文内容

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

To enable 代码扫描 for your repository, you add to the repository a GitHub Actions workflow which includes CodeQL analysis. 更多信息请参阅“启用 代码扫描”。 对于 CodeQL 代码扫描,您可以添加 CodeQL 分析工作流程。 默认 代码扫描 工作流程使用 on.push 事件触发代码扫描 - 每次推送到任何包含工作流程文件的分支时触发。

一般情况下无需编辑 代码扫描 的默认工作流程。 但是,如果需要,您可以编辑工作流程以自定义某些设置。 例如,您可以编辑 GitHub 的 CodeQL 分析工作流程 来指定扫描频率、要扫描的语言或目录,以及 CodeQL 代码扫描 在代码中的查找内容。 如果您使用一组特定的命令来编译代码,您可能还需要编辑 CodeQL 分析工作流程。 For general information about configuring 代码扫描 and editing workflow files, see "Configuring 代码扫描" and "Learn GitHub Actions."

关于 CodeQL 的自动构建

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

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

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

:如果使用 GitHub Actions 的自托管运行器,您可能需要安装其他软件才能使用 autobuild 进程。 此外,如果您的仓库需要特定版本的构建工具,您可能需要手动安装它。 更多信息请参阅“GitHub 托管运行器的规范”。

C/C++

支持的系统类型系统名称
操作系统Windows, macOS, and Linux
构建系统Windows: MSbuild and build scripts
Linux and macOS: Autoconf, Make, CMake, qmake, Meson, Waf, SCons, Linux Kbuild, and build scripts

autobuild 步骤的行为因提取运行所在的操作系统而异。 On Windows, the autobuild step attempts to autodetect a suitable build method for C/C++ using the following approach:

  1. Invoke MSBuild.exe on the solution (.sln) or project (.vcxproj) file closest to the root. 如果 autobuild 在顶层目录下的相同深度(最短)检测到多个解决方案或项目文件,它将尝试构建所有这些文件。
  2. Invoke a script that looks like a build script—build.bat, build.cmd, and build.exe (in that order).

On Linux and macOS, the autobuild step reviews the files present in the repository to determine the build system used:

  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, and Linux (no restriction)
构建系统Gradle、Maven 和 Ant

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

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

添加编译语言的构建步骤

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

删除 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 工作流程疑难解答”。

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

此文档对您有帮助吗?

Privacy policy

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

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

做出贡献

或, 了解如何参与。