코드 품질

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

소스 코드의 품질과 복잡성을 분석하는 데 Code Quality를 사용합니다. 이를 통해 프로젝트의 코드를 간단하고 가독성 있게 유지하고 유지보수를 쉽게 할 수 있습니다. Code Quality는 다른 리뷰 프로세스를 보완하여 대체하지 않아야 합니다.

Code Quality는 CI/CD 파이프라인에서 실행되며 코드의 품질을 저하시킬 수 있는 변경 사항을 Merge하는 것을 피할 수 있도록 도와줍니다.

Code Quality는 오픈 소스 Code Climate 도구와 선택된 플러그인을 사용하여 소스 코드를 분석합니다. 코드의 언어가 Covered 되었는지 확인하려면 Code Climate의 유지 가능성을 위한 지원되는 언어 디렉터리을 참조하세요. Code Coverage를 확장하려면 Code Climate Analysis Plugins이나 사용자 정의 도구를 사용할 수 있습니다.

티어별 기능

다른 GitLab 티어에서 사용 가능한 기능은 다음 표와 같습니다.

기능 Free에서 사용 가능 Premium에서 사용 가능 Ultimate에서 사용 가능
스캐너 구성 가능 가능 가능
사용자 정의 스캐너 통합 가능 가능 가능
JSON 또는 HTML 보고서 아티팩트 생성 가능 가능 가능
Merge Request 위젯에 결과 표시 가능 가능 가능
파이프라인에서 결과 표시 불가능 가능 가능
Merge Request 변경 보기에서 결과 표시 불가능 불가능 가능
프로젝트 품질 보기 요약 불가능 불가능 가능

코드 품질 결과 보기

코드 품질 결과는 다음에서 표시됩니다:

  • Merge Request 위젯
  • Merge Request 변경 보기
  • 파이프라인 상세 보기
  • 프로젝트 품질 보기

Merge Request 위젯

코드 품질 분석 결과는 Merge Request 위젯 영역에 표시됩니다. 대상 브랜치의 보고서가 비교할 수 있을 때 Merge Request 위젯에 코드 품질 발견사항과 변경 내용으로 인한 해결책이 표시됩니다. 동일한 지문을 가진 여러 코드 품질 발견 사항은 Merge Request 위젯에서 단일 항목으로 표시되며 각 개별 발견 사항은 파이프라인 상세 보기에서 사용 가능한 전체 보고서에서 볼 수 있습니다.

코드 품질 위젯

Merge Request 변경 보기

Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

코드 품질 결과는 Merge Request 변경 보기에 표시됩니다. 코드 품질 문제가 있는 라인은 gutter 옆에 표시됩니다. 문제 디렉터리을 보려면 해당 기호를 선택한 다음 세부정보를 보려면 해당 문제를 선택하세요.

코드 품질 인라인 표시기

파이프라인 상세 보기

Tier: Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

파이프라인에서 생성된 모든 Code Quality 위반 사항 디렉터리이 파이프라인 세부 페이지의 Code Quality 탭에 표시됩니다. 파이프라인 상세 보기에는 실행된 브랜치에서 발견된 모든 Code Quality 발견 사항이 표시됩니다.

코드 품질 보고서

프로젝트 품질 보기

Tier: Ultimate Offering: GitLab.com, Self-managed

프로젝트 품질 보기에서 코드 품질 발견의 개요가 표시됩니다. 이 보기는 분석 > CI/CD 분석 아래에서 찾을 수 있으며 이 특정 프로젝트에 대해 project_quality_summary_page 피처 플래그가 활성화되어 있어야 합니다.

코드 품질 요약

Code Quality 활성화

사전 조건:

  • GitLab CI/CD 구성(.gitlab-ci.yml)에 test 단계가 포함되어 있어야 합니다.
  • 인스턴스 러너를 사용하는 경우 코드 품질 작업은 Docker-in-Docker 워크플로에 대해 구성되어야 합니다.
  • 프라이빗 러너를 사용하는 경우 Code Quality 분석을 더 효율적으로 실행하기 위해 권장되는 대체 구성을 사용해야 합니다.
  • 러너는 생성된 Code Quality 파일을 저장할 충분한 디스크 공간이 있어야 합니다. 예를 들어, GitLab 프로젝트의 파일은 약 7GB입니다.

