Skip to main content

컴파일된 언어에 대한 CodeQL 코드 검사하기

CodeQL이(가) 컴파일된 언어, 사용 가능한 빌드 옵션을 분석하는 방법을 이해하고 필요한 경우 데이터베이스 생성 프로세스를 사용자 지정하는 방법을 알아봅니다.

누가 이 기능을 사용할 수 있나요?

쓰기 권한이 있는 사용자 if advanced setup is already enabled

Code scanning은(는) 다음 리포지토리 유형에 사용할 수 있습니다.

  • GitHub.com에 대한 퍼블릭 리포지토리
  • GitHub Advanced Security을(를) 사용하도록 설정된 GitHub Enterprise Cloud의 조직 소유 리포지토리

CodeQL 분석 워크플로 및 컴파일된 언어에 대한 정보

Code scanning은(는) 하나 이상의 CodeQL 데이터베이스에 대해 쿼리를 실행하여 작동합니다. 각 데이터베이스에는 리포지토리에 있는 단일 언어로 된 코드의 표현이 포함됩니다. 컴파일된 언어 C/C++, C#, Go, Java, Kotlin, and Swift의경우 이 데이터베이스를 채우는 프로세스에는 종종 코드 빌드 및 데이터 추출이 포함됩니다.

code scanning을(를) 사용하도록 설정하면 기본 설정과 고급 설정 모두 사용 가능한 가장 간단한 방법을 사용하여 분석을 위해 CodeQL 데이터베이스를 생성합니다. C# and Java의 경우 빌드(none 빌드 모드)를 요구하지 않고 CodeQL 데이터베이스가 코드베이스에서 직접 생성됩니다. 다른 컴파일된 언어의 경우 CodeQL은(는) autobuild 빌드 모드를 사용하여 코드베이스를 빌드합니다. 또는 manual 빌드 모드를 사용하여 명시적 빌드 명령을 지정하여 이러한 사용자 지정 명령으로 빌드된 파일만 분석할 수 있습니다.

CodeQL과 함께 종속성 캐싱을 사용하면 레지스트리에서 종속성을 다운로드하는 대신 GitHub Actions 캐시로 저장할 수 있습니다. 자세한 내용은 이 문서의 뒷부분에 있는 CodeQL에 대한 종속성 캐싱 정보를 참조하세요.

CodeQL 빌드 모드

