코드 품질

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated
  • 이동됨 GitLab 13.2에서 GitLab 무료로.

소스 코드의 품질과 복잡성을 분석하는 Code Quality를 사용하세요. 이를 통해 프로젝트의 코드를 간단하고 가독성 있게 유지하고 유지 보수를 더 쉽게 할 수 있습니다. Code Quality는 다른 검토 프로세스를 보완하는 데 도움이 되며 대체해서는 안 됩니다.

Code Quality는 CI/CD 파이프라인에서 실행되며, 코드 품질을 저하시킬 수 있는 변경 사항을 병합하는 것을 피하도록 돕습니다.

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

각 티어별 기능

다양한 GitLab 티어에서 사용할 수 있는 기능은 다음 표와 같습니다:

기능 무료 프리미엄 얼티밋
스캐너 구성 가능 가능 가능
사용자 정의 스캐너 통합 가능 가능 가능
JSON 또는 HTML 보고서 artifact 생성 가능 가능 가능
병합 요청 위젯에 결과 표시 가능 가능 가능
파이프라인 내 결과 표시 불가능 가능 가능
병합 요청 변경 내용에 결과 표시 불가능 불가능 가능
프로젝트 품질 뷰에 개요 표시 불가능 불가능 가능

코드 품질 결과 보기

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

  • 병합 요청 위젯
  • 병합 요청 변경 내용 보기
  • 파이프라인 세부 정보 보기
  • 프로젝트 품질 뷰

병합 요청 위젯

  • 이동됨 GitLab 13.2에서 GitLab 무료로.

병합 요청 위젯 영역에 Code Quality 분석 결과가 표시됩니다. 대상 브랜치의 보고서가 비교할 수 있을 때 병합 요청 위젯에 코드 품질 발견 및 해결책이 표시됩니다. 동일한 지문을 가진 여러 Code Quality 발견은 병합 요청 위젯에서 하나의 항목으로 표시됩니다. 각 개별 발견은 파이프라인 세부 정보 뷰에 있는 전체 보고서에서 확인할 수 있습니다.

코드 품질 위젯

병합 요청 변경 내용 보기

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

코드 품질 결과는 병합 요청 변경 보기에 표시됩니다. Code Quality 문제가 포함된 줄은 거터 옆에 심볼로 표시됩니다. 심볼을 선택하여 문제 목록을 볼 수 있으며, 문제를 선택하여 해당 세부 정보를 볼 수 있습니다.

코드 품질 인라인 표시

Pipeline details view

Tier: 프리미엄, 얼티밋 Offering: GitLab.com, Self-managed, GitLab Dedicated

파이프라인의 세부 정보 페이지에서는 파이프라인이 실행된 브랜치에서 발견된 모든 코드 품질 발견 사항을 보여주는 Code Quality 탭에서 파이프라인으로 생성된 코드 품질 위반 사항의 전체 목록이 표시됩니다.

Code Quality Report

프로젝트 품질 보기

Tier: 얼티밋 Offering: GitLab.com, Self-managed

프로젝트 품질 보기는 코드 품질 발견의 개요를 표시합니다. 이 보기는 Analyze > CI/CD analytics의 하위에서 찾을 수 있으며, 특정 프로젝트에서 이 기능을 활성화하려면 project_quality_summary_page 기능 플래그가 활성화되어 있어야 합니다.

Code Quality Summary

코드 품질 활성화

필수 조건:

  • .gitlab-ci.yml 파일에 test 단계가 포함되어 있어야 합니다.
  • 인스턴스 러너를 사용하는 경우, Code Quality 작업은 Docker-in-Docker workflow에 구성되어 있어야 합니다.
  • 개인 러너를 사용하는 경우, 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가 파이프라인에서 실행됩니다.

경고: 자체 호스트된 인스턴스의 경우, 악의적인 사용자가 Code Quality 작업 정의를 침해하면 러너 호스트에서 권한이 있는 Docker 명령을 실행할 수 있습니다. 적절한 액세스 제어 정책을 갖추면 신뢰할 수 있는 사용자만 액세스할 수 있으므로 이러한 공격 벡터를 완화시킵니다.

개인 러너를 사용하여 코드 품질 성능 개선