Code Quality를 활성화하려면 다음을 수행하세요:

  • Auto DevOps를 활성화합니다. 이에는 Auto Code Quality가 포함됩니다.

  • .gitlab-ci.yml 파일에 Code Quality 템플릿을 포함시킵니다.

    예시:

       include:
       - template: Jobs/Code-Quality.gitlab-ci.yml
    

    이제 Code Quality가 파이프라인에서 실행됩니다.

caution
Self-managed 인스턴스에서 악의적인 사용자가 Code Quality 작업 정의를 손상시키면 러너 호스트에서 권한 있는 Docker 명령을 실행할 수 있습니다. 적절한 액세스 제어 정책을 갖고 있음으로써 신뢰할 수 있는 사용자에게만 액세스를 허용함으로써 이 공격 벡터를 완화시킬 수 있습니다.

개인 러너로 코드 품질 성능 향상

개인 러너를 사용하는 경우 코드 품질의 성능을 향상시키기 위해 이 구성을 사용해야 합니다. 이는 다음과 같은 이유 때문입니다:

  • 특권 모드를 사용하지 않음.
  • Docker-in-Docker를 사용하지 않음.
  • Docker 이미지(모든 CodeClimate 이미지 포함)가 캐시되어 다음 작업에서 다시 가져오지 않음.

이 대체 구성은 소켓 바인딩을 사용하여 러너의 Docker 데몬을 작업 환경과 공유하는 방식입니다. 이 구성을 구현하기 전에 다음의 제한 사항을 고려해 주세요.

개인 러너를 사용하려면:

  1. 새 러너를 등록합니다:

    $ gitlab-runner register --executor "docker" \
      --docker-image="docker:latest" \
      --url "https://gitlab.com/" \
      --description "cq-sans-dind" \
      --tag-list "cq-sans-dind" \
      --locked="false" \
      --access-level="not_protected" \
      --docker-volumes "/cache"\
      --docker-volumes "/builds:/builds"\
      --docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
      --registration-token="<project_token>" \
      --non-interactive
    
  2. 선택 사항이지만 권장됨: 빌드 디렉터리를 /tmp/builds로 설정하여 작업 결과물이 주기적으로 러너 호스트에서 삭제되도록 합니다. 이 단계를 건너뛴 경우 기본 빌드 디렉터리(/builds)를 직접 정리해야 합니다. 이를 위해 이전 단계의 gitlab-runner register에 다음 두 플래그를 추가할 수 있습니다.

    --builds-dir "/tmp/builds"
    --docker-volumes "/tmp/builds:/tmp/builds" # 이것 대신에 사용 가능: --docker-volumes "/builds:/builds"
    

    결과 구성:

    [[runners]]
      name = "cq-sans-dind"
      url = "https://gitlab.com/"
      token = "<project_token>"
      executor = "docker"
      builds_dir = "/tmp/builds"
      [runners.docker]
        tls_verify = false
        image = "docker:latest"
        privileged = false
        disable_entrypoint_overwrite = false
        oom_kill_disable = false
        disable_cache = false
        volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock", "/tmp/builds:/tmp/builds"]
        shm_size = 0
      [runners.cache]
        [runners.cache.s3]
        [runners.cache.gcs]
    
  3. 템플릿에 의해 생성된 code_quality 작업에 두 가지 오버라이드를 적용합니다:

    include:
      - template: Jobs/Code-Quality.gitlab-ci.yml
       
    code_quality:
      services:            # Docker-in-Docker를 비활성화
      tags:
        - cq-sans-dind     # 새로운 전문 러너에서만 이 작업을 실행하도록 설정
    

이제 코드 품질이 표준 Docker 모드에서 실행됩니다.

개인 러너에서 루트리스(Code Quality)로 실행

