Skip to main content

CodeQL 팩 만들기 및 작업

CodeQL 팩을 사용하여 CodeQL 쿼리 및 라이브러리를 만들고, 공유하고, 사용하고, 실행할 수 있습니다.

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

GitHub CodeQL은(는) 설치 시 사용자별로 라이선스가 부여됩니다. 라이선스 제한에 따라 특정 작업에만 CodeQL을(를) 사용할 수 있습니다. 자세한 내용은 "CodeQL CLI 알아보기"을 참조하세요.

GitHub Advanced Security 라이선스가 있는 경우 CodeQL을(를) 사용하여 분석 자동화, 연속 통합 및 지속적인 업데이트를 할 수 있습니다. 자세한 내용은 "GitHub Advanced Security 정보.

참고: CodeQL 팩을 포함한 CodeQL 패키지 관리 기능은 현재 베타 릴리스 상태로 이용 가능하며 변경될 수 있습니다. 베타 릴리스 중에 CodeQL 팩은 GitHub 패키지 (Container registry)을(를) 사용하여만 사용할 수 있습니다. 이 베타 기능을 사용하려면 다음에서 https://github.com/github/codeql-action/releasesCodeQL CLI 번들의 최신 버전을 설치합니다.

CodeQL 팩 및 CodeQL CLI 정보

CodeQL 팩은 CodeQL 쿼리 및 라이브러리를 만들고, 공유하고, 사용하고, 실행하는 데 사용됩니다. CodeQL 팩에는 쿼리, 라이브러리 파일, 쿼리 도구 모음 및 메타데이터가 포함됩니다. CodeQL 팩 및 CodeQL CLI의 패키지 관리 명령을 사용하여 사용자 지정 쿼리를 게시하고 코드베이스 분석에 통합할 수 있습니다.

CodeQL 팩은 세 개 유형이 있습니다. 쿼리 팩, 라이브러리 팩, 그리고 모델 팩입니다.

  • 쿼리 팩은 실행되도록 설계되었습니다. 쿼리 팩이 게시되면 번들에는 모든 전이적 종속성 및 각 쿼리의 미리 컴파일된 표현, 쿼리 원본이 포함됩니다. 이렇게 하면 팩에서 쿼리를 일관되고 효율적으로 실행할 수 있습니다.

  • 라이브러리 팩은 쿼리 팩(또는 다른 라이브러리 팩)에서 사용하도록 설계되었으며 쿼리 자체를 포함하지 않습니다. 라이브러리는 별도로.

  • 모델 팩을 사용하여 기본적으로 지원되지 않는 종속성을 포함하도록 code scanning 분석을 확장할 수 있습니다. 모델 팩은 현재 베타 버전이며 변경될 수 있습니다. 베타 버전에서는 Java/Kotlin 및 C# 분석에 모델 팩을 사용할 수 있습니다. 자체 모델 팩을 만드는 방법에 대한 자세한 내용은 "CodeQL 모델 팩 만들기"를 참조하세요.

CodeQL CLI의 pack 명령을 사용하여 CodeQL 팩을 만들고, 팩에 종속성을 추가하고, 종속성을 설치하거나 업데이트할 수 있습니다. pack 명령을 사용하여 CodeQL 팩을 게시하고 다운로드할 수도 있습니다. 자세한 내용은 "CodeQL 팩 게시 및 사용"을(를) 참조하세요.

게시된 쿼리 팩과 다른 CodeQL 릴리스 간의 호환성에 대한 자세한 내용은 "CodeQL 팩 게시 및 사용"을 참조하세요.

지원되는 모든 언어에 대한 표준 CodeQL 패키지가 Container registry에 게시됩니다. CodeQL 리포지토리에는 지원되는 모든 언어에 대한 표준 CodeQL 팩에 대한 원본 파일이 포함되어 있습니다. CodeQL CLI 번들에 포함되어 있지만 다운로드할 수 있는 핵심 쿼리 팩은 다음과 같습니다.

  • codeql/cpp-queries
  • codeql/csharp-queries
  • codeql/go-queries
  • codeql/java-queries
  • codeql/javascript-queries
  • codeql/python-queries
  • codeql/ruby-queries

CodeQL 팩 구조

