自定义代码扫描的语言和版本
默认情况下,CodeQL 代码扫描通过一个自动生成功能,可支持多种语言。 但是,如果代码使用非标准生成过程,可能需要使用自定义生成步骤来自定义工作流。
此单元介绍如何更改代码扫描所分析的语言,以及如何将自定义生成步骤添加到 CodeQL 代码扫描工作流中。
更改分析的语言
CodeQL 代码扫描可自动检测以以下支持的语言编写的代码:C/C++、C#、Go、Java、JavaScript/TypeScript、Python 和 Ruby。
注意
CodeQL 不断更新其支持的语言和框架,以获取可用语言、变体和编译器的完整列表,请参阅文档[7]。
默认的 CodeQL 分析工作流文件包含名为“语言”的生成矩阵,该矩阵列出了存储库中分析的语言。 将代码扫描添加到存储库时,CodeQL 会自动填充此矩阵。 使用语言矩阵可以优化 CodeQL,使其能够并行运行每个分析。 由于并行生成的性能优势,建议所有工作流都采用此配置。
如果存储库包含的代码支持多种语言,可以选择要分析的语言。 有几种原因可能使你想阻止对某种语言进行分析。 例如,项目中可能有其他语言的代码主体依赖项,你可能不想看到这些依赖项的警报。
如果工作流使用语言矩阵,CodeQL 会进行硬编码,以便仅分析矩阵中的语言。 若要更改要分析的语言,请编辑 matrix 变量的值。 可以删除一种语言,以防止对其进行分析,也可以添加在设置代码扫描时存储库中不存在的语言。 例如,如果在设置代码扫描时存储库最初只包含 JavaScript,而后来添加了 Python 代码,则需要向矩阵中添加 python
。
jobs:
analyze:
name: Analyze
...
strategy:
fail-fast: false
matrix:
language: ['javascript', 'python']
如果工作流不包含名为语言的矩阵,则 CodeQL 将配置为按顺序运行分析。 如果未在工作流中指定语言,则 CodeQL 会自动检测存储库中任何受支持的语言,并尝试对其进行分析。 如果要选择要分析的语言,而不使用矩阵,则可以在 init
操作下使用相应语言参数。
- uses: github/codeql-action/init@v1
with:
languages: cpp, csharp, python
代码扫描的自定义生成步骤
对于支持的编译语言,可以使用 CodeQL 分析工作流中的自动生成操作生成代码。 这避免了为 C/C++、C# 和 Java 指定显式生成命令。 CodeQL 还运行了一个 Go 项目的生成,用于设置项目。 但与其他编译的语言不同,存储库中的所有文件都将被提取,而不只是生成的文件。 可以使用自定义生成命令跳过提取生成不会接触到的 Go 文件。
为编译的语言添加生成步骤
如果存储库中的 C/C++、C# 或 Java 代码有非标准生成过程,autobuild
可能会失败。 这种情况需要从工作流中删除 autobuild
步骤,并手动添加生成步骤。
删除 autobuild
步骤后,取消注释运行步骤并添加适合存储库的生成命令。 工作流运行步骤会使用操作系统的 shell 来运行命令行程序。 可以修改这些命令并添加更多命令以自定义生成过程。
- run: |
make bootstrap
make release
如果存储库包含多个编译语言,可以指定特定于语言的生成命令。 例如,如果存储库包含 C/C++、C# 和 Java,而 autobuild
正确生成了 C/C++ 和 C#,但未能生成 Java,那么在初始化步骤之后,可以在工作流中使用以下配置。 这指定了 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