개인 러너를 사용하고 루트리스 Docker 모드에서 코드 품질 스캔을 실행하려는 경우, 코드 품질이 올바르게 실행되도록 특별한 변경이 필요합니다. 소켓 바인딩을 변경하면 다른 작업에서 문제가 발생할 수 있기 때문에 코드 품질 작업만 실행하는 전용 러너를 갖는 것이 필요할 수 있습니다.

루트리스 개인 러너를 사용하려면:

  1. 새 러너를 등록합니다:

    /run/user/<gitlab-runner-user>/docker.sockgitlab-runner 사용자의 로컬 docker.sock 경로로 대체합니다.

    $ gitlab-runner register --executor "docker" \
      --docker-image="docker:latest" \
      --url "https://gitlab.com/" \
      --description "cq-rootless" \
      --tag-list "cq-rootless" \
      --locked="false" \
      --access-level="not_protected" \
      --docker-volumes "/cache" \
      --docker-volumes "/tmp/builds:/tmp/builds" \
      --docker-volumes "/run/user/<gitlab-runner-user>/docker.sock:/run/user/<gitlab-runner-user>/docker.sock" \
      --token "<project_token>" \
      --non-interactive \
      --builds-dir "/tmp/builds" \
      --env "DOCKER_HOST=unix:///run/user/<gitlab-runner-user>/docker.sock" \
      --docker-host "unix:///run/user/<gitlab-runner-user>/docker.sock"
    

    결과 구성:

    [[runners]]
      name = "cq-rootless"
      url = "https://gitlab.com/"
      token = "<project_token>"
      executor = "docker"
      builds_dir = "/tmp/builds"
      environment = ["DOCKER_HOST=unix:///run/user/<gitlab-runner-user>/docker.sock"]
      [runners.docker]
        tls_verify = false
        image = "docker:latest"
        privileged = false
        disable_entrypoint_overwrite = false
        oom_kill_disable = false
        disable_cache = false
        volumes = ["/cache", "/run/user/<gitlab-runner-user>/docker.sock:/run/user/<gitlab-runner-user>/docker.sock", "/tmp/builds:/tmp/builds"]
        shm_size = 0
        host = "unix:///run/user/<gitlab-runner-user>/docker.sock"
      [runners.cache]
        [runners.cache.s3]
        [runners.cache.gcs]
    
  2. 템플릿에 의해 생성된 code_quality 작업에 다음과 같은 오버라이드를 적용합니다:

    code_quality:
      services:
      variables:
        DOCKER_SOCKET_PATH: /run/user/997/docker.sock
      tags:
        - cq-rootless
    

이제 코드 품질이 표준 Docker 모드 및 루트리스에서 실행됩니다.

루트리스 Podman을 사용하여 Docker를 실행하려는 경우, 코드 품질에서도 동일한 구성이 필요합니다. 시스템에서 올바른 podman.sock 경로로 /run/user/<gitlab-runner-user>/podman/podman.sock 등을 대체해야 합니다.

코드 품질 비활성화

$CODE_QUALITY_DISABLED CI/CD 변수가 있으면 code_quality 작업이 실행되지 않습니다. 변수를 정의하는 방법에 대한 자세한 정보는 GitLab CI/CD 변수를 참조하세요.

코드 품질을 비활성화하려면 다음 중 하나에 해당하는 사용자 정의 CI/CD 변수인 CODE_QUALITY_DISABLED를 만드세요:

스캔 설정 사용자 정의

CI/CD 변수를 사용하여 코드 품질 스캔 설정을 변경할 수 있습니다.

코드 품질 작업을 구성하려면 다음을 수행하세요:

  1. 템플릿 포함 후 동일한 이름으로 작업을 선언합니다.
  2. 작업 스탠자에 추가 키를 지정하세요.

예는 HTML 형식의 출력 다운로드를 참조하세요.

사용 가능한 CI/CD 변수

코드 품질은 다음과 같은 사용 가능한 CI/CD 변수를 정의하여 사용자 정의할 수 있습니다:

CI/CD 변수 설명
CODECLIMATE_DEBUG Code Climate 디버그 모드를 활성화하려면 설정합니다.
CODECLIMATE_DEV CLI에서 알 수 없는 엔진을 실행할 수 있는 --dev 모드를 활성화하려면 설정합니다.
CODECLIMATE_PREFIX CodeClimate 엔진의 모든 docker pull 명령에 사용할 접두사를 설정합니다. 오프라인 스캔에 유용합니다. 자세한 내용은 개인 컨테이너 레지스트리 사용를 참조하세요.
CODECLIMATE_REGISTRY_USERNAME CODECLIMATE_PREFIX에서 구문 분석된 레지스트리 도메인의 사용자 이름을 지정합니다.
CODECLIMATE_REGISTRY_PASSWORD CODECLIMATE_PREFIX에서 구문 분석된 레지스트리 도메인의 암호를 지정합니다.
CODE_QUALITY_DISABLED 코드 품질 작업을 실행하지 않습니다.
CODE_QUALITY_IMAGE 완전히 접두사가 붙은 이미지 이름을 설정합니다. 이미지는 작업 환경에서 액세스할 수 있어야 합니다.
ENGINE_MEMORY_LIMIT_BYTES 엔진의 메모리 제한을 설정합니다. 기본값: 1,024,000,000바이트.
REPORT_STDOUT 보고서를 일반적인 보고서 파일을 생성하는 대신 STDOUT에 인쇄하도록 설정합니다.
REPORT_FORMAT 생성된 보고서 파일의 형식을 제어하도록 설정합니다. json 또는 html 중 하나입니다.
SOURCE_CODE 스캔할 소스 코드의 경로를 설정합니다. 복제된 소스가 저장된 디렉터리의 절대 경로여야 합니다.
TIMEOUT_SECONDS codeclimate analyze 명령의 엔진 컨테이너용 사용자 정의 타임아웃을 설정합니다. 기본값: 900초 (15분).

출력

코드 품질은 발견된 문제의 세부 정보를 포함하는 보고서를 출력합니다. 이 보고서의 내용은 내부적으로 처리되며 결과는 UI에서 표시됩니다. 보고서는 code_quality 작업의 작업 artifact로 출력되며 gl-code-quality-report.json로 명명됩니다. 선택적으로 보고서를 HTML 형식으로 출력할 수도 있습니다. 예를 들어, HTML 형식 파일을 GitLab Pages에 게시하여 더 쉽게 검토할 수 있습니다.

JSON 및 HTML 형식으로 출력

코드 품질 보고서를 JSON 및 HTML 형식으로 출력하려면 추가 작업을 만듭니다. 이를 위해 코드 품질을 각각 파일 형식으로 한 번씩 실행해야 합니다.

HTML 형식으로 코드 품질 보고서를 출력하려면 extends: code_quality를 사용하여 템플릿에 다른 작업을 추가하세요:

include:
  - template: Jobs/Code-Quality.gitlab-ci.yml

code_quality_html:
  extends: code_quality
  variables:
    REPORT_FORMAT: html
  artifacts:
    paths: [gl-code-quality-report.html]

JSON 및 HTML 파일은 모두 작업 artifact로 출력됩니다. HTML 파일은 artifacts.zip 작업 artifact에 포함됩니다.

오직 HTML 형식으로 출력

코드 품질 보고서를 오직 HTML 형식으로 다운로드하려면 REPORT_FORMAThtml로 설정하여 code_quality 작업의 기본 정의를 재정의합니다.

note
이렇게 하면 JSON 형식의 파일이 생성되지 않으므로 코드 품질 결과가 Merge Request 위젯, 파이프라인 보고서 또는 변경 보기에 표시되지 않습니다.
include:
  - template: Jobs/Code-Quality.gitlab-ci.yml

code_quality:
  variables:
    REPORT_FORMAT: html
  artifacts:
    paths: [gl-code-quality-report.html]

HTML 파일은 작업 artifact로 출력됩니다.

Merge Request 파이프라인에서 코드 품질 사용

기본 코드 품질 구성은 Merge Request 파이프라인에서 code_quality 작업을 실행하지 않습니다.

Merge Request 파이프라인에서 코드 품질을 실행하려면 현재 rules와 일치하도록 코드 품질 rules 또는 workflow: rules를 덮어씁니다.