CodeQL 팩은 루트 디렉터리에 qlpack.yml이라는 파일이 있어야 합니다. qlpack.yml 파일에서 name: 필드에는 <scope>/<pack>의 형식을 따르는 값이 있어야 합니다. 여기서 <scope>는 팩이 게시될 GitHub 조직 또는 사용자 계정이며 <pack>은 팩의 이름입니다. 또한 CodeQL 테스트가 있는 쿼리 팩 및 라이브러리 팩에는 팩의 확인된 종속성이 들어있는 codeql-pack.lock.yml 파일이 포함되어 있습니다. 이 파일은 codeql pack install 명령을 호출하는 동안 생성되며, 직접 편집할 수 없으며 버전 제어 시스템에 추가해야 합니다.

팩 내의 다른 파일 및 디렉터리를 논리적으로 구성해야 합니다. 예를 들면 다음과 같습니다.

  • 쿼리는 특정 범주에 대한 디렉터리로 구성됩니다.

  • 특정 제품, 라이브러리 및 프레임워크에 대한 쿼리는 자체 최상위 디렉터리로 구성됩니다.

CodeQL 팩 만들기

프로젝트의 체크 아웃 루트에서 다음 명령을 실행하여 CodeQL 팩을 만들 수 있습니다.

codeql pack init <scope>/<pack>

다음 항목을 지정해야 합니다.

  • <scope>: 게시할 GitHub 조직 또는 사용자 계정의 이름입니다.

  • <pack>: 만들 팩의 이름입니다.

codeql pack init 명령은 CodeQL 팩에 대한 디렉터리 구조 및 구성 파일을 만듭니다. 기본적으로 이 명령은 쿼리 팩을 만듭니다. 라이브러리 팩을 만들려면 library:true 속성을 포함하여 파일을 라이브러리 팩으로 명시적으로 선언하도록 qlpack.yml 파일을 편집해야 합니다.

CodeQL 모델 팩 만들기

참고: CodeQL 모델 팩 및 CodeQL 모델 편집기는 현재 베타 상태이며 변경될 수 있습니다. 베타 버전에서는 모델 팩을 Java/Kotlin 및 C# 분석으로만 지원합니다.

code scanning 분석을 확장하여 기본적으로 지원되지 않는 라이브러리 및 프레임워크를 인식하는 데 모델 팩을 사용할 수 있습니다. 모델 팩은 YAML로 구현되는 데이터 확장 프로그램을 사용하고 새 종속성에 대한 데이터를 추가하는 방법을 설명합니다. 모델 팩을 지정하면 해당 팩의 데이터 확장 프로그램이 code scanning 분석에 자동으로 추가됩니다. CodeQL 모델 팩 및 데이터 확장 프로그램에 대한 자세한 정보는 “CodeQL 모델 편집기 사용” 섹션을 참조하세요.

모델 팩은 파일에서 qlpack.yml 파일에서 다음과 같은 특성을 가진 CodeQL 팩입니다.

  • library: true를 정의합니다.
  • 종속성이 없습니다.
  • extensionTargets가 하나 이상 있습니다.
  • 하나 이상의 데이터 확장 프로그램 파일을 가리키는 dataExtensions 속성이 있습니다.

모델 팩은 지정된 버전 범위에 속하는 경우 extensionTargets에 명명된 각 쿼리 팩에 지정된 데이터 확장 프로그램을 삽입합니다. 예시:

name: my-repo/my-java-model-pack
version: 1.2.3
extensionTargets:
  codeql/java-all: ~1.2.3
  codeql/util: ~4.5.6
dataExtensions:
  - models/**/*.yml

이 예제에서 모델 팩은 models/**/의 모든 데이터 확장 프로그램을 1.2.3부터 1.3.0까지의 버전인 codeql/java-all 쿼리 팩 및 4.5.6부터 4.6.0까지의 버전인 codeql/util 쿼리 팩에 삽입합니다. 자세한 내용은 npm 설명서의 “의미 체계 버전 관리 사용” 및 “의미 체계 버전 관리 사양”을 참조하세요.

모델 팩을 만든 후에는 다른 CodeQL 팩과 동일한 방식으로 게시할 수 있습니다. 자세한 내용은 "CodeQL 팩 게시 및 사용"을(를) 참조하세요. 그런 당므 code scanning 분석에 게시된 모델 팩을 --model-packs 옵션과 함께 사용할 수 있습니다. 자세한 정보는 "CodeQL 팩을 사용하여 분석 사용자 지정"을(를) 참조하세요.

