Skip to main content

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

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

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

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

GitHub Advanced Security을(를) 사용하도록 설정된 조직 소유 리포지토리

참고: 사이트 관리자가 먼저 code scanning를 사용하도록 설정해야 이 기능을 사용할 수 있습니다. GitHub Actions를 사용하여 코드를 스캔하려면 사이트 관리자도 GitHub Actions를 사용하도록 설정하고 필요한 인프라를 설정해야 합니다. 자세한 내용은 "어플라이언스에 대한 코드 검사 구성"을(를) 참조하세요.

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

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

기본 설정을 사용하도록 설정하면 자동으로 구성된 CodeQL 분석 워크플로의 일부로 코드를 빌드하는 데 autobuild 작업이 사용됩니다. 고급 설정을 사용하도록 설정하면 기본 CodeQL 분석 워크플로에서 사용합니다 autobuild. 또는 명시적 빌드 명령을 사용하지 않도록 설정하고 autobuild 대신 지정하여 이러한 사용자 지정 명령으로 빌드된 파일만 분석할 수 있습니다.

최신 버전의 CodeQL에서 지원되는 언어, 라이브러리 및 프레임워크에 대한 자세한 내용은 CodeQL 설명서의 "지원되는 언어 및 프레임워크"를 참조하세요. 최신 버전의 CodeQL을(를) 실행하기 위한 시스템 요구 사항에 대한 자세한 내용은 CodeQL 설명서의 "시스템 요구 사항"을 참조하세요.

CodeQL에 대한 자동 빌드 정보

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

  • 기본 설정은 사용이며을(를) 지정합니다.
  • 고급 설정이 활성화되고 워크플로에 autobuild 작업(github/codeql-action/autobuild@v3)을 사용하는 언어에 대한 자동 작성 단계가 있습니다.

기본 CodeQL 분석 워크플로은(는) autobuild 작업을 사용하여 코드를 작성합니다.

    # 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 프로세스에서 빌드한 것과 다른 소스 파일 집합을 분석하려는 경우 다음을 워크플로에서 자동 작성 단계를 제거하거나 주석 처리합니다. 그런 다음 run 단계의 주석을 해제하고 사용할 빌드 프로세스를 수동으로 지정합니다. C/C++, C#, Go, Java, Kotlin, and Swift의 경우 CodeQL은(는) 지정된 빌드 단계에서 빌드된 소스 코드를 분석합니다. 워크플로 파일을 편집하는 방법에 대한 자세한 내용은 "코드 검색을 위한 고급 설정 사용자 지정" 항목을 참조하세요.

    # 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에 대한 워크플로 구문" 항목을 참조하세요.

여러 언어에 대한 빌드 명령 지정

컴파일된 언어가 여러 개 있는 리포지토리의 경우 언어별 빌드 명령을 지정할 수 있습니다. 예를 들어 리포지토리에 C/C++, C# 및 Java가 포함된 경우 한 언어(여기서는 Java)에 대한 수동 빌드 단계를 제공할 수 있습니다. 이렇게 C/C++ 및 C#에 autobuild를 계속 사용하는 동안 Java에 대한 빌드 단계가 지정됩니다.

- if: matrix.language == 'c-cpp' || matrix.language == 'csharp'
  name: Autobuild
  uses: github/codeql-action/autobuild@v3
- if: matrix.language == 'java-kotlin'
  name: Build Java
  run: |
    make bootstrap
    make release

if 조건에 대한 자세한 내용은 "GitHub Actions에 대한 워크플로 구문" 항목을 참조하세요.

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

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

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

Note

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

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# 빌드

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 빌드

지원되는 시스템 유형시스템 이름
운영 체제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 빌드

지원되는 시스템 유형시스템 이름
운영 체제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를 통해 관리되는 종속성을 명시적으로 설치해야 합니다.