GitHub 代码扫描疑难解答
您可以看到解决 代码扫描 常见问题的提示。
注意:代码扫描 目前处于测试阶段,可能会更改。 要申请访问测试版,请加入等待列表。
编译语言的自动构建失败
如果项目中编译语言的代码自动构建失败,请尝试以下疑难解答步骤。
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无法跟踪您的代码。有几种原因可以解释这种失败:
- 自动语言检测确定了受支持的语言,但是存储库中没有该语言的可分析代码。一个典型的示例是当我们的语言检测服务找到与特定编程语言(例如
.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
- 您的代码扫描工作流程正在分析编译的语言(C,C ++,C#或Java),但是代码未编译。默认情况下,CodeQL分析工作流包含一个
autobuild
步骤,但是,此步骤代表最大努力过程,并且可能无法成功构建代码,具体取决于您的特定构建环境。如果您删除了autobuild
步骤并且没有手动包括构建步骤,则编译也可能会失败。有关指定构建步骤的更多信息,请参见“ 为编译的语言配置代码扫描 ”。
- 您的工作流正在分析一种编译语言(C,C ++,C#或Java),但是部分构建被缓存以提高性能(最有可能发生在Gradle或Bazel之类的构建系统中)。由于CodeQL观察编译器的活动以了解存储库中的数据流,因此CodeQL需要进行完整的构建才能执行分析。
- 您的工作流程正在分析编译的语言(C,C ++,C#或Java),但是在工作流程的
init
和analyze
步骤之间不会进行编译。CodeQL要求您的构建在这两个步骤之间进行,以便观察编译器的活动并执行分析。
- 您的编译代码(使用C,C ++,C#或Java)已成功编译,但是CodeQL无法检测到编译器调用。最常见的原因是某些配置选项,例如在容器中运行构建过程,如果您正在使用daemon进程使用GitHub操作外部的分布式构建系统进行构建,或者CodeQL不知道您所使用的特定编译器。
- 对于使用
dotnet build
或使用msbuild
哪个目标.NET Core 2的C#项目,应/p:UseSharedCompilation=false
在run
构建代码时在工作流步骤中指定。.NET Core 3.0及更高版本不需要的UseSharedCompilation
标志。
例如,以下配置将在第一个构建步骤中传递标志。
- run: |
dotnet build /p:UseSharedCompilation=false
- 如果您的特定编译器或配置遇到其他问题,请联系 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
块中指定自己的构建步骤,仅构建要分析的代码。您可以通过在和事件上使用paths
或paths-ignore
过滤器来结合指定自己的构建步骤,以确保您的工作流仅在更改特定代码时才运行。更多信息请参见“ GitHub操作的工作流程语法 ”。pull_request``push
对于CodeQL无需特定构建即可分析的Go,JavaScript,Python和TypeScript等解释型语言,您可以指定其他配置选项以限制要分析的代码量。有关更多信息,请参见“ 指定要扫描的目录 ”。
如果如上所述将您的分析分为多个工作流,我们仍然建议您至少有一个工作流在上运行,以schedule
分析存储库中的所有代码。因为CodeQL分析了组件之间的数据流,所以某些复杂的安全行为只能在完整的构建中检测到。
仅在schedule
活动期间运行
如果您的分析仍然太慢而无法在push
或pull_request
事件期间运行,那么您可能只想触发schedule
事件分析。有关矿石信息,请参阅“ 使用事件触发工作流 ”。