GitHub 配置代码扫描以编译语言
您可以配置GitHub如何扫描以编译语言编写的代码中的漏洞和错误。
拥有仓库写入权限的人可配置仓库的 代码扫描。
注意:代码扫描 目前处于测试阶段,可能会更改。 要申请访问测试版,请加入等待列表。
注意:本文指的是由CodeQL支持的代码扫描,而不是指第三方静态分析工具的上载所产生的代码扫描。
About 代码扫描 and compiled languages
要为您的仓库启用代码扫描,您需要在仓库中添加包含CodeQL分析的GitHub操作工作流程。更多信息请参阅“启用 代码扫描”。
一般情况下无需编辑 代码扫描 的默认工作流程。但是,如果需要,您可以编辑工作流程以指定扫描频率,要扫描的语言或目录以及代码扫描在代码中查找的内容。如果您使用一组特定的命令来编译代码,或者存储库中使用了多种编译语言,则可能还需要编辑工作流程。有关配置代码扫描和编辑工作流文件的更多信息,请参阅“ 配置代码扫描 ”和“ 配置工作流”。
关于CodeQL的自动构建
对于C / C ++,C#和Java之类的编译语言,默认工作流程中的 autobuild
步骤会在操作执行CodeQL分析之前尝试构建代码。 与其他编译语言不同,CodeQL在分析Go时不会构建代码。
该autobuild
过程仅尝试为存储库构建一种编译语言。自动选择进行分析的语言是大多数文件使用的语言。
注意: 如果您将自托管运行程序用于GitHub操作,则可能需要安装其他软件才能使用
autobuild
过程。 此外,如果您的存储库需要特定版本的构建工具,则可能需要手动安装。更多信息请参阅“GitHub-hosted 运行器上安装的软件”。
C/C++
支持的系统类型 | 系统名称 |
---|---|
操作系统 | Windows and Linux |
Build system | Autoconf, CMake, qmake, Meson, Waf, SCons, and Linux Kbuild |
该autobuild
步骤的行为根据提取运行的操作系统而有所不同。在Windows上,该步骤没有默认操作。在Linux上,此步骤检查存储库中存在的文件以确定所使用的构建系统:
- 在根目录中查找构建系统。
- 如果未找到,请使用C / C ++构建系统在子目录中搜索唯一目录。
- 运行适当的命令以配置系统。
C
支持的系统类型 | 系统名称 |
---|---|
操作系统 | Windows and Linux |
Build system | .NET and MSbuild, as well as build scripts |
该autobuild
过程尝试使用以下方法为C#自动检测合适的构建方法:
- 调用最接近根目录
dotnet build
的解决方案(.sln
)或项目(.csproj
)文件。 - 在最接近根目录的解决方案或项目文件上调用
MSbuild
(Linux)或MSBuild.exe
(Windows)。如果autobuild
从顶层目录以相同(最短)深度检测到多个解决方案或项目文件,它将尝试构建所有文件。 - 调用脚本,看起来像一个构建脚本- 构建和build.sh(按照这个顺序,对于Linux)或运行build.bat,build.cmd,并build.exe(按照这个顺序,适用于Windows)。
Java
支持的系统类型 | 系统名称 |
---|---|
操作系统 | Windows, macOS and Linux (no restriction) |
Build system | Gradle, Maven and Ant |
该autobuild
过程尝试通过应用以下策略来确定Java代码库的构建系统:
- 在根目录中搜索构建文件。先检查Gradle,然后再检查Maven,再检查Ant构建文件。
- 运行找到的第一个构建文件。如果同时存在Gradle和Maven文件,则使用Gradle文件。
- 否则,请在根目录的直接子目录中搜索构建文件。如果只有一个子目录包含构建文件,请运行该子目录中标识的第一个文件(使用与1相同的首选项)。如果多个子目录包含构建文件,请报告错误。
添加编译语言的构建步骤
如果存储库中的C / C ++,C#或Java代码具有非标准的构建过程,或者以多种编译语言编写,则autobuild
可能会失败。您将需要autobuild
从工作流程中删除该步骤,并手动添加构建步骤。有关编辑工作流程的信息,请参阅“ 配置代码扫描”。
删除 autobuild
步骤后,取消注释 run
步骤,并添加适用于您的存储库的构建命令。 工作流程“运行”步骤使用操作系统的外壳程序运行命令行程序。 您可以修改这些命令并添加更多命令来自定义构建过程。
- run: |
make bootstrap
make release
有关 run
关键词的更多信息,请参阅“GitHub 操作 的工作流程语法”。
如果这是适用于您系统的方法,并且不会引起冲突,则还可以使用构建矩阵来更新工作流以构建多种编译语言。有关更多信息,请参见“ 配置构建矩阵”。
例如,下面的工作流为C / C ++分析运行一个作业,为Java分析运行另一个作业。
name: "Code Scanning - Action"
on:
pull_request:
branches: [master]
push:
branches: [master]
jobs:
CodeQL-Build:
strategy:
fail-fast: false
matrix:
language: [ 'cpp', 'java']
# 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.
- name: Autobuild
uses: github/codeql-action/autobuild@v1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
有关为什么autobuild
不生成代码的更多提示和技巧,请参阅“ 故障排除代码扫描 ”。
如果您添加了针对编译语言的手动构建步骤或使用了构建矩阵,但是代码扫描仍无法在您的存储库上运行,联系GitHub 支持 或 GitHub 高级支持.