예:

include:
  - template: Jobs/Code-Quality.gitlab-ci.yml

code_quality:
  rules:
    - if: $CODE_QUALITY_DISABLED
      when: never
    - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Merge Request 파이프라인에서 코드 품질 작업 실행
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH      # 기본 브랜치의 파이프라인에서 코드 품질 작업 실행 (다른 브랜치 파이프라인에서는 실행되지 않음)
    - if: $CI_COMMIT_TAG                               # 태그용 파이프라인에서 코드 품질 작업 실행

개인 컨테이너 이미지 레지스트리 사용

개인 컨테이너 이미지 레지스트리를 사용하면 이미지 다운로드에 걸리는 시간이 줄어들고 외부 의존성도 줄일 수 있습니다. CodeClimate의 후속 docker pull 명령에 전달할 레지스트리 접두사를 구성해야 하므로 컨테이너 실행의 중첩된 방법 때문에 이것이 필요합니다.

다음 변수들은 필요한 이미지 풀을 모두 처리할 수 있습니다:

  • CODE_QUALITY_IMAGE: 작업 환경에서 액세스할 수 있는 완전히 접두사가 붙은 이미지 이름입니다. 여기에는 GitLab 컨테이너 레지스트리를 사용하여 자체 사본을 호스팅할 수 있습니다.
  • CODECLIMATE_PREFIX: 원하는 컨테이너 이미지 레지스트리의 도메인입니다. 이는 CodeClimate CLI에서 지원되는 구성 옵션입니다.
    • 슬래시 (/)를 뒤에 포함해야 합니다.
    • https://와 같은 프로토콜 접두사를 포함해서는 안 됩니다.
  • CODECLIMATE_REGISTRY_USERNAME: CODECLIMATE_PREFIX에서 구문 분석된 레지스트리 도메인의 사용자 이름을 지정하는 선택적 변수입니다.
  • CODECLIMATE_REGISTRY_PASSWORD: CODECLIMATE_PREFIX에서 구문 분석된 레지스트리 도메인의 암호를 지정하는 선택적 변수입니다.
include:
  - template: Jobs/Code-Quality.gitlab-ci.yml

code_quality:
  variables:
    CODE_QUALITY_IMAGE: "my-private-registry.local:12345/codequality:0.85.24"
    CODECLIMATE_PREFIX: "my-private-registry.local:12345/"

이 예제는 GitLab 코드 품질에 특화되어 있습니다. Docker-in-Docker 서비스용 레지스트리 미러를 구성하는 자세한 지침에 대해서는 Docker-in-Docker 서비스에 대한 레지스트리 미러 사용를 참조하십시오.

필요한 이미지

다음 이미지는 기본 .codeclimate.yml에 필요합니다:

  • codeclimate/codeclimate-structure:latest
  • codeclimate/codeclimate-csslint:latest
  • codeclimate/codeclimate-coffeelint:latest
  • codeclimate/codeclimate-duplication:latest
  • codeclimate/codeclimate-eslint:latest
  • codeclimate/codeclimate-fixme:latest
  • codeclimate/codeclimate-rubocop:rubocop-0-92

사용자 정의 .codeclimate.yml 구성 파일을 사용하는 경우 프로젝트의 개인 컨테이너 레지스트리에 지정된 플러그인을 추가해야 합니다.

인증을 사용하여 DockerHub 사용

코드 품질 이미지의 대체 소스로 DockerHub를 사용할 수 있습니다.

전제 조건:

DockerHub를 사용하려면 .gitlab-ci.yml 파일에서 다음 변수를 구성하세요:

  • CODECLIMATE_PREFIX
  • CODECLIMATE_REGISTRY_USERNAME
  • CODECLIMATE_REGISTRY_PASSWORD

예시:

include:
  - template: Jobs/Code-Quality.gitlab-ci.yml

code_quality:
  variables:
    CODECLIMATE_PREFIX: "registry-1.docker.io/"
    CODECLIMATE_REGISTRY_USERNAME: $DOCKERHUB_USERNAME
    CODECLIMATE_REGISTRY_PASSWORD: $DOCKERHUB_PASSWORD

