코드 품질

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 Climate 분석 플러그인 또는 사용자 정의 도구를 사용하여 수행할 수 있습니다.

티어별 기능

다양한 GitLab 티어에서 다른 기능을 사용할 수 있습니다. 자세한 내용은 다음 표를 참조하세요:

기능 무료 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 탭에 표시됩니다. 파이프라인 세부 정보보기는 실행된 브랜치에서 발견된 모든 코드 품질 발견을 표시합니다.

코드 품질 보고서

프로젝트 품질 뷰

Tier: Ultimate Offering: GitLab.com, Self-Managed형

프로젝트 품질 보기는 코드 품질 발견의 개요를 표시합니다. 이 뷰는 분석 > CI/CD 분석 아래에서 찾을 수 있으며, 특정 프로젝트에 대해이 기능을 사용하려면 project_quality_summary_page feature flag를 활성화해야 합니다.

코드 품질 요약

코드 품질 활성화

사전 요구 사항:

  • GitLab CI/CD 구성 (.gitlab-ci.yml)에 test 단계를 포함해야 합니다.
  • 인스턴스 러너를 사용하는 경우, Code Quality 작업은 Docker-in-Docker 워크플로우에 구성되어야 합니다. 이 워크플로우를 사용하는 경우, 보고서를 저장할 수 있도록 /builds 볼륨을 매핑해야 합니다.
  • 개인 러너를 사용하는 경우, Code Quality 분석을보다 효율적으로 실행하도록하는 권고 사항인 대체 구성을 사용해야 합니다.
  • 러너는 생성된 Code Quality 파일을 저장할 충분한 디스크 공간을 가져야 합니다. 예를 들어, GitLab 프로젝트의 파일은 약 7GB입니다.

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

  • Auto DevOps를 활성화하고 자동 코드 품질를 포함합니다.

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

    예시:

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

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

caution
Self-Managed형되는 인스턴스에서 악의적인 사용자가 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로 설정하여 주기적으로 작업 아티팩트가 러너 호스트에서 제거되도록합니다. 이 단계를 건너뛰는 경우에는 기본 빌드 디렉터리 (/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 모드에서 실행됩니다.

프라이빗 러너를 사용하여 루트리스(rootless) 코드 품질 실행

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

루트리스 프라이빗 러너를 사용하려면:

  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
    

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

루트리스 Podman에서 Docker를 실행하는 것이 목표인 경우 동일한 구성이 필요합니다. 시스템에서 올바른 podman.sock 경로로 /run/user/<gitlab-runner-user>/docker.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 작업의 job 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 형식 파일을 생성하지 않으므로 코드 품질 결과가 MR 위젯, 파이프라인 보고서 또는 변경 보기에 표시되지 않습니다.
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 파이프라인에서 코드 품질 사용

기본 Code Quality 구성은 code_quality 작업이 Merge Request 파이프라인에서 실행되지 않도록 합니다.

Merge Request 파이프라인에서 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

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

개인용 컨테이너 이미지 레지스트리를 사용하면 이미지 다운로드에 소요되는 시간을 줄일 뿐 아니라 외부 의존성도 줄일 수 있습니다. 코드 퀄리티의 이후 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 Code Quality에만 해당됩니다. 더 일반적인 지침은 DinD를 위한 레지스트리 미러 활성화를 참조하세요.

필요한 이미지

다음 이미지들은 기본 .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를 Code Quality 이미지의 대체 소스로 사용할 수 있습니다.

선결 조건:

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에 사용자 정의 도구를 통합하여 Code Quality 보고서를 제공할 수 있습니다.

Code Quality 보고서 artifact JSON 파일은 다음 속성을 가진 객체 배열이어야 합니다:

이름 설명
description 코드 품질 위반에 대한 설명
check_name 이 문제를 발생시킨 정적 분석 체크를 나타내는 고유한 이름
fingerprint 코드 품질 위반을 식별하는 고유한 지문. 예를 들어 MD5 해시입니다.
severity 심각도 문자열 (info, minor, major, critical, blocker 중 하나)
location.path 코드 품질 위반이 발생한 파일의 상대 경로
location.lines.begin 또는 location.positions.begin.line 코드 품질 위반이 발생한 라인
note
Code Climate 사양은 더 많은 속성을 지원하지만 GitLab에서는 무시됩니다. GitLab 파서는 파일의 처음에 바이트 오더 표시를 허용하지 않습니다.

사용자 정의 Code Quality 도구를 구현하려면:

  1. .gitlab-ci.yml 파일에 Code Quality 보고서 artifact을 생성하는 작업을 정의하십시오 (Code Quality 보고서 artifact 생성).
  2. 도구를 구성하여 JSON 파일로 Code Quality 보고서 artifact을 생성할 수 있도록 설정하십시오. 이 때 Code Climate 사양의 일부를 구현하여야 합니다.

예시:

[
  {
    "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
      }
    }
  }
]

여러 도구를 통합

Code Quality는 파이프라인의 모든 작업 결과를 단일 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 분석 플러그인을 사용하여 확장할 수 있습니다.

예를 들어, SonarJava 분석기를 사용하려면:

  1. 귀하의 리포지터리 루트에 .codeclimate.yml이라는 파일을 추가
  2. 플러그인을 활성화하려면 .codeclimate.yml 파일에 플러그인을 위한 활성화 코드를 추가하십시오:

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

이렇게 하면 plugins: 섹션에 SonarJava가 귀하의 프로젝트에 포함됩니다. plugins: 섹션의 변경 사항은 기본 .codeclimate.ymlexclude_patterns 섹션에 영향을 주지 않습니다. 더 많은 정보는 Code Climate 문서의 파일 및 폴더 제외를 참조하세요.

쿠버네티스 및 오픈시프트에서 코드 품질 사용하기

코드 품질을 사용하려면 Docker를 Docker 컨테이너(Docker-in-Docker)에 설정해야 합니다. Kubernetes 실행기는 Docker-in-Docker를 지원합니다.

코드 품질 작업이 Kubernetes 실행기에서 실행될 수 있도록 보장하려면:

  • Docker 데몬과의 통신에 TLS를 사용하는 경우, 실행기는 권한 부여된 모드에서 실행되어야 합니다. 또한 인증서 디렉터리는 볼륨 마운트로 지정되어야 합니다.
  • Code Quality 작업이 시작되기 전에 DinD 서비스가 완전히 시작되지 않을 수 있습니다. 이는 GitLab Runner의 Kubernetes 실행기의 문제 해결 섹션에 문서화된 제한사항입니다. 데몬은 매뉴얼으로 시작될 수 있으며, 이는 아래 코드 블록의 before_script 섹션에서 보여집니다.

쿠버네티스

쿠버네티스에서 코드 품질을 실행하려면:

  • Docker in Docker 서비스는 config.toml 파일의 서비스 컨테이너로 추가되어야 합니다.
  • 서비스 컨테이너의 Docker 데몬은 Code Quality에서 필요로 하는 TCP 및 UNIX 소켓 모두에서 듣도록 설정되어야 합니다.
  • Docker 소켓은 볼륨과 공유되어야 합니다.

Docker 요구 사항에 따라, 서비스 컨테이너에 대한 권한 부여 플래그가 활성화되어 있어야 합니다.

[runners.kubernetes]

[runners.kubernetes.service_container_security_context]
privileged = true
allow_privilege_escalation = true

[runners.kubernetes.volumes]

[[runners.kubernetes.volumes.empty_dir]]
mount_path = "/var/run/"
name = "docker-sock"

[[runners.kubernetes.services]]
alias = "dind"
command = [
    "--host=tcp://0.0.0.0:2375",
    "--host=unix://var/run/docker.sock",
    "--storage-driver=overlay2"
]
entrypoint = ["dockerd"]
name = "docker:20.10.12-dind"
note
만약 GitLab Runner Helm Chart를 사용하는 경우, values.yaml 파일의 config 필드에 위의 쿠버네티스 구성을 사용할 수 있습니다.

가장 전반적인 성능을 제공하는 overlay2 스토리지 드라이버를 사용하려면:

  • Docker CLI가 통신하는 DOCKER_HOST를 명시하세요.
  • DOCKER_DRIVER 변수를 비워 두세요.

before_script 섹션을 사용하여 Docker 데몬이 완전히 부팅될 때까지 대기하세요. GitLab Runner v16.9부터 이 작업은 단순히 HEALTHCHECK_TCP_PORT 변수를 설정함으로써 수행할 수도 있습니다.

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

code_quality:
  services: []
  variables:
    DOCKER_HOST: tcp://dind:2375
    DOCKER_DRIVER: ""
  before_script:
    - while ! docker info > /dev/null 2>&1; do sleep 1; done

오픈시프트

오픈시프트의 경우, GitLab Runner Operator를 사용해야 합니다. 서비스 컨테이너의 Docker 데몬이 리포지터리를 초기화하는 권한을 부여하려면 /var/lib 디렉터리를 볼륨 마운트해야 합니다.

note
만약 /var/lib 디렉터리를 볼륨 마운트할 수 없는 경우, --storage-driver를 대신에 vfs로 설정할 수 있습니다. vfs 값을 사용하는 경우, 성능에 부정적인 영향을 미칠 수 있습니다.

Docker 데몬에 대한 권한을 구성하려면,

  1. 아래 제공된 구성으로 config.toml이라는 파일을 생성하세요. 이 구성은 GitLab Runner에서 생성된 config.toml을 사용자 정의하는 데 사용됩니다:
[[runners]]

[runners.kubernetes]

[runners.kubernetes.service_container_security_context]
privileged = true
allow_privilege_escalation = true

[runners.kubernetes.volumes]

[[runners.kubernetes.volumes.empty_dir]]
mount_path = "/var/run/"
name = "docker-sock"

[[runners.kubernetes.volumes.empty_dir]]
mount_path = "/var/lib/"
name = "docker-data"

[[runners.kubernetes.services]]
alias = "dind"
command = [
    "--host=tcp://0.0.0.0:2375",
    "--host=unix://var/run/docker.sock",
    "--storage-driver=overlay2"
]
entrypoint = ["dockerd"]
name = "docker:20.10.12-dind"
  1. 사용자 정의한 구성을 러너에 설정하세요.

  2. 선택사항. 빌드 Pod에 권한이 있는 서비스 계정을 할당하세요. 이는 OpenShift 클러스터 설정에 따라 다릅니다:

  oc create sa dind-sa
  oc adm policy add-scc-to-user anyuid -z dind-sa
  oc adm policy add-scc-to-user -z dind-sa privileged
  1. [Kubernetes 실행기] 섹션(https://docs.gitlab.com/runner/executors/kubernetes.html#other-configtoml-settings)에서 권한을 설정하세요.
  2. 쿠버네티스 경우와 동일한 작업 정의를 설정하세요:
include:
  - template: Code-Quality.gitlab-ci.yml

code_quality:
  services: []
  variables:
    DOCKER_HOST: tcp://dind:2375
    DOCKER_DRIVER: ""
  before_script:
    - while ! docker info > /dev/null 2>&1; do sleep 1; done

볼륨 및 Docker 리포지터리

Docker는 모든 데이터를 /var/lib 볼륨에 저장하며, 이는 큰 볼륨을 야기할 수 있습니다. Kubernetes 클러스터 전체에서 Docker-in-Docker 리포지터리를 재사용하기 위해 지속적 볼륨을 대안으로 사용할 수 있습니다.