기존 레거시 QL 팩을 수정하여 CodeQL 쿼리 팩 만들기

qlpack.yml 파일이 이미 있는 경우 해당 파일을 수동으로 편집하여 CodeQL 팩으로 변환할 수 있습니다.

  1. <scope>/<name> 형식과 일치하도록 name 속성을 편집합니다. 여기서 <scope>는 게시할 GitHub 조직 또는 사용자 계정의 이름입니다.

  2. qlpack.yml 파일에 semver 식별자가 있는 version 속성과 선택적 dependencies 블록을 포함합니다.

  3. libraryPathDependencies의 종속성 목록을 dependencies 블록으로 마이그레이션합니다. 각 종속성의 버전 범위를 지정합니다. 범위가 중요하지 않거나 호환성이 확실하지 않은 경우 "\*"를 지정할 수 있습니다. 이는 모든 버전이 허용되며 codeql pack install 실행 시 기본값이 최신 버전으로 설정됨을 나타냅니다.

속성에 대한 자세한 내용은 "CodeQL 팩을 사용하여 분석 사용자 지정"을(를) 참조하세요.

CodeQL 팩에 종속성 추가 및 설치

참고: 이는 CodeQL 쿼리 및 라이브러리 팩에만 지원됩니다.

codeql pack add 명령을 사용하여 CodeQL 팩에 종속성을 추가할 수 있습니다. 범위, 이름 및 호환되는 버전 범위(선택 사항)를 지정해야 합니다.

codeql pack add <scope>/<name>@x.x.x <scope>/<other-name>

버전 범위를 지정하지 않으면 최신 버전이 추가됩니다. 그렇지 않으면 요청된 범위를 충족하는 최신 버전이 추가됩니다.

이 명령은 요청된 종속성으로 qlpack.yml 파일을 업데이트하고 패키지 캐시에 다운로드합니다. 이 명령은 파일의 서식을 다시 지정하고 모든 주석을 제거합니다.

qlpack.yml 파일을 수동으로 편집하여 종속성을 포함하고 명령을 사용하여 종속성을 설치할 수도 있습니다.

codeql pack install

이 명령은 모든 종속성을 로컬 디스크의 공유 캐시에 다운로드합니다.

참고:

  • codeql pack addcodeql pack install 명령을 실행하면 codeql-pack.lock.yml 파일이 생성되거나 업데이트됩니다. 이 파일은 버전 관리에 체크인되어야 합니다. codeql-pack.lock.yml 파일에는 팩에서 사용하는 정확한 버전 번호가 포함되어 있습니다. 자세한 내용은 "codeql-pack.lock.yml 파일 정보"를 참조하세요.

  • 기본적으로 codeql pack install은 GitHub.com의 Container registry에서 종속성을 설치합니다. qlconfig.yml 파일을 만들어 GitHub Enterprise Server Container registry에서 종속성을 설치할 수 있습니다. 자세한 내용은 GitHub Enterprise Server 설명서의 “CodeQL 팩 게시 및 사용”을(를) 참조하세요.

다운로드한 CodeQL 팩 사용자 지정

팩의 변경 내용을 실험하는 권장 방법은 소스 코드가 포함된 리포지토리를 복제하는 것입니다.

원본 리포지토리를 사용할 수 없고 Container registry에서 다운로드한 팩에 대한 기본 수정이 필요한 경우 이러한 팩은 다운로드 후 수정하거나 사용자 지정할 수 없으며 나중에 해당 형식이 변경될 수 있습니다. 콘텐츠를 수정해야 하는 경우 팩을 다운로드한 후 다음 단계를 수행하는 것이 좋습니다.

  • 수정하지 않은 팩의 결과와 혼동하지 않도록 팩 _이름_을 qlpack.yml로 변경합니다.

  • 압축을 푼 디렉터리 구조에서 이름이 *.qlx인 모든 파일을 제거합니다. 이러한 파일에는 미리 컴파일된 버전의 쿼리가 포함되어 있으며, 경우에 따라 CodeQL은 수정한 QL 원본을 기본 설정으로 사용합니다.