의존성 프록시 사용

의존성 프록시를 사용하여 의존성 다운로드에 소요된 시간을 줄일 수 있습니다.

전제 조건:

의존성 프록시를 참조하려면 .gitlab-ci.yml 파일에서 다음 변수를 구성하세요:

  • CODE_QUALITY_IMAGE
  • CODECLIMATE_PREFIX
  • CODECLIMATE_REGISTRY_USERNAME
  • CODECLIMATE_REGISTRY_PASSWORD

예시:

include:
  - template: Jobs/Code-Quality.gitlab-ci.yml

code_quality:
  variables:
    ## `$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX`에 슬래시 추가해야 합니다.
    CODECLIMATE_PREFIX: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/
    CODECLIMATE_REGISTRY_USERNAME: $CI_DEPENDENCY_PROXY_USER
    CODECLIMATE_REGISTRY_PASSWORD: $CI_DEPENDENCY_PROXY_PASSWORD

사용자 지정 도구 구현

GitLab에 사용자 지정 도구를 통합하여 코드 품질 보고서를 제공할 수 있습니다.

코드 품질 보고서 아티팩트 JSON 파일에는 다음과 같은 속성을 가진 객체 배열이 포함되어야 합니다.

이름 설명
description 코드 품질 위반에 대한 설명
check_name 이 문제를 발생시킨 정적 분석 확인을 나타내는 고유한 이름
fingerprint 코드 품질 위반이나 식별하기 위한 고유한 지문. 예: MD5 해시
severity 심각도 문자열 (info, minor, major, critical, 또는 blocker 가능)
location.path 코드 품질 위반이 포함된 파일의 상대 경로
location.lines.begin 또는 location.positions.begin.line 코드 품질 위반이 발생한 줄
note
코드 클라우드 사양에서는 더 많은 속성을 지원하지만, GitLab에서는 무시됩니다. GitLab 파서는 파일 시작 부분의 바이트 순서 표시를 허용하지 않습니다.

사용자 지정 코드 품질 도구를 구현하려면:

  1. .gitlab-ci.yml 파일에 코드 품질 보고서 아티팩트 생성하는 작업 정의
  2. 도구를 구성하여 코드 품질 보고서 아티팩트를 JSON 파일로 생성하도록 구현

예시:

[
  {
    "description": "'unused' is assigned a value but never used.",
    "check_name": "no-unused-vars",
    "fingerprint": "7815696ecbf1c96e6894b779456d330e",
    "severity": "minor",
    "location": {
      "path": "lib/index.js",
      "lines": {
        "begin": 42
      }
    }
  }
]

여러 도구 통합

코드 품질은 파이프라인의 모든 작업에서 gl-code-quality-report.json 파일로 결과를 결합합니다. 결과적으로 여러 개별 도구를 지원되는 Code-Quality.gitlab-ci.yml 템플릿과 함께 또는 대신하여 사용할 수 있습니다.

다음은 필요한 형식의 ESLint 출력을 반환하는 예시입니다:

eslint:
  image: node:18-alpine
  script:
    - npm ci
    - npx eslint --format gitlab .
  artifacts:
    reports:
      codequality: gl-code-quality-report.json

분석 플러그인 사용

코드 품질 기능을 확장하려면 Code Climate 분석 플러그인을 사용할 수 있습니다.

예를 들어 SonarJava analyzer를 사용하려면:

  1. 리포지터리 루트에 .codeclimate.yml 파일 추가
  2. 플러그인을 활성화하는 코드.codeclimate.yml 파일에 추가

    version: "2"
    plugins:
      sonar-java:
        enabled: true
    

이렇게 하면 프로젝트에 포함된 기본 .codeclimate.ymlplugins: 섹션에 SonarJava가 추가됩니다.

plugins: 섹션의 변경 사항은 기본 .codeclimate.ymlexclude_patterns 섹션에 영향을 주지 않습니다. 자세한 내용은 Code Climate 문서의 파일 및 폴더 제외를 참조하세요.