Skip to main content

Enterprise Server 3.22 目前作为发布候选版本提供。

对编译语言进行 CodeQL 代码扫描

了解如何 CodeQL 分析已编译的语言、可用的生成选项,并了解如果需要,如何自定义数据库生成过程。

谁可以使用此功能?

具有写入访问权限的用户 if advanced setup is already enabled

Code scanning 可用于以下存储库类型:

  • GitHub.com 上的公共存储库
  • GitHub Team、GitHub Enterprise Cloud 或 GitHub Enterprise Server 上的组织拥有的存储库,已启用 GitHub Code Security

注意

网站管理员必须先启用 code scanning 才能使用此功能。 如果你想使用 GitHub Actions 扫描代码,站点管理员还必须启用 GitHub Actions 并搭建所需的基础设施。 有关详细信息,请参阅“为设备配置代码扫描”。

比较生成模式

生成模式特征没有自动生成Manual
默认设置和用于组织级别的启用是(C/C++、C#, Java和 Rust)是,不支持 none
分析成功,无需用户配置是的Variable
分析的完整性未经过分析的生成的代码Variable由用户控制的
分析的准确性良好良好Best

选择生成模式

首次设置 code scanning 或跨多个存储库时,最好使用默认设置。 默认设置使用可用于生成 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@v6

# 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 启用依赖项缓存,请在高级设置工作流中为 dependency-caching 操作使用 CodeQL 设置。 此设置接受以下值:

  • 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

none 使用 CodeQL 构建模式

对于 C/C++、C#, Java和 Rust,CodeQL 可以在为 code scanning 启用默认设置时创建数据库,而不需要进行构建,除非存储库中还包括 Kotlin 代码。 如果存储库除了Java代码之外还包含 Kotlin 代码,则使用自动生成过程启用默认设置,因为 Kotlin 分析需要生成。

如果出现以下条件,则创建没有生成的CodeQL数据库可能会比使用autobuild或手动生成步骤产生更不准确的结果:

  • 无法查询生成脚本以获取依赖项信息,并且依赖项猜测(基于 Java 包名称)准确。
  • 存储库通常在生成过程中生成代码。

若要使用 autobuild 或手动生成步骤,可使用高级设置。

注意

对于Java分析,如果将 build-mode 设置为 none,且在存储库中找到 Kotlin 代码,则不会分析 Kotlin 代码并生成警告。 请参阅“已编译语言的 CodeQL 生成选项和步骤”。

使用autobuild用于CodeQL

在以下情况下,CodeQL 操作将使用 autobuild 来分析已编译的语言。

  • 默认设置已启用,语言不支持 none 构建(支持 C/C++、C#, Java和 Rust)。
  • 已启用高级设置,工作流指定 build-mode: 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 }}

使用“自动构建”步骤

    # 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 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 的工作流语法

如果为已编译语言添加了手动生成步骤,但 code scanning 在存储库中仍无法工作,请联系 。