阅读(1533) (1)

GitHub 代码扫描疑难解答

2020-08-19 15:40:07 更新

您可以看到解决 代码扫描 常见问题的提示。

注意:代码扫描 目前处于测试阶段,可能会更改。 要申请访问测试版,请加入等待列表

编译语言的自动构建失败

如果项目中编译语言的代码自动构建失败,请尝试以下疑难解答步骤。

  • autobuild从您的代码扫描工作流程中删除该步骤,并添加特定的构建步骤。有关编辑工作流程的信息,请参阅“ 配置代码扫描”。有关替换autobuild步骤的更多信息,请参见“ 为编译的语言配置代码扫描 ”。
  • 如果项目的仓库包含无法构建的特定语言的代码,请在 代码扫描 工作流程中禁用自动语言检测,仅指定要构建的语言。 更多信息请参阅“配置代码扫描”。

构建期间未找到代码

如果您的工作流程因错误No source code was seen during the build或失败而失败The process '/opt/hostedtoolcache/CodeQL/0.0.0-20200630/x64/codeql/codeql' failed with exit code 32,则表明CodeQL无法跟踪您的代码。有几种原因可以解释这种失败:

  1. 自动语言检测确定了受支持的语言,但是存储库中没有该语言的可分析代码。一个典型的示例是当我们的语言检测服务找到与特定编程语言(例如.h.gyp文件)相关联的文件,但存储库中没有相应的可执行代码。要解决该问题,您可以通过更新init步骤以指定存储库中存在的受支持语言来手动定义要分析的语言。例如,以下配置将仅分析Go和JavaScript。

   - name: Initialize CodeQL
     uses: github/codeql-action/init@v1
     with:
      languages: go, javascript # Other options are csharp, python, cpp, java

  1. 您的代码扫描工作流程正在分析编译的语言(C,C ++,C#或Java),但是代码未编译。默认情况下,CodeQL分析工作流包含一个autobuild步骤,但是,此步骤代表最大努力过程,并且可能无法成功构建代码,具体取决于您的特定构建环境。如果您删除了autobuild步骤并且没有手动包括构建步骤,则编译也可能会失败。有关指定构建步骤的更多信息,请参见“ 为编译的语言配置代码扫描 ”。

  1. 您的工作流正在分析一种编译语言(C,C ++,C#或Java),但是部分构建被缓存以提高性能(最有可能发生在Gradle或Bazel之类的构建系统中)。由于CodeQL观察编译器的活动以了解存储库中的数据流,因此CodeQL需要进行完整的构建才能执行分析。

  1. 您的工作流程正在分析编译的语言(C,C ++,C#或Java),但是在工作流程的initanalyze步骤之间不会进行编译。CodeQL要求您的构建在这两个步骤之间进行,以便观察编译器的活动并执行分析。

  1. 您的编译代码(使用C,C ++,C#或Java)已成功编译,但是CodeQL无法检测到编译器调用。最常见的原因是某些配置选项,例如在容器中运行构建过程,如果您正在使用daemon进程使用GitHub操作外部的分布式构建系统进行构建,或者CodeQL不知道您所使用的特定编译器。

  1. 对于使用dotnet build或使用msbuild哪个目标.NET Core 2的C#项目,应/p:UseSharedCompilation=falserun构建代码时在工作流步骤中指定。.NET Core 3.0及更高版本不需要的UseSharedCompilation标志。

例如,以下配置将在第一个构建步骤中传递标志。

      - run: |
          dotnet build /p:UseSharedCompilation=false

  1. 如果您的特定编译器或配置遇到其他问题,请联系 GitHub 支持GitHub 高级支持.

有关指定构建步骤的更多信息,请参见“ 为编译的语言配置代码扫描 ”。

我的存储库中的部分未使用进行分析 autobuild

CodeQL autobuild功能使用启发式方法在存储库中构建代码,但是,有时这种方法会导致对存储库的分析不完整。例如,当build.sh一个存储库中存在多个命令时,由于该autobuild步骤将仅执行命令之一,因此分析可能无法完成。解决方案是将autobuild步骤替换为构建步骤,该步骤将构建您要分析的所有源代码。或者,如果存储库中存在不止一种编译语言,并且您希望代码扫描分析所有这些编译语言,则可以在工作流中使用构建矩阵。有关更多信息,请参阅“ 配置构建矩阵 ”和“ 配置编译语言的代码扫描 ”。

错误:“Server error(服务器错误)”

如果 代码扫描 的工作流程运行因服务器错误而失败,请尝试再次运行工作流程。 如果问题仍然存在,请联系 GitHub 支持GitHub 高级支持

错误:“磁盘空间不足”或“内存不足”

在非常大的项目中,托管的GitHub操作运行器上的CodeQL可能会用完磁盘或内存。如果遇到此问题,请联系GitHub支持GitHub高级支持,以便我们可以调查该问题。

构建时间太长

如果使用CodeQL分析进行的构建花费的时间太长,可以尝试几种方法来减少构建时间。

使用矩阵构建来并行化分析

默认情况下,CodeQL顺序执行每种语言的分析,这可能会影响性能,尤其是对于使用多种语言的存储库。您可以使用构建矩阵(按语言划分分析)来加快分析速度。有关更多信息,请参见“ 配置构建矩阵”

例如,下面的工作流程将与一个作业一起运行以进行JavaScript分析,而另一个作业进行Go分析。

name: "Code Scanning - Action"


on:
  pull_request:
    branches: [master]
  push:
    branches: [master]


jobs:
  CodeQL-Build:


    strategy:
      fail-fast: false
      matrix:
        language: [ 'go', 'javascript']


    # CodeQL runs on ubuntu-latest, windows-latest, and macos-latest
    runs-on: ubuntu-latest


    steps:
    - name: Checkout repository
      uses: actions/checkout@v2


    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v1
      with:
        languages: $


    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
    # If this step fails, then you should remove it and run the build manually (see below).
    - name: Autobuild
      uses: github/codeql-action/autobuild@v1


    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v1

减少单个工作流程中正在分析的代码量

分析时间通常与要分析的代码量成正比。您可以通过减少一次分析的代码量来减少分析时间,例如,通过排除测试代码,或将分析分成多个工作流,这些工作流一次仅分析一部分代码。

对于Java,C,C ++和C#之类的编译语言,CodeQL会分析在工作流程运行期间生成的所有代码。要限制要分析的代码量,请通过在run块中指定自己的构建步骤,仅构建要分析的代码。您可以通过在和事件上使用pathspaths-ignore过滤器来结合指定自己的构建步骤,以确保您的工作流仅在更改特定代码时才运行。更多信息请参见“ GitHub操作的工作流程语法 ”。pull_request``push

对于CodeQL无需特定构建即可分析的Go,JavaScript,Python和TypeScript等解释型语言,您可以指定其他配置选项以限制要分析的代码量。有关更多信息,请参见“ 指定要扫描的目录 ”。

如果如上所述将您的分析分为多个工作流,我们仍然建议您至少有一个工作流在上运行,以schedule分析存储库中的所有代码。因为CodeQL分析了组件之间的数据流,所以某些复杂的安全行为只能在完整的构建中检测到。

仅在schedule活动期间运行

如果您的分析仍然太慢而无法在pushpull_request事件期间运行,那么您可能只想触发schedule事件分析。有关矿石信息,请参阅“ 使用事件触发工作流 ”。