CodeQL 작업은 컴파일된 언어에 대해 세 가지 빌드 모드를 지원합니다.

  • none - CodeQL 데이터베이스는 코드베이스를 구축하지 않고 코드베이스에서 직접 생성됩니다(해석된 모든 언어에 대해 지원되며 C# and Java에 대해 추가로 지원됨).
  • autobuild - CodeQL은(는) 가장 가능성이 큰 빌드 방법을 검색하고 이를 사용하여 코드베이스를 빌드하고 분석을 위한 데이터베이스를 만듭니다(컴파일된 모든 언어에서 지원됨).
  • manual - 워크플로의 코드베이스에 사용할 빌드 단계를 정의합니다(컴파일된 모든 언어에 대해 지원됨).

빌드 모드 비교

빌드 모드 특성None자동 빌드설명서
기본 설정 및 조직 수준 사용 설정에 사용됩니다.예(C# and Java)예, none가 지원되지 않는 위치아니요
사용자 구성 없이 분석 성공변수아니요
분석의 완전성생성된 코드가 분석되지 않음변수사용자 컨트롤형
분석의 정확도적절함적절함가장 좋음

권장 사항

code scanning을(를) 처음으로 설정하거나 여러 리포지토리에서 설정하는 경우 기본 설정을 사용하는 것이 가장 좋습니다. 기본 설정에서는 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@v4

# Initializes CodeQL tools and creates a codebase for analysis.
- name: Initialize CodeQL
  uses: github/codeql-action/init@v3
  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용 종속성 캐싱 정보

CodeQL과 함께 종속성 캐싱을 사용하면 레지스트리에서 종속성을 다운로드하는 대신 GitHub Actions 캐시로 저장할 수 있습니다. 이렇게 하면 타사 레지스트리가 제대로 작동하지 않을 때 경고가 손실될 위험이 줄어들고, 종속성이 많거나 느린 레지스트리를 사용하는 프로젝트의 성능이 향상될 수 있습니다. 캐싱 종속성이 워크플로 속도를 높이는 방법에 대한 자세한 내용은 워크플로 속도를 높이기 위한 종속성 캐싱을(를) 참조하세요.

종속성 캐싱은 모든 빌드 모드에서 작동하며 Java, Go, C#에서 지원됩니다.

Note

종속성 캐싱을 사용하면 리포지토리에 대한 캐시 할당량이 적용되는 CodeQL 관련 캐시가 저장됩니다. 워크플로 속도를 높이기 위한 종속성 캐싱을(를) 참조하세요.

CodeQL용 종속성 캐싱 사용

기본 설정 워크플로의 경우 퍼블릭 및 프라이빗 리포지토리의 GitHub 호스팅 실행기에서 종속성 캐싱을 기본적으로 사용하도록 설정됩니다.

고급 설치 워크플로의 경우 종속성 캐싱은 기본적으로 사용하지 않도록 설정됩니다. CodeQL에 대한 종속성 캐싱을 사용하도록 설정하려면 고급 설정 워크플로에서 CodeQL 작업에 대한 dependency-caching 설정을 사용합니다. 이 설정은 다음 값을 허용합니다.

  • false/none/off: 종속성 캐싱을 사용하지 않도록 설정(기본값)
  • restore: 기존 캐시만 복원하고 새 캐시는 저장하지 않음
  • store: 새 캐시만 저장하고 기존 캐시는 복원하지 않음
  • true/full/on: 기존 캐시 복원 및 새 캐시 저장

예를 들어 다음 설정은 CodeQL 작업에 대한 종속성 캐싱을 사용하도록 설정합니다.

    # Initializes CodeQL with dependency caching enabled
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v3
      with:
        languages: java
        dependency-caching: true

CodeQL용 빌드 모드 없음 정보

C# and Java의 경우 리포지토리에 Kotlin 코드가 포함되어 있지 않으면 code scanning에 대한 기본 설정을 사용하도록 설정할 때 빌드를 요구하지 않고 CodeQL에서 데이터베이스를 만듭니다. 리포지토리에 Java 코드 외에 Kotlin 코드가 포함된 경우 Kotlin 분석에 빌드가 필요하기 때문에 자동 빌드 프로세스에서 기본 설정이 사용됩니다.

빌드 없이 CodeQL 데이터베이스를 만들면 다음과 같은 경우 autobuild 또는 수동 빌드 단계를 사용하는 것보다 덜 정확한 결과를 생성할 수 있습니다.

  • 빌드 스크립트는 종속성 정보를 쿼리할 수 없으며, 종속성 추측은 정확하지 않습니다.
  • 리포지토리는 일반적으로 빌드 프로세스 중에 코드를 생성합니다.

autobuild 또는 수동 빌드 단계를 사용하려면 고급 설정을 사용하면 됩니다.

Note

Java 분석의 경우 build-modenone으로 설정되고 Kotlin 코드가 리포지토리에 있으면 Kotlin 코드가 분석되지 않으며 경고가 생성됩니다. Java 및 Kotlin 빌드을(를) 참조하세요.

CodeQL에 대한 자동 빌드 정보

CodeQL 작업은 다음 경우에 autobuild를 사용하여 컴파일된 언어를 분석합니다.

  • 기본 설정은 사용이며 언어는 none 빌드(C# and Java용으로 지원됨)를 지원하지 않습니다.
  • 고급 설정이 활성화되고 워크플로에서 build-mode: autobuild을(를) 지정합니다.
  • 고급 설정이 활성화되고 워크플로에 autobuild 작업(github/codeql-action/autobuild@v3)을 사용하는 언어에 대한 자동 작성 단계가 있습니다.

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@v3
    with:
      languages: ${{ matrix.language }}
      build-mode: ${{ matrix.build-mode }}

자동 빌드 단계를 사용하는 예시

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v3
      with:
        languages: ${{ matrix.language }}

    - name: Autobuild
      uses: github/codeql-action/autobuild@v3

수동으로 빌드 단계 지정 정보

고급 설정을 사용하는 경우에만 수동 빌드 단계를 지정할 수 있습니다. 코드 스캔을 위한 고급 설정 구성을(를) 참조하세요.

autobuild가 실패하거나 autobuild 프로세스에서 빌드한 것과 다른 소스 파일 집합을 분석하려는 경우 다음을 수행해야 합니다.

  • 워크플로에서 언어에 대한 빌드 모드를 지정하는 경우 빌드 모드를 manual로 변경합니다.
  • 워크플로에 autobuild 단계가 포함되어 있는 경우 워크플로에서 autobuild 단계를 제거하거나 주석 처리합니다.

그런 다음 run 단계의 주석을 해제하고 사용할 빌드 프로세스를 수동으로 지정합니다. C/C++, C#, Go, Java, Kotlin, and Swift의 경우 CodeQL은(는) 지정된 빌드 단계에서 빌드된 소스 코드를 분석합니다. 워크플로 파일을 편집하는 방법에 대한 자세한 내용은 코드 검색을 위한 고급 설정 사용자 지정을(를) 참조하세요.

워크플로를 업데이트하여 build-modemanual로 정의합니다.

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v3
  with:
    languages: ${{ matrix.language }}
    build-mode: manual
- uses: github/codeql-action/analyze@v3
  with:
    category: "/language:${{ matrix.language }}"

또는 워크플로를 업데이트하여 "자동 빌드" 단계를 주석으로 처리합니다.

    # Autobuild attempts to build any compiled languages.
    # - name: Autobuild
    #  uses: github/codeql-action/autobuild@v3

빌드 명령 지정

수동 빌드를 사용하도록 설정하면 워크플로에서 run 단계의 주석 처리를 제거하고 리포지토리에 적합한 빌드 명령을 추가합니다. run 단계에서는 운영 체제의 셸을 사용하여 명령줄 프로그램을 실행합니다. 이러한 명령을 수정하고 더 많은 명령을 추가하여 빌드 프로세스를 사용자 지정할 수 있습니다.

- run: |
    make bootstrap
    make release

run 키워드에 대한 자세한 내용은 GitHub Actions에 대한 워크플로 구문을(를) 참조하세요.

컴파일된 언어에 대한 수동 빌드 단계를 추가했으나 code scanning가 리포지토리에서 아직 작동하지 않는 경우 GitHub 지원 포털 사용에 문의하세요.

컴파일 언어의 자동 빌드 단계

GitHub 호스트형 실행기는 항상 autobuild에서 요구하는 소프트웨어로 실행됩니다. GitHub Actions에 자체 호스트형 실행기를 사용하는 경우 autobuild 프로세스를 사용하기 위해 추가 소프트웨어를 설치해야 할 수 있습니다. 또한 리포지토리에 특정 버전의 빌드 도구가 필요한 경우 수동으로 설치해야 할 수 있습니다. 자체 호스트 실행기의 경우 실행기 자체에 종속성을 직접 설치해야 합니다. 이러한 언어에 대한 이 문서의 각 autobuild 섹션에서 C/C++, C#및 Java에 대한 일반적인 종속성의 예를 제공합니다. 자세한 내용은 자체 호스트형 실행기 정보을(를) 참조하세요.

Note

워크플로에서 language 행렬을 사용하는 경우 autobuild는 행렬에 나열된 컴파일된 각 언어를 빌드하려고 합니다. 행렬을 사용하지 않는 경우 autobuild는 리포지토리에서 가장 많은 원본 파일이 있는 지원되는 컴파일 언어를 빌드하려고 합니다. Go를 제외하고 명시적 빌드 명령을 제공하지 않는 한, 리포지토리에서 컴파일된 다른 언어의 분석은 실패합니다.

C/C++ 빌드

CodeQL은(는) C/C++ 코드에 대해 빌드 모드 autobuild 또는 manual를 지원합니다.

C/C++용 자동 빌드 요약

지원되는 시스템 유형시스템 이름
운영 체제Windows, macOS 및 Linux
빌드 시스템Windows: MSbuild 및 빌드 스크립트
Linux 및 macOS: Autoconf, Make, CMake, qmake, Meson, Waf, SCons, Linux Kbuild 및 빌드 스크립트

autobuild 단계의 동작은 추출이 실행되는 운영 체제에 따라 달라집니다.

Windows 자동 검색

Windows에서 autobuild 단계는 다음 방법을 사용하여 C/C++에 적합한 빌드 메서드를 자동 검색하려고 시도합니다.

  1. 루트에 가장 가까운 솔루션(.sln) 또는 프로젝트(.vcxproj) 파일에 대해 MSBuild.exe를 호출합니다. autobuild는 최상위 디렉터리에서 동일한(가장 짧은) 깊이에 있는 여러 솔루션 또는 프로젝트 파일을 검색하면 모두 빌드하려고 합니다.
  2. 빌드 스크립트처럼 보이는 스크립트(build.bat, build.cmdbuild.exe)를 해당 순서대로 호출합니다.

Linux 및 macOS 자동 검색

Linux 및 macOS에서 autobuild 단계는 리포지토리에 있는 파일을 검토하여 사용되는 빌드 시스템을 확인합니다.

  1. 루트 디렉터리에서 빌드 시스템을 찾습니다.
  2. 찾을 수 없는 경우 C/C++용 빌드 시스템이 있는 고유한 디렉터리를 하위 디렉터리에서 검색합니다.
  3. 적절한 명령을 실행하여 시스템을 구성합니다.

C/C++용 실행기 요구 사항

Ubuntu Linux 실행기에서 autobuild는 검색된 구성 및 빌드 단계에 필요한 종속성을 자동으로 설치하려고 시도할 수 있습니다. 기본값으로 이 동작은 GitHub호스트형 실행기에서 사용 설정되며 자체 호스트형 실행기에서는 사용하지 않도록 설정됩니다. 환경에서 CODEQL_EXTRACTOR_CPP_AUTOINSTALL_DEPENDENCIEStrue 또는 false로 설정하여 이 기능을 명시적으로 사용하거나 사용하지 않도록 설정할 수 있습니다. 환경 변수 정의에 대한 자세한 내용은 변수에 정보 저장을(를) 참조하세요.

자체 호스트형 실행기의 경우 종속성 자동 설치를 사용하도록 설정하지 않는 한 gcc 컴파일러를 설치해야 할 수 있으며 특정 프로젝트에서 clang 또는 msvc 실행 파일에 액세스해야 할 수도 있습니다. 또한 프로젝트가 의존하는 빌드 시스템(예시: msbuild, make, cmake, bazel) 및 유틸리티(예시: python, perl, lex, yacc)를 설치해야 합니다. 종속성의 자동 설치를 사용하도록 설정한 경우 실행기에서 Ubuntu를 사용하고 있으며 암호 없이 sudo apt-get을 실행할 수 있는지 확인해야 합니다.

Windows 실행기는 powershell.exePATH에 있어야 합니다.

C# 빌드

CodeQL은(는) C# 코드에 대해 빌드 모드 none, autobuild 또는 manual을 지원합니다.{ %endif %}

C# 코드를 포함하는 리포지토리에 대한 기본 설정을 사용하도록 설정하면 빌드 모드가 자동으로 none으로 설정됩니다.

C#용 빌드 없음

CodeQL은(는) 모든 원본 파일 및 종속성에서 데이터베이스를 만들기 전에 종속성을 복원하고 몇 가지 추가 원본 파일을 생성하여 보다 정확한 결과를 제공합니다.

종속성은 여러 추론 및 전략을 사용하여 복원됩니다. 다음 파일은 정보의 기본 원본입니다. *.csproj, *.sln, nuget.config, packages.config, global.json, project.assets.json.

다음 생성된 원본 파일은 선택 사항이지만 CodeQL 데이터베이스의 정확성이 크게 향상됩니다.

  • MSbuild의 암시적 using 기능을 처리하는 global 생성 using 지시문입니다.
  • ASP.NET Core 보기 파일, .cshtml 파일이 .cs 파일로 변환됩니다.

종속성 어셈블리 이름, 생성된 원본 파일 및 리포지토리의 원본 파일의 정보가 컴파일되어 CodeQL 데이터베이스를 만드는 데 사용됩니다.

C#용 빌드 분석 없음의 정확도

전체 코드를 빌드하지 않고 CodeQL 데이터베이스를 만들려면 종속성을 복원할 수 있고 리포지토리의 원본 파일을 함께 컴파일할 수 있어야 합니다. 종속성을 복원하거나 소스 코드를 컴파일하는 데 문제가 있는 경우 CodeQL 데이터베이스 및 code scanning 분석 결과의 정확도에 영향을 줄 수 있습니다.

다음 단계를 수행하여 보다 정확한 분석을 보장할 수 있습니다.

  • 공용 인터넷에 대한 액세스를 제공하거나 프라이빗 NuGet 피드에 대한 액세스를 사용할 수 있는지 확인합니다.
  • 리포지토리에 동일한 NuGet 종속성의 여러 버전이 필요한지 확인합니다. CodeQL은(는) 하나의 버전만 사용할 수 있으며 일반적으로 여러 버전이 있는 최신 버전을 선택합니다. 이 방법은 모든 리포지토리에서 작동하지 않을 수 있습니다.
  • .NET의 여러 버전(예시: net48, net5.0, netstandard1.6)이 참조되는지 확인합니다. CodeQL은(는) 하나의 버전만 사용할 수 있으며 정확도에 영향을 줄 수 있습니다.
  • 클래스 이름이 충돌하지 않도록 합니다. 그렇지 않으면 메서드 호출 대상이 누락되어 데이터 흐름 분석에 영향을 줄 수 있습니다.

C#용 자동 빌드 요약

지원되는 시스템 유형시스템 이름
운영 체제Windows, macOS 및 Linux
빌드 시스템.NET 및 MSbuild, 빌드 스크립트

CodeQL에 의해 삽입된 C# 컴파일러 플래그

Note

다음 컴파일러 플래그는 빌드 모드 manual을(를) 사용하는 경우에만 적용됩니다.

CodeQL 추적기를 사용하면 빌드 프로세스를 가로채고 관련 CodeQL 언어 추출기에 정보를 전달하여 컴파일된 모든 언어를 추출할 수 있도록 합니다. 추적기는 C# 컴파일러 호출에 특정 플래그를 삽입하여 모든 구성 요소가 빌드되고 CodeQL 데이터베이스에 포함되도록 합니다. 그러면 C# 코드가 CodeQL 분석 중에 예상한 것과 다른 방식으로 빌드될 수 있습니다.

/p:MvcBuildViews=true

이 옵션을 true(으)로 설정하면 ASP.NET MVC(모델 뷰 컨트롤러) 프로젝트의 뷰가 빌드 프로세스의 일부로 미리 컴파일되므로 오류를 포착하고 성능을 개선하는 데 도움이 될 수 있습니다. 추적기는 이 플래그를 삽입하여 CodeQL이(가) 이러한 보기에서 생성된 코드를 통해 데이터 흐름을 포함할 수 있는 보안 문제를 찾아서 강조 표시합니다. 자세한 내용은 Microsoft Learn의 MVC 애플리케이션에 보기 추가를 참조하세요.

/p:UseSharedCompilation=false

이 옵션을 false(으)로 설정하면 공유 컴파일 기능을 사용할 수 없으므로 빌드 시간이 느려질 수 있습니다. /p:UseSharedCompilation=false을(를) 지정하지 않으면 msbuild은(는) 컴파일러 서버 프로세스를 시작하고 모든 컴파일은 해당 단일 프로세스에서 수행됩니다. 그러나 CodeQL 추적기는 새로 만든 프로세스의 인수를 검사하는 데 따라 달라집니다.

/p:EmitCompilerGeneratedFiles=true

이 옵션을 true(으)로 설정하면 빌드 프로세스 중에 컴파일러가 생성한 파일을 내보냅니다. 이 옵션을 선택하면 컴파일러가 향상된 정규식 지원, 직렬화 및 웹 애플리케이션 뷰 생성 등의 기능을 지원하는 데 사용되는 추가 소스 파일을 생성합니다. 이렇게 생성된 아티팩트는 일반적으로 컴파일러에 의해 디스크에 쓰이지 않지만, 옵션을 true(으)로 설정하면 파일을 디스크에 강제로 쓰게 되어 추출기가 파일을 처리할 수 있습니다.

일부 레거시 프로젝트와 .sqlproj 파일을 사용하는 프로젝트의 경우, 삽입된 /p:EmitCompilerGeneratedFiles=true 속성으로 인해 msbuild에서 예기치 않은 문제가 발생하는 것을 볼 수 있습니다. 이 문제 해결에 대한 자세한 내용은 C# 컴파일러가 예기치 않게 실패을(를) 참조하세요.

Windows 자동 검색

autobuild 프로세스는 다음 방법을 사용하여 C#에 적합한 빌드 메서드를 자동 검색하려고 시도합니다.

  1. 루트에 가장 가까운 솔루션(.sln) 또는 프로젝트(.csproj) 파일에 대해 dotnet build를 호출합니다.
  2. 루트에 가장 가까운 솔루션 또는 프로젝트 파일에 대해 MSBuild.exe를 호출합니다. autobuild는 최상위 디렉터리에서 동일한(가장 짧은) 깊이에 있는 여러 솔루션 또는 프로젝트 파일을 검색하면 모두 빌드하려고 합니다.
  3. 빌드 스크립트처럼 보이는 스크립트(build.bat, build.cmd, 및 build.exe)를 해당 순서대로 호출합니다.

Windows의 C#용 실행기 요구 사항

자체 호스팅 실행기에서 .NET Core 애플리케이션 개발의 경우 .NET SDK가 필요합니다(예 dotnet: ).

.NET Framework 애플리케이션 개발의 경우 Microsoft Build Tools(msbuild용) 및 NuGet CLI(nuget용)가 필요합니다.

Windows 실행기는 powershell.exePATH에 있어야 합니다.

build-mode: none을 사용하여 CodeQL 데이터베이스를 만들려는 경우 공용 인터넷에 대한 액세스도 제공해야 합니다. 또는 프라이빗 NuGet 피드에 대한 액세스를 사용할 수 있는지 확인해야 합니다.

Linux 및 macOS 자동 검색

  1. 루트에 가장 가까운 솔루션(.sln) 또는 프로젝트(.csproj) 파일에 대해 dotnet build를 호출합니다.
  2. 루트에 가장 가까운 솔루션 또는 프로젝트 파일에 대해 MSbuild를 호출합니다. autobuild는 최상위 디렉터리에서 동일한(가장 짧은) 깊이에 있는 여러 솔루션 또는 프로젝트 파일을 검색하면 모두 빌드하려고 합니다.
  3. 빌드 스크립트처럼 보이는 스크립트(buildbuild.sh)를 해당 순서대로 호출합니다.

Linux 및 macOS의 C#용 실행기 요구 사항

자체 호스팅 실행기에서 .NET Core 애플리케이션 개발의 경우 .NET SDK가 필요합니다(예 dotnet: ).

.NET Framework 애플리케이션 개발의 경우 Mono 런타임(mono, msbuild 또는 nuget 실행용)이 필요합니다.

build-mode: none을 사용하여 CodeQL 데이터베이스를 만들려는 경우 공용 인터넷에 대한 액세스도 제공해야 합니다. 또는 프라이빗 NuGet 피드에 대한 액세스를 사용할 수 있는지 확인해야 합니다.

Go 빌드

CodeQL은(는) Go 코드에 대해 빌드 모드 autobuild 또는 manual를 지원합니다.

Go용 자동 빌드 요약

지원되는 시스템 유형시스템 이름
운영 체제Windows, macOS 및 Linux
빌드 시스템Go 모듈, dep 및 글라이드뿐만 아니라 메이크파일 및 닌자 스크립트를 포함한 빌드 스크립트

Go용 자동 검색

autobuild 프로세스는 모든 .go 파일을 추출하기 전에 Go 리포지토리에 필요한 종속성을 설치하는 적절한 방법을 자동으로 검색하려고 시도합니다.

  1. 이러한 명령 중 하나가 성공할 때까지 make, ninja, ./build 또는 ./build.sh를 적용하고 후속 go list ./... 명령도 성공하면, 필요한 종속성이 설치되었음을 나타냅니다.
  2. 이러한 명령 중 어느 것도 성공하지 못한 경우 go.mod, Gopkg.toml 또는 glide.yaml을 찾아 go get(벤더링이 사용 중이 아닐 경우), dep ensure -v 또는 glide install을 각각 실행하여 종속성 설치를 시도합니다.
  3. 마지막으로 이러한 종속성 관리자에 대한 구성 파일을 찾을 수 없는 경우, GOPATH 외에도 적합한 리포지토리 디렉터리 구조를 다시 정렬하고 go get을(를) 사용하여 종속성을 설치하는 데 사용합니다. 디렉터리 구조는 추출이 완료된 후 정상으로 되돌립니다.
  4. go build ./... 실행과 유사하게 리포지토리의 모든 Go 코드를 추출합니다.

Note

기본 설정을 사용하는 경우 호환되는 버전의 Go 언어를 자동으로 설치하는 go.mod 파일을 찾습니다.{ % ifversion code-scanning-default-setup-self-hosted-310 %} 인터넷에 액세스할 수 없는 기본 설정으로 자체 호스팅 실행기를 사용하는 경우, 호환되는 버전의 Go를 수동으로 설치할 수 있습니다.

Go에 대한 추출기 옵션

기본적으로 테스트 코드(_test.go(으)로 끝나는 파일 내 코드)는 분석되지 않습니다. CodeQL CLI를 사용할 때 옵션 --extractor-option extract_tests=true을(를) 사용하거나 환경 변수 CODEQL_EXTRACTOR_GO_OPTION_EXTRACT_TESTS을(를) true(으)로 설정하여 이를 재정의할 수 있습니다.

또한 vendor 디렉터리는 기본적으로 CodeQL Go 분석에서 제외됩니다. CodeQL CLI를 사용할 때 --extractor-option extract_vendor_dirs=true 옵션을 전달하거나 환경 변수 CODEQL_EXTRACTOR_GO_OPTION_EXTRACT_VENDOR_DIRS을(를) true(으)로 설정하여 이 옵션을 재정의할 수 있습니다.

Java 및 Kotlin 빌드

CodeQL은(는) 다음 빌드 모드를 지원합니다.

  • Java: none, autobuild 또는 manual
  • Kotlin: autobuild 또는 manual

리포지토리에 대한 기본 설정을 처음 활성화할 때 Java 코드만 감지되면 빌드 모드가 none로 설정됩니다. Kotlin 또는 Java 및 Kotlin 코드의 조합이 검색되면 빌드 모드가 autobuild로 설정됩니다.

나중에 none 빌드 모드를 사용하는 리포지토리에 Kotlin 코드를 추가하는 경우 CodeQL 분석은 Kotlin이 지원되지 않는다는 경고 메시지를 보고합니다. 기본 설정을 사용하지 않도록 설정하고 다시 사용하도록 설정해야 합니다. 기본 설정을 다시 사용하도록 설정하면 두 언어를 모두 분석할 수 있도록 빌드 모드가 autobuild로 변경됩니다. 또는 고급 설정으로 변경할 수 있습니다. 자세한 내용은 경고: 빌드 없이 처리할 수 없는 프로젝트에서 X Kotlin 파일이 검색됨을(를) 참조하세요.

Java용 빌드 없음

CodeQL은(는) 존재하는 모든 Java 파일에서 데이터베이스를 만들기 전에 정확한 종속성 정보를 추출하기 위해 먼저 Gradle 또는 Maven을 실행하려고 시도하지만 빌드를 호출하지는 않습니다. 모든 루트 Maven 또는 Gradle 프로젝트 파일(상위 디렉터리에 빌드 스크립트가 없는 빌드 스크립트)은 종속성 정보를 쿼리하고 충돌이 있는 경우 최신 종속성 버전을 사용하는 것이 좋습니다. Maven 또는 Gradle을 실행하기 위한 실행기 요구 사항에 대한 자세한 내용은 Java용 실행기 요구 사항을 참조하세요.

Java용 빌드 분석 없음의 정확도

빌드 없이 CodeQL Java 데이터베이스를 만들면 다음과 같은 경우 autobuild 또는 수동 빌드 단계를 사용하는 것보다 덜 정확한 결과를 생성할 수 있습니다.

  • Gradle 또는 Maven 빌드 스크립트는 종속성 정보를 쿼리할 수 없으며, 종속성 추측(Java 패키지 이름 기반)은 정확하지 않습니다.
  • 리포지토리는 일반적으로 빌드 프로세스 중에 코드를 생성합니다. 이는 다른 모드를 사용하여 CodeQL 데이터베이스를 만든 경우 분석됩니다.

다음 단계를 수행하여 보다 정확한 분석을 보장할 수 있습니다.

  • 공용 인터넷에 대한 액세스를 제공하거나 비공개 아티팩트 리포지토리에 액세스할 수 있도록 합니다.
  • 리포지토리에 종속성이 동일한 여러 버전이 필요한지 확인합니다. CodeQL은(는) 하나의 버전만 사용할 수 있으며 일반적으로 여러 버전이 있는 최신 버전을 선택합니다. 이 방법은 모든 리포지토리에서 작동하지 않을 수 있습니다.
  • 여러 원본 Java 파일에서 둘 이상의 JDK API 버전이 필요한지 확인합니다. 여러 버전이 표시되면 CodeQL은(는) 빌드 스크립트에 필요한 가장 높은 버전을 사용합니다. 즉, 하위 버전의 JDK가 필요한 일부 파일이 부분적으로 분석될 수 있습니다. 예를 들어, 일부 파일에 JDK 8이 필요하지만 하나 이상의 빌드 스크립트에서 JDK 17 요구 사항이 발견되면 CodeQL은(는) JDK 17을 사용합니다. JDK 8이 필요하고 JDK 17을 사용하여 빌드할 수 없는 파일은 부분적으로 분석됩니다.
  • 클래스 이름이 충돌(예시: org.myproject.Test을(를) 정의하는 여러 파일)하지 않도록 합니다. 그렇지 않으면 메서드 호출 대상이 누락되어 데이터 흐름 분석에 영향을 줄 수 있습니다.

Java용 자동 빌드 요약

지원되는 시스템 유형시스템 이름
운영 체제Windows, macOS 및 Linux(제한 없음)
빌드 시스템Gradle, Maven 및 Ant

Java용 자동 검색

autobuild 프로세스는 다음 전략을 적용하여 Java 코드베이스에 대한 빌드 시스템을 확인하려고 합니다.

  1. 루트 디렉터리에서 빌드 파일을 검색합니다. Gradle, Maven 및 Ant 빌드 파일을 순서대로 확인합니다.
  2. 찾은 첫 번째 빌드 파일을 실행합니다. Gradle 및 Maven 파일이 모두 있는 경우 Gradle 파일이 사용됩니다.
  3. 그렇지 않으면 루트 디렉터리의 직접 하위 디렉터리에서 빌드 파일을 검색합니다. 하나의 하위 디렉터리에 빌드 파일이 포함되어 있는 경우 해당 하위 디렉터리에서 식별된 첫 번째 파일을 실행합니다(1의 경우와 동일한 기본 설정 사용). 둘 이상의 하위 디렉터리에 빌드 파일이 포함된 경우 오류를 보고합니다.

Java용 실행기 요구 사항

자체 호스팅 실행기를 사용하는 경우, Java의 필수 버전이 있어야 합니다.

  • 실행기를 사용하여 단일 버전의 Java가 필요한 리포지토리를 분석하는 경우, 적절한 JDK 버전을 설치해야 하며 PATH 변수에 있어야 합니다(javajavac을(를) 찾을 수 있도록).

  • 실행기를 사용하여 여러 버전의 Java가 필요한 리포지토리를 분석하는 경우 적절한 JDK 버전을 설치해야 하며 toolchains.xml 파일을 통해 지정할 수 있습니다. 이 파일은 일반적으로 Apache Maven에서 사용하는 구성 파일로, 도구의 위치, 도구 버전 및 도구를 사용하는 데 필요한 추가 구성을 지정할 수 있습니다. 자세한 내용은 Apache Maven 설명서의 도구 체인 사용 가이드를 참조하세요.

다음 실행 파일은 다양한 Java 프로젝트에 필요할 수 있으며 PATH 변수에 있어야 하지만 모든 경우에 필수는 아닙니다.

  • mvn Apache Maven
  • gradle Gradle
  • ant Apache Ant

또한 프로젝트가 의존하는 빌드 시스템(예시: make, cmake, bazel) 및 유틸리티(예시: python, perl, lex, yacc)를 설치해야 합니다.

Windows 실행기는 powershell.exePATH에 있어야 합니다.

Swift 빌드

CodeQL은(는) Swift 코드에 대해 빌드 모드 autobuild 또는 manual를 지원합니다.

Swift용 자동 빌드 요약

지원되는 시스템 유형시스템 이름
운영 체제macOS
빌드 시스템Xcode

autobuild 프로세스는 Xcode 프로젝트 또는 작업 영역에서 가장 큰 대상을 빌드하려고 합니다.

Swift 코드의 코드 검사는 기본적으로 macOS 실행기를 사용합니다.

ARC 실행기는 Linux만 사용하고 Swift에는 macOS 실행기만 필요하기 때문에 Actions Runner Controller(ARC)의 일부인 실행기에는 Swift 코드의 Code scanning이(가) 지원되지 않습니다. 그러나 ARC 실행기와 자체 호스팅 macOS 실행기를 혼합하여 사용할 수 있습니다. 자세한 내용은 "Actions Runner Controller 정보"을(를) 참조하세요.

CodeQL 분석 워크플로 Swift 컴파일 사용자 지정하기

xcodebuildswift build 둘 다 Swift 빌드에 대해 지원됩니다. 빌드하는 동안에는 하나의 아키텍처만 대상으로 지정하는 것이 좋습니다. 예를 들어, xcodebuild에는 ARCH=arm64, 또는 swift build에는 --arch arm64입니다.

archivetest 옵션을 xcodebuild에 전달할 수 있습니다. 그러나 표준 xcodebuild 명령은 가장 빠르며 성공적인 검사를 위해 CodeQL에 필요한 모든 것이기 때문에 권장됩니다.

Swift 분석의 경우 CodeQL 데이터베이스를 생성하기 전에 항상 CocoaPods 또는 Carthage를 통해 관리되는 종속성을 명시적으로 설치해야 합니다.