关于 CodeQL 分析工作流程 和编译语言
You set up GitHub to run 代码扫描 for your repository by adding a GitHub Actions workflow to the repository. 对于 CodeQL 代码扫描,您可以添加 CodeQL 分析工作流程。 For more information, see "Setting up 代码扫描 for a repository."
一般情况下无需编辑 代码扫描 的默认工作流程。 但是,如果需要,您可以编辑工作流程以自定义某些设置。 例如,您可以编辑 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 以外,除非您提供明确的构建命令,否则您仓库中其他编译语言的分析将失败。
注:如果使用 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# 构建方法:
- 在最接近根目录的解决方案 (
.sln
) 或项目 (.vcxproj
) 文件上调用MSBuild.exe
。 如果autobuild
在顶层目录下的相同深度(最短)检测到多个解决方案或项目文件,它将尝试构建所有这些文件。 - 调用看起来像构建脚本的脚本—build.bat、build.cmd 和 build.exe(按此顺序)。
在 Linux 和 macOS 上,autobuild
步骤检查仓库中存在的文件,以确定所使用的构建系统:
- 在根目录中查找构建系统。
- 如果未找到,则搜索子目录以查找含有 C/C++ 构建系统的唯一目录。
- 运行适当的命令来配置系统。
C
支持的系统类型 | 系统名称 |
---|---|
操作系统 | Windows 和 Linux |
构建系统 | .NET 和 MSbuild,以及构建脚本 |
autobuild
进程尝试使用以下方法自动检测合适的 C# 构建方法:
- 在最接近根目录的解决方案 (
.sln
) 或项目 (.csproj
) 文件上调用dotnet build
。 - 在最接近根目录的解决方案或项目文件上调用
MSbuild
(Linux) 或MSBuild.exe
(Windows)。 如果autobuild
在顶层目录下的相同深度(最短)检测到多个解决方案或项目文件,它将尝试构建所有这些文件。 - 调用一个看起来像构建脚本的脚本—build 和 build.sh(对于 Linux,按此顺序)或 build.bat、build.cmd 和 build.exe(对于 Windows,按此顺序)。
Java
支持的系统类型 | 系统名称 |
---|---|
操作系统 | Windows、macOS 和 Linux(无限制) |
构建系统 | Gradle、Maven 和 Ant |
autobuild
进程尝试通过应用此策略来确定 Java 代码库的构建系统:
- 在根目录中搜索构建文件。 先后检查 Gradle、Maven 和 Ant 构建文件。
- 运行找到的第一个构建文件。 如果 Gradle 和 Maven 文件都存在,则使用 Gradle 文件。
- 否则,在根目录的直接子目录中搜索构建文件。 如果只有一个子目录包含构建文件,则运行该子目录中标识的第一个文件(使用与 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 支持 或 GitHub 高级支持。