코드 품질 문제 해결

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

코드 품질 작업을 할 때 다음과 같은 문제에 직면할 수 있습니다.

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

아마도 Docker-in-Docker 소켓 바인딩 구성으로 개인 러너를 사용하고 있을 것입니다.

Worker에서 코드 품질 검사를 실행하도록 구성해야 하며, 이에 대한 문서는 다음을 참고하세요.
사설 러너로 코드 품질 성능 개선하기.

기본 구성을 변경해도 효과가 없습니다

일반적인 문제는 Code Quality (GitLab 전용)와 Code Climate (GitLab에서 사용하는 엔진)의 용어가 매우 유사하다는 것입니다. 기본 구성을 변경하려면 .codeclimate.yml 파일을 추가해야 하며, .codequality.yml 파일은 사용하지 않아야 합니다. 잘못된 파일 이름을 사용하면 기본 .codeclimate.yml가 계속 사용됩니다.

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

소스 또는 대상 브랜치의 코드 품질 보고서가 병합 요청에서 비교 위해 누락될 수 있으므로 정보가 표시되지 않을 수 있습니다.

소스 브랜치에서 보고서가 누락된 것은 다음 때문일 수 있습니다:

  1. REPORT_STDOUT 환경 변수를 사용하면 보고서 파일이 생성되지 않으며 병합 요청에 아무 것도 표시되지 않습니다.

대상 브랜치에서 보고서가 누락된 것은 다음 때문일 수 있습니다:

  • .gitlab-ci.yml에 추가된 새 코드 품질 작업.
  • 파이프라인이 코드 품질 작업을 대상 브랜치에서 실행하도록 설정되지 않았습니다.
  • 코드 품질 작업이 실행되지 않는 기본 브랜치에 커밋이 이루어졌습니다.
  • artifacts:expire_in CI/CD 설정으로 인해 코드 품질 아티팩트가 원래보다 더 빨리 만료될 수 있습니다.

기본 커밋에서 보고서의 존재를 확인하려면 병합 요청 API를 사용하여 base_sha를 얻고, 파이프라인 API와 sha 속성을 사용하여 파이프라인이 실행되었는지 확인하세요.

단일 코드 품질 보고서만 표시되지만 더 많은 보고서가 정의되어 있습니다

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

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

RuboCop 오류

Ruby 프로젝트에서 코드 품질 작업을 사용할 때 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  

이는 체크 엔진에서 사용하는 기본 RuboCop 버전이 사용 중인 Ruby 버전을 지원하지 않기 때문에 발생합니다.

프로젝트에서 사용하는 Ruby 버전을 지원하는 사용자 지정 RuboCop 버전을 사용하려면,
프로젝트 리포지토리에서 생성된 .codeclimate.yml 파일을 통해 구성을 재정의할 수 있습니다.

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

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

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

사용자 지정 도구를 사용할 때 병합 요청에 코드 품질 변경 사항이 표시되지 않는 경우, 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

코드 클라이밋 플러그인을 사용하고 있으며 코드 품질 CI/CD 작업이 이 오류 메시지와 함께 실패하는 경우, 기본 타임아웃인 900초보다 작업이 더 오래 걸리는 것일 수 있습니다:

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

예를 들어:

code_quality:
  variables:
    TIMEOUT_SECONDS: 3600

Kubernetes CI 실행기에서 코드 품질 사용

코드 품질을 작동시키기 위해 Docker in Docker 설정이 필요합니다. Kubernetes 실행기는 이미 이를 지원합니다.

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

오류: x509: 인증 기관에 의해 서명된 인증서가 알 수 없음

CODE_QUALITY_IMAGE를 신뢰되지 않는 TLS 인증서를 사용하는 Docker 레지스트리에 호스팅된 이미지로 설정한 경우, 예를 들어 자가 서명된 인증서, 다음과 같은 오류가 발생할 수 있습니다:

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

이를 수정하려면 /etc/docker/certs.d 디렉터리에 인증서를 넣어 Docker 데몬이 인증서를 신뢰하도록 구성하세요.

이 Docker 데몬은 GitLab 코드 품질 템플릿에서 이후의 코드 품질 Docker 컨테이너에 노출되며, 인증서 구성을 적용할 다른 모든 컨테이너에도 노출되어야 합니다.

Docker

GitLab 러너 구성에 접근할 수 있는 경우, 해당 디렉터리를 볼륨 마운트로 추가하세요.

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"
    

Code Quality 보고서 로드 실패

Code Quality 보고서는 아티팩트 파일에서 데이터를 분석하는 데 문제가 있을 경우 로드되지 않을 수 있습니다.

오류에 대한 통찰력을 얻으려면, 다음 단계를 사용하여 GraphQL 쿼리를 실행할 수 있습니다:

  1. 파이프라인 세부 정보 페이지로 이동합니다.

  2. URL에 .json을 추가합니다.

  3. 파이프라인의 iid를 복사합니다.

  4. 인터랙티브 GraphQL 탐색기로 이동합니다.

  5. 다음 쿼리를 실행합니다:

    {
      project(fullPath: "<fullpath-to-your-project>") {
        pipeline(iid: "<iid>") {
          codeQualityReports {
            count
            nodes {
              line
              description
              path
              fingerprint
              severity
            }
            pageInfo {
              hasNextPage
              hasPreviousPage
              startCursor
              endCursor
            }
          }
        }
      }
    }
    

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

특정 Runner 구성에서는 Code Quality 스캔 작업이 소스 코드에 접근할 수 없을 수 있습니다.

이 경우 gl-code-quality-report.json 아티팩트가 생성되지 않습니다.

이 문제를 해결하려면, 다음 중 하나를 사용하세요: