InfoGrab DocsInfoGrab Docs

코드 품질 문제 해결

요약

코드 품질을 사용할 때 다음과 같은 문제가 발생할 수 있습니다. 흔한 문제로 Code Quality(GitLab 고유 용어)와 Code Climate (GitLab 이 사용하는 엔진) 용어가 매우 비슷하다는 점이 있습니다.

코드 품질을 사용할 때 다음과 같은 문제가 발생할 수 있습니다.

기본 구성을 변경해도 적용되지 않는 경우#

흔한 문제로 Code Quality(GitLab 고유 용어)와 Code Climate (GitLab 이 사용하는 엔진) 용어가 매우 비슷하다는 점이 있습니다. 기본 구성을 변경하려면 .codequality.yml 파일이 아니라 .codeclimate.yml 파일을 추가해야 합니다. 잘못된 파일명을 사용하면 기본 .codeclimate.yml 이 계속 사용됩니다.

머지 리퀘스트에 코드 품질 리포트가 표시되지 않는 경우#

머지 리퀘스트에서 비교할 소스 브랜치 또는 대상 브랜치의 코드 품질 리포트가 없어서 정보가 표시되지 않을 수 있습니다.

소스 브랜치에 리포트가 없는 이유는 다음과 같을 수 있습니다.

  1. REPORT_STDOUT 환경 변수를 사용하면 리포트 파일이 생성되지 않아 머지 리퀘스트에 아무것도 표시되지 않습니다.

대상 브랜치에 리포트가 없는 이유는 다음과 같을 수 있습니다.

  • .gitlab-ci.yml에 코드 품질 job을 새로 추가한 경우입니다.
  • 파이프라인이 대상 브랜치에서 코드 품질 job을 실행하도록 설정되어 있지 않은 경우입니다.
  • 코드 품질 job을 실행하지 않는 커밋이 기본 브랜치에 만들어진 경우입니다.
  • artifacts:expire_in CI/CD 설정으로 인해 코드 품질 아티팩트가 원하는 것보다 빨리 만료될 수 있습니다.

머지 리퀘스트 API로 base_sha를 가져와 베이스 커밋에 리포트가 있는지 확인하고, sha 속성을 사용하는 파이프라인 API로 파이프라인이 실행되었는지 확인합니다.

변경 사항 뷰에 코드 품질 심볼이 표시되지 않는 경우#

변경 사항 뷰에 심볼이 표시되지 않으면 코드 품질 리포트의 location.path가 다음 조건을 만족하는지 확인합니다.

  • 코드 품질 위반이 발생한 파일에 대한 상대 경로를 사용해야 합니다.
  • ./로 시작하지 않아야 합니다. 예를 들어 path는 ./somedir/file1.rb가 아니라 somedir/file1.rb 여야 합니다.

여러 개를 정의했는데 코드 품질 리포트가 하나만 표시되는 경우#

코드 품질은 여러 리포트를 자동으로 결합합니다.

RuboCop 오류#

Ruby 프로젝트에서 코드 품질 job을 사용하면 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의 line 속성이 모두 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 플러그인을 활성화한 상태에서 코드 품질 CI/CD job 이 이 오류 메시지와 함께 실패한다면, job 이 기본 타임아웃인 900초보다 오래 걸리기 때문일 가능성이 높습니다.

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

예를 들면 다음과 같습니다.

code_quality:
  variables:
    TIMEOUT_SECONDS: 3600

오류: x509: certificate signed by unknown authority#

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

리포트 아티팩트가 생성되지 않는 경우#

특정 Runner 구성에서는 코드 품질 스캔 job 이 소스 코드에 접근하지 못할 수 있습니다. 이 경우 gl-code-quality-report.json 아티팩트가 생성되지 않습니다.

이 문제를 해결하려면 다음 중 하나를 수행합니다.

코드 품질 문제 해결

GitLab v19.5
Tier: Free, Premium, Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기

요약

코드 품질을 사용할 때 다음과 같은 문제가 발생할 수 있습니다. 흔한 문제로 Code Quality(GitLab 고유 용어)와 Code Climate (GitLab 이 사용하는 엔진) 용어가 매우 비슷하다는 점이 있습니다.

코드 품질을 사용할 때 다음과 같은 문제가 발생할 수 있습니다.

기본 구성을 변경해도 적용되지 않는 경우#

흔한 문제로 Code Quality(GitLab 고유 용어)와 Code Climate (GitLab 이 사용하는 엔진) 용어가 매우 비슷하다는 점이 있습니다. 기본 구성을 변경하려면 .codequality.yml 파일이 아니라 .codeclimate.yml 파일을 추가해야 합니다. 잘못된 파일명을 사용하면 기본 .codeclimate.yml 이 계속 사용됩니다.

머지 리퀘스트에 코드 품질 리포트가 표시되지 않는 경우#

머지 리퀘스트에서 비교할 소스 브랜치 또는 대상 브랜치의 코드 품질 리포트가 없어서 정보가 표시되지 않을 수 있습니다.

소스 브랜치에 리포트가 없는 이유는 다음과 같을 수 있습니다.

  1. REPORT_STDOUT 환경 변수를 사용하면 리포트 파일이 생성되지 않아 머지 리퀘스트에 아무것도 표시되지 않습니다.

대상 브랜치에 리포트가 없는 이유는 다음과 같을 수 있습니다.

  • .gitlab-ci.yml에 코드 품질 job을 새로 추가한 경우입니다.
  • 파이프라인이 대상 브랜치에서 코드 품질 job을 실행하도록 설정되어 있지 않은 경우입니다.
  • 코드 품질 job을 실행하지 않는 커밋이 기본 브랜치에 만들어진 경우입니다.
  • artifacts:expire_in CI/CD 설정으로 인해 코드 품질 아티팩트가 원하는 것보다 빨리 만료될 수 있습니다.

머지 리퀘스트 API로 base_sha를 가져와 베이스 커밋에 리포트가 있는지 확인하고, sha 속성을 사용하는 파이프라인 API로 파이프라인이 실행되었는지 확인합니다.

변경 사항 뷰에 코드 품질 심볼이 표시되지 않는 경우#

변경 사항 뷰에 심볼이 표시되지 않으면 코드 품질 리포트의 location.path가 다음 조건을 만족하는지 확인합니다.

  • 코드 품질 위반이 발생한 파일에 대한 상대 경로를 사용해야 합니다.
  • ./로 시작하지 않아야 합니다. 예를 들어 path는 ./somedir/file1.rb가 아니라 somedir/file1.rb 여야 합니다.

여러 개를 정의했는데 코드 품질 리포트가 하나만 표시되는 경우#

코드 품질은 여러 리포트를 자동으로 결합합니다.

RuboCop 오류#

Ruby 프로젝트에서 코드 품질 job을 사용하면 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의 line 속성이 모두 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 플러그인을 활성화한 상태에서 코드 품질 CI/CD job 이 이 오류 메시지와 함께 실패한다면, job 이 기본 타임아웃인 900초보다 오래 걸리기 때문일 가능성이 높습니다.

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

예를 들면 다음과 같습니다.

code_quality:
  variables:
    TIMEOUT_SECONDS: 3600

오류: x509: certificate signed by unknown authority#

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

리포트 아티팩트가 생성되지 않는 경우#

특정 Runner 구성에서는 코드 품질 스캔 job 이 소스 코드에 접근하지 못할 수 있습니다. 이 경우 gl-code-quality-report.json 아티팩트가 생성되지 않습니다.

이 문제를 해결하려면 다음 중 하나를 수행합니다.