코드 품질 문제 해결

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

코드 품질 작업 시 다음과 같은 문제가 발생할 수 있습니다.

코드를 찾을 수 없고 파이프라인은 항상 기본 구성으로 실행됩니다.

아마도 도커에서 도커를 소켓 바인딩하는 사설 러너를 사용하고 있습니다. Code Quality 체크를 worker에서 실행하도록 구성해야 합니다. 문서에 따라 사설 러너를 사용하여 코드 품질 성능 개선합니다.

기본 구성 변경이 효과가 없음

일반적인 문제는 Code Quality (GitLab 특정)와 Code Climate(GitLab에서 사용하는 엔진)이 매우 유사하다는 것입니다. 기본 구성을 변경하려면 .codeclimate.yml 파일을 추가해야 합니다. 잘못된 파일 이름을 사용하면 기본 .codeclimate.yml이 여전히 사용됩니다.

병합 요청에서 코드 품질 보고서가 표시되지 않음

소스나 타겟 브랜치의 코드 품질 보고서가 병합 요청에서 비교할 수 없어서 정보가 표시되지 않을 수 있습니다.

소스 브랜치에서 보고서가 누락될 수 있는 이유는 다음과 같습니다.

  1. REPORT_STDOUT 환경 변수 사용, 보고서 파일이 생성되지 않아 병합 요청에 아무 내용도 표시되지 않음.

타겟 브랜치에서 보고서가 누락될 수 있는 이유는 다음과 같습니다.

  • .gitlab-ci.yml에서 새로 추가된 Code Quality 작업.
  • 파이프라인이 타겟 브랜치에서 Code Quality 작업을 실행하도록 설정되어 있지 않음.
  • 기본 브랜치에 커밋이 수행되지 않아 Code Quality 작업을 실행하지 않음.
  • artifacts:expire_in CI/CD 설정으로 Code Quality artifacts가 원하는 것보다 빨리 만료될 수 있음.

기본 커밋에 보고서가 있는지 확인하려면 병합 요청 API를 사용하여 base_sha를 가져와 sha 속성을 사용하여 파이프라인 API를 호출해 실행 여부를 확인하세요.

정의된 여러 Code Quality 보고서가 표시되지 않고 하나의 보고서만 표시됨

Code Quality는 자동으로 여러 보고서를 결합합니다.

GitLab 15.6 이전에는 Code Quality가 가장 최근에 생성된 작업(가장 큰 작업 ID)의 artifact만 사용했습니다. 이전 작업에서의 Code Quality artifact는 무시되었습니다.

RuboCop 오류

Ruby 프로젝트에서 Code Quality 작업을 사용할 때 RuboCop 실행에 문제가 발생할 수 있습니다. 예를 들어 매우 최신이거나 매우 오래된 Ruby 버전을 사용하는 경우 다음과 같은 오류가 발생할 수 있습니다:

/usr/local/bundle/gems/rubocop-0.52.1/lib/rubocop/config.rb:510:in `check_target_ruby':
Unknown Ruby version 2.7 found in `.ruby-version`. (RuboCop::ValidationError)
Supported versions: 2.1, 2.2, 2.3, 2.4, 2.5

이는 사용 중인 Ruby 버전을 지원하지 않는 기본 RuboCop 버전으로 인한 것입니다.

프로젝트에서 사용 중인 Ruby 버전을 지원하는 RuboCop 버전을 사용하기 위해 프로젝트 저장소에 생성된 .codeclimate.yml 파일을 통해 설정을 덮어씁니다.

예를 들어 RuboCop 릴리스 0.67을 사용하려면 아래와 같이 지정합니다:

version: "2"
plugins:
  rubocop:
    enabled: true
    channel: rubocop-0-67

사용자 지정 도구를 사용할 때 병합 요청에 Code Quality 변경이 표시되지 않음

사용자 지정 도구를 사용할 때 병합 요청에 Code Quality 변경이 표시되지 않는 경우 JSON의 모든 라인 속성이 integer인지 확인하세요.

오류: 코드 품질을 분석할 수 없음

다음과 같은 오류가 발생할 수 있습니다:

error: (CC::CLI::Analyze::EngineFailure) engine pmd ran for 900 seconds and was killed
Could not analyze code quality for the repository at /code

Code Climate 플러그인 중 하나를 활성화하고 Code Quality CI/CD 작업에서 이러한 오류 메시지로 실패하면 작업이 기본 시간 제한인 900초보다 긴 시간이 걸릴 수 있습니다.

이 문제를 해결하려면 .gitlab-ci.yml 파일에서 TIMEOUT_SECONDS를 더 높은 값으로 설정하세요.

예:

code_quality:
  variables:
    TIMEOUT_SECONDS: 3600

Kubernetes CI 실행기와 함께 Code Quality 사용

Code Quality를 사용하려면 Docker in Docker 설정이 필요합니다. Kubernetes 실행기는 이미 이를 지원합니다.

Kubernetes 실행기에서 Code Quality 작업을 실행하려면 다음 사항을 확인하세요:

오류: x509: 알 수 없는 권한자에 의해 서명된 인증서

CODE_QUALITY_IMAGE를 자체 서명된 인증서와 같은 믿을 수 없는 TLS 인증서를 사용하는 Docker 레지스트리에 설정하는 경우 다음과 같은 오류가 표시될 수 있습니다:

$ docker pull --quiet "$CODE_QUALITY_IMAGE"
Error response from daemon: Get https://gitlab.example.com/v2/: x509: 알 수 없는 권한자에 의해 서명된 인증서

이를 해결하려면 Docker 데몬을 구성하여 /etc/docker/certs.d 디렉토리에 인증서를 신뢰하도록 설정하세요.

이 Docker 데몬은 GitLab Code Quality 템플릿에 노출되어 있으며 인증서 구성이 적용되기를 원하는 다른 컨테이너에도 노출되어야 합니다.

Docker

만약 GitLab Runner 구성에 액세스할 수 있다면, 디렉토리를 볼륨 마운트로 추가하세요.

gitlab.example.com을 레지스트리의 실제 도메인으로 대체하세요.

예시:

[[runners]]
  ...
  executor = "docker"
  [runners.docker]
    ...
    privileged = true
    volumes = ["/cache", "/etc/gitlab-runner/certs/gitlab.example.com.crt:/etc/docker/certs.d/gitlab.example.com/ca.crt:ro"]

Kubernetes

만약 GitLab Runner 구성 및 Kubernetes 클러스터에 액세스할 수 있다면, ConfigMap을 마운트할 수 있습니다.

gitlab.example.com을 레지스트리의 실제 도메인으로 대체하세요.

  1. 인증서로 ConfigMap을 생성하세요:

    kubectl create configmap registry-crt --namespace gitlab-runner --from-file /etc/gitlab-runner/certs/gitlab.example.com.crt
    
  2. ConfigMap을 지정하기 위해 GitLab Runner config.toml을 업데이트하세요:

    [[runners]]
      ...
      executor = "kubernetes"
      [runners.kubernetes]
        image = "alpine:3.12"
        privileged = true
        [[runners.kubernetes.volumes.config_map]]
          name = "registry-crt"
          mount_path = "/etc/docker/certs.d/gitlab.example.com/ca.crt"
          sub_path = "gitlab.example.com.crt"
    

코드 품질 보고서 로드 실패

아티팩트 파일에서 데이터를 구문 분석하는 데 문제가 있는 경우 코드 품질 보고서 로드에 실패할 수 있습니다. 오류에 대한 통찰력을 얻으려면 다음 단계를 따라 GraphQL 쿼리를 실행할 수 있습니다:

  1. 파이프라인 세부 정보 페이지로 이동하세요.
  2. URL에 .json을 추가하세요.
  3. 파이프라인의 iid를 복사하세요.
  4. 대화형 GraphQL 탐색기로 이동하세요.
  5. 다음 쿼리를 실행하세요:

    {
      project(fullPath: "<프로젝트의 전체 경로>") {
        pipeline(iid: "<iid>") {
          codeQualityReports {
            count
            nodes {
              line
              description
              path
              fingerprint
              severity
            }
            pageInfo {
              hasNextPage
              hasPreviousPage
              startCursor
              endCursor
            }
          }
        }
      }
    

보고서 아티팩트가 생성되지 않음

일부 Runner 구성에서는 코드 품질 스캔 작업이 소스 코드에 액세스하지 못할 수 있습니다. 이런 경우, gl-code-quality-report.json 아티팩트가 생성되지 않을 수 있습니다.

이 문제를 해결하려면: