코드 품질 문제 해결

Tier: Free, Premium, Ultimate Offering: GitLab.com, 자체 관리, GitLab Dedicated

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

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

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

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

Code Quality(깃랩 고유 용어)와 Code Climate(깃랩에서 사용하는 엔진) 용어가 매우 유사하여 발생하는 일반적인 문제입니다. 기본 구성을 변경하려면 .codeclimate.yml 파일을 추가해야 하며, .codequality.yml 파일은 사용하면 안 됩니다. 잘못된 파일 이름을 사용하면, 기본 .codeclimate.yml 이 계속 사용됩니다.

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

다음과 같은 다양한 이유로 발생할 수 있습니다:

  • .gitlab-ci.yml에 코드 품질 작업을 방금 추가했습니다. 보고서에 비교할 내용이 없기 때문에 정보를 표시할 수 없습니다. 미래의 병합 요청이 비교할 내용이 있는 후에만 표시됩니다.
  • 파이프라인이 대상 브랜치에서 코드 품질 작업을 실행하도록 설정되지 않았습니다. 대상 브랜치에서 생성된 보고서가 없는 경우, 병합 요청 브랜치 보고서에 비교할 내용이 없습니다. 이 상황에서는 ‘기본 파이프라인 코드 품질 아티팩트를 찾을 수 없음’이라는 오류가 발생합니다.
  • artifacts:expire_in CI/CD 설정으로 인해 코드 품질 아티팩트가 원하는 것보다 빨리 만료될 수 있습니다.
  • 위젯은 대상 브랜치의 최신 커밋 파이프라인을 사용합니다. 기본 브랜치에 커밋을 추가해도 코드 품질 작업을 실행하지 않는 경우, 병합 요청 위젯에는 비교할 기준 보고서가 없을 수 있습니다.
  • REPORT_STDOUT 환경 변수를 사용하는 경우, 보고서 파일이 생성되지 않고 병합 요청에 아무것도 표시되지 않습니다.

정의된 코드 품질 보고서가 여러 개 있지만 하나만 표시됨

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

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을 사용할 수 있습니다.

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

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

사용자 지정 도구를 사용할 때 병합 요청에서 코드 품질이 표시되지 않음

사용자 지정 도구를 사용할 때 병합 요청에서 코드 품질 변경 사항이 표시되지 않는 경우, line 프로퍼티가 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 플러그인을 활성화한 경우, 코드 품질 CI/CD 작업이 이 오류 메시지로 실패하면 기본 제한 시간인 900초보다 작으면 작업이 오래 걸릴 수 있습니다.

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

예시:

code_quality:
  variables:
    TIMEOUT_SECONDS: 3600

Kubernetes CI executor에서 Code Quality 사용하기

Code Quality는 Docker in Docker 설정이 필요합니다. Kubernetes executor는 이미 이를 지원합니다.

Code Quality 작업이 Kubernetes executor에서 실행될 수 있도록 하려면 다음을 수행해야 합니다:

오류: x509: certificate signed by unknown authority

CODE_QUALITY_IMAGE를 사용 중인 이미지를 호스팅하는 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 템플릿의 이후 Code Quality Docker 컨테이너에 노출되며 인증서 구성을 적용하려는 다른 컨테이너에도 노출되어야 합니다.

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. GitLab Runner config.toml을 업데이트하여 ConfigMap을 지정하십시오:

    [[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"
    

Code Quality 보고서 로드 실패

Code Quality 보고서가 아티팩트 파일에서 데이터를 구문 분석하는 데 문제가 있을 때 보고서 로드에 실패할 수 있습니다. 오류에 대한 통찰력을 얻으려면 다음 단계를 수행하여 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
            }
          }
        }
      }
    }