codecamp

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上,此步骤检查存储库中存在的文件以确定所使用的构建系统:

  1. 在根目录中查找构建系统。
  2. 如果未找到,请使用C / C ++构建系统在子目录中搜索唯一目录。
  3. 运行适当的命令以配置系统。

C

支持的系统类型 系统名称
操作系统 Windows and Linux
Build system .NET and MSbuild, as well as build scripts

autobuild过程尝试使用以下方法为C#自动检测合适的构建方法:

  1. 调用最接近根目录dotnet build的解决方案(.sln)或项目(.csproj)文件。
  2. 在最接近根目录的解决方案或项目文件上调用MSbuild(Linux)或MSBuild.exe(Windows)。如果autobuild从顶层目录以相同(最短)深度检测到多个解决方案或项目文件,它将尝试构建所有文件。
  3. 调用脚本,看起来像一个构建脚本- 构建build.sh(按照这个顺序,对于Linux)或运行build.batbuild.cmd并build.exe(按照这个顺序,适用于Windows)。

Java

支持的系统类型 系统名称
操作系统 Windows, macOS and Linux (no restriction)
Build system Gradle, Maven and Ant

autobuild过程尝试通过应用以下策略来确定Java代码库的构建系统:

  1. 在根目录中搜索构建文件。先检查Gradle,然后再检查Maven,再检查Ant构建文件。
  2. 运行找到的第一个构建文件。如果同时存在Gradle和Maven文件,则使用Gradle文件。
  3. 否则,请在根目录的直接子目录中搜索构建文件。如果只有一个子目录包含构建文件,请运行该子目录中标识的第一个文件(使用与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 高级支持.

GitHub 配置代码扫描
GitHub 代码扫描疑难解答
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

GitHub 身份验证

在 GitHub 上管理订阅和通知

在 GitHub 上管理活动的订阅

GitHub 组织和团队

GitHub 管理对组织仓库的 Git 访问

GitHub 计费和付款

GitHub 使用议题和拉取请求进行协作

GitHub 在具有代码质量功能的仓库上进行协作

管理在 GitHub 上的工作

GitHub 建立强大的社区

GitHub 管理仓库

GitHub 自定义 GitHub 工作流程

在 GitHub Marketplace 中购买并安装应用程序

通过 GitHub Jobs 寻找人才

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }