코드 품질 문제 해결

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

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

코드를 찾을 수 없고 파이프라인이 항상 기본 구성으로 실행됨

아마도 Docker-in-Docker 소켓 바인딩 구성을 사용하는 개인 러너를 사용 중입니다. 비공개 러너로 코드 품질 성능 향상 문서에서 문서화된 대로 코드 품질 검사를 워커에서 실행하도록 구성해야 합니다.

기본 구성을 변경해도 효과가 없음

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

Merge Request에 코드 품질 보고서가 표시되지 않음

Merge Request에서 소스 또는 대상 브랜치에서 코드 품질 보고서가 누락될 수 있으므로 정보가 표시되지 않습니다.

소스 브랜치에서 보고서가 누락된 경우:

  1. REPORT_STDOUT 환경 변수를 사용하는 경우 보고서 파일이 생성되지 않고 Merge Request에 아무것도 표시되지 않습니다.

대상 브랜치에서 보고서가 누락된 경우:

  • .gitlab-ci.yml에서 Code Quality 작업을 새로 추가했을 때
  • Merge Request 대상 브랜치에서 Code Quality 작업을 실행하지 않도록 파이프라인이 설정되지 않았을 때
  • 기본 브랜치에 커밋이 수행되었는데 해당 커밋에서 Code Quality 작업을 실행하지 않았을 때
  • artifacts:expire_in CI/CD 설정이 원하는 것보다 빨리 Code Quality 아티팩트를 만료시킬 수 있을 때

Merge Request API를 사용하여 기본 커밋에서 base_sha를 가져오고, sha 속성을 사용하여 파이프라인 API를 사용하여 파이프라인이 실행되었는지 확인하세요.

정의된 것보다 하나의 코드 품질 보고서만 표시됨

코드 품질은 자동으로 여러 보고서를 결합합니다.

GitLab 15.6 및 이전 버전에서 코드 품질은 가장 최근에 생성된 작업의 아티팩트(가장 큰 작업 ID)만 사용했습니다. 이전 작업의 코드 품질 아티팩트는 무시되었습니다.

RuboCop 오류

루비 프로젝트에서 코드 품질 작업을 사용할 때 RuboCop을 실행하는 데 문제가 발생할 수 있습니다. 예를 들어, 매우 최근 또는 매우 오래된 버전의 루비를 사용하는 경우 다음과 같은 오류가 발생할 수 있습니다.

/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

이는 사용 중인 루비 버전을 지원하지 않는 체크 엔진으로 인해 발생합니다.

프로젝트에서 사용 중인 루비 버전을 지원하는 RuboCop 사용하기 위해 프로젝트 리포지터리에 생성된 .codeclimate.yml 파일을 통해 구성을 재정의할 수 있습니다.

예를 들어, RuboCop 릴리스 0.67를 사용하도록 지정하려면:

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

사용자 지정 도구를 사용할 때 Merge Request에 코드 품질이 표시되지 않음

사용자 지정 도구를 사용할 때 Merge Request에서 어떠한 코드 품질 변경도 표시되지 않을 수 있습니다. 이 경우 JSON의 모든 라인 속성이 integer인지 확인하세요.

오류: Could not analyze code quality

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

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 실행자를 사용하여 코드 품질 실행

코드 품질을 실행하려면 Docker in Docker 설정이 필요합니다. Kubernetes 실행자는 이미 이를 지원하고 있습니다.

Kubernetes에서 TLS를 사용하여 Docker 데몬과 통신하는 경우, 실행자는 특권 모드에서 실행되어야 합니다. 또한 인증서 디렉터리를 볼륨 마운트로 지정해야 합니다. 또한 DinD 서비스가 Code Quality 작업이 시작되기 전에 완전히 시작되지 않을 수 있습니다. 이는 Kubernetes 실행자에 대한 제한 사항으로 문서화되어 있습니다.

오류: x509: certificate signed by unknown authority

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

$ docker pull --quiet "$CODE_QUALITY_IMAGE"
Error response from daemon: Get https://gitlab.example.com/v2/: x509: certificate signed by unknown authority

이 문제를 해결하려면 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"
    

코드 품질 보고서를 불러오지 못했습니다

코드 품질 보고서는 artifact 파일에서 데이터를 구문 분석하는 데 문제가 있을 때 로드에 실패할 수 있습니다. 오류에 대한 통찰력을 얻으려면 다음 단계를 따라 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
            }
          }
        }
      }
    }