比较构建模式
| 构建模式特性 | 无 | 自动构建 | 手册 |
|---|---|---|---|
| 默认设置以及组织级启用时使用 | 是(C/C++、C#、Java 和 Rust) | 是,当 none 不受支持时 | 否 |
| 分析在无需用户配置的情况下成功 | 是 | 变量 | 否 |
| 分析的完整性 | 未分析生成的代码 | 变量 | 用户控制 |
| 分析的准确性 | 良好 | 良好 | 最佳 |
选择构建模式
当您首次设置代码扫描,或在多个仓库之间进行设置时,最好使用默认设置。默认设置使用可用的最简方法生成 CodeQL 数据库并分析您的代码,以便您能够尽快开始修复警报。在解决了初始警报后,您可能希望为高风险仓库切换到使用手动构建过程的高级设置。
有关特定语言的 autobuild 行为、运行程序要求以及编译语言的构建模式详情,请参阅 编译语言的 CodeQL 构建选项和步骤。
在多语言仓库中使用多种构建模式
对于包含多种编译语言的仓库,您可以为不同语言使用不同的构建模式。例如,如果您的仓库包含 C/C++、C# 和 Java,您可能希望为某种语言(此处为 C/C++)提供手动构建步骤。此工作流为每种语言指定了不同的构建模式。
strategy:
matrix:
include:
# Analyzes C and C++ code using the commands in `Build C and C++ code`
- language: c-cpp
build-mode: manual
# Analyzes C# code by automatically detecting a build
- language: csharp
build-mode: autobuild
# Analyzes Java code directly from the codebase without a build
- language: java-kotlin
build-mode: none # analyzes Java only
steps:
- name: Checkout repository
uses: actions/checkout@v5
# Initializes CodeQL tools and creates a codebase for analysis.
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
- if: ${{ matrix.build-mode == 'manual' }}
name: Build C and C++ code
run: |
echo 'If you are using a "manual" build mode for one or more of the' \
'languages you are analyzing, replace this with the commands to build' \
'your code, for example:'
echo ' make bootstrap'
echo ' make release'
exit 1
有关在最新版本的 CodeQL 中支持的语言、库和框架的信息,请参阅 CodeQL 文档中的受支持的语言和框架。有关运行最新版本 CodeQL 的系统要求,请参阅 CodeQL 文档中的系统要求。
为 CodeQL 启用依赖缓存
对于默认设置工作流,仅在 GitHub 托管的运行程序上且在公共和私有仓库中启用依赖缓存。
对于高级设置工作流,默认情况下禁用依赖缓存。要为 CodeQL 启用依赖缓存,请在高级设置工作流中对 CodeQL 操作使用 dependency-caching 设置。此设置接受以下值:
false/none/off:禁用依赖缓存(默认)restore:仅恢复已有缓存,不存储新缓存store:仅存储新缓存,不恢复已有缓存true/full/on:恢复已有缓存并存储新缓存
例如,以下设置将为 CodeQL 操作启用依赖缓存
# Initializes CodeQL with dependency caching enabled
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: java
dependency-caching: true
为 CodeQL 使用 none 构建模式
对于 C/C++、C#、Java 和 Rust,除非仓库中还包含 Kotlin 代码,否则在为代码扫描启用默认设置时,CodeQL 会在不需要构建的情况下创建数据库。如果仓库在 Java 代码之外还包含 Kotlin 代码,则默认设置将使用自动构建过程启用,因为 Kotlin 分析需要构建。
如果在没有构建的情况下创建 CodeQL 数据库,可能会导致结果的准确性低于使用 autobuild 或手动构建步骤的情况,具体如下:
- 构建脚本无法查询依赖信息,且依赖猜测不准确。
- 仓库通常在构建过程中生成代码。
要使用 autobuild 或手动构建步骤,您可以使用高级设置。
注意
对于 Java 分析,如果 build-mode 设置为 none 且仓库中发现 Kotlin 代码,则 Kotlin 代码将不被分析并产生警告。请参阅 编译语言的 CodeQL 构建选项和步骤。
为 CodeQL 使用 autobuild
CodeQL 操作在以下情况下使用 autobuild 分析编译语言。
- 默认设置已启用且该语言不支持
none构建(支持 C/C++、C#、Java 和 Rust)。 - 已启用高级设置且工作流指定了
build-mode: autobuild。 - 已启用高级设置且工作流为该语言使用了
autobuild操作的 Autobuild 步骤(github/codeql-action/autobuild@v4)。
使用 build-mode 选项
# Initializes the CodeQL tools for scanning.
name: Analyze
strategy:
matrix:
include:
# Analyze C and C++ code
- language: c-cpp
build-mode: autobuild
# Analyze Go code
- language: go
build-mode: autobuild
steps:
- uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
使用 Autobuild 步骤
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v4
手动指定构建步骤
仅当您已启用高级设置时才能手动指定构建步骤,请参阅 代码扫描的高级设置配置。
如果 autobuild 失败,或您希望分析与 autobuild 过程构建的源文件不同的一组源文件,则需要执行以下操作
- 如果您的工作流为该语言指定了构建模式,请将构建模式更改为
manual。 - 如果您的工作流包含
autobuild步骤,请在工作流中删除或注释掉该autobuild步骤。
然后取消注释 run 步骤,并手动指定要使用的构建过程。对于 C/C++、C#、Go、Java、Kotlin 和 Swift,CodeQL 将分析您指定的构建步骤所生成的任何源代码。
更新工作流,将 build-mode 定义为 manual。
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
build-mode: manual
- uses: github/codeql-action/analyze@v4
with:
category: "/language:${{ matrix.language }}"
或者,更新工作流,注释掉 “Autobuild” 步骤。
# Autobuild attempts to build any compiled languages.
# - name: Autobuild
# uses: github/codeql-action/autobuild@v4
添加构建命令
启用手动构建后,取消注释工作流中的 run 步骤,并添加适合您仓库的构建命令。run 步骤使用操作系统的 shell 运行命令行程序。您可以修改这些命令并添加更多命令以自定义构建过程。
- run: |
make bootstrap
make release
有关 run 关键字的更多信息,请参阅 GitHub Actions 工作流语法。
如果您为编译语言添加了手动构建步骤,但代码扫描仍无法在您的仓库中正常工作,请通过 GitHub 支持门户 与我们联系。