개인 러너를 사용하는 경우, Code Quality의 성능을 개선하기 위해 이 구성을 사용해야 합니다.

  • 특권 모드는 사용되지 않습니다.
  • 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로 설정하여 정기적으로 작업 artifacts를 러너 호스트에서 청소합니다. 이 단계를 건너 뛰는 경우 기본 빌드 디렉토리(/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     # 새로운 전용 러너에서만 이 작업을 실행하도록 설정합니다.
    

이제 Code Quality는 표준 Docker 모드로 실행됩니다.

개인 실행기로 루트리스 코드 품질 실행

개인 실행기를 사용하고 루트리스 도커 모드에서 코드 품질 스캔을 실행하려는 경우, 코드 품질을 제대로 실행할 수 있도록 몇 가지 특별한 변경이 필요합니다. 이로 인해 소켓 바인딩의 변경으로 인해 다른 작업에서 문제가 발생할 수 있으므로 코드 품질 작업만 실행하는 전용 실행기를 갖는 것이 필요할 수 있습니다.

루트리스 개인 실행기를 사용하려면:

  1. 새 실행기를 등록합니다:

    /run/user/<gitlab-runner-user>/docker.sock를 지역 docker.sock의 경로로 대체합니다. gitlab-runner 사용자를 위한 명령 실행합니다.

    $ 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
    

코드 품질은 이제 표준 도커 모드와 루트리스에서 실행됩니다.

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

코드 품질 비활성화

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

코드 품질을 비활성화하려면 다음을 수행하세요:

스캔 설정 사용자 정의

.gitlab-ci.yml에서 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분)

출력

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

JSON 및 HTML 형식으로 출력

Code Quality 보고서를 JSON 및 HTML 형식으로 출력하려면 추가 작업을 생성합니다. 이를 위해 Code Quality를 각각 파일 형식에 맞게 두 번 실행해야 합니다.

HTML 형식으로 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 형식으로 Code Quality 보고서를 다운로드하려면 REPORT_FORMAThtml로 설정하여 code_quality job의 기본 정의를 덮어씁니다.

참고: JSON 형식 파일을 생성하지 않으므로 Code Quality 결과는 병합 요청 위젯, 파이프라인 보고서 또는 변경 보기에 표시되지 않습니다.

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

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

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

병합 요청 파이프라인에서 Code Quality 사용

기본 Code Quality 구성은 code_quality job을 병합 요청 파이프라인에서 실행시키지 않습니다.

Code Quality를 병합 요청 파이프라인에서 실행하려면 현재 rules 또는 workflow: rules를 현재 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" # Run code quality job in merge request pipelines
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH      # Run code quality job in pipelines on the default branch (but not in other branch pipelines)
    - if: $CI_COMMIT_TAG                               # Run code quality job in pipelines for tags

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

개인 컨테이너 이미지 레지스트리를 사용하면 이미지 다운로드에 소요되는 시간을 줄이고 외부 종속성을 줄일 수 있습니다. 개별 엔진을 위해 CodeClimate의 후속 docker pull 명령으로 넘어가기 위해 레지스트리 접두어를 CodeClimate에게 전달해야 합니다.

다음 변수들이 필요한 모든 이미지 가져오기를 처리할 수 있습니다.

  • 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 Code Quality에 특화되어 있습니다. 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

사용자 지정 도구 구현

코드 품질 보고서 아티팩트 JSON 파일은 다음 속성으로 구성된 객체 배열을 포함해야 합니다:

이름 설명
description 코드 품질 위반의 설명
check_name 이 문제를 발생시킨 정적 분석 확인의 고유한 이름
fingerprint 코드 품질 위반을 식별하는 고유한 지문. 예: MD5 해시
severity 심각도 문자열 (info, minor, major, critical, 또는 blocker 중 하나)
location.path 코드 품질 위반을 포함한 파일의 상대 경로
location.lines.begin 또는 location.positions.begin.line 코드 품질 위반이 발생한 라인

참고: Code Climate 명세는 더 많은 속성을 지원하지만, GitLab에서는 이를 무시합니다. GitLab 파서는 파일의 시작에 바이트 순서 표시를 허용하지 않습니다.

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

  1. .gitlab-ci.yml 파일에 코드 품질 보고서 아티팩트를 생성하는 작업 정의
  2. 도구를 구성하여 Code Climate 명세의 하위 집합을 구현하는 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 Quality 기능은 Code Climate Analysis Plugins을 사용하여 확장할 수 있습니다.

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

  1. 저장소 루트에 .codeclimate.yml 파일을 추가
  2. 플러그인을 활성화하는 코드.codeclimate.yml 파일에 추가

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

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

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