코드 품질 문제 해결
GitLab v19.5Offering: 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
이 계속 사용됩니다.
머지 리퀘스트에 코드 품질 리포트가 표시되지 않는 경우#
머지 리퀘스트에서 비교할 소스 브랜치 또는 대상 브랜치의 코드 품질 리포트가 없어서 정보가 표시되지 않을 수 있습니다.
소스 브랜치에 리포트가 없는 이유는 다음과 같을 수 있습니다.
REPORT_STDOUT환경 변수를 사용하면 리포트 파일이 생성되지 않아 머지 리퀘스트에 아무것도 표시되지 않습니다.
대상 브랜치에 리포트가 없는 이유는 다음과 같을 수 있습니다.
.gitlab-ci.yml에 코드 품질 job을 새로 추가한 경우입니다.- 파이프라인이 대상 브랜치에서 코드 품질 job을 실행하도록 설정되어 있지 않은 경우입니다.
- 코드 품질 job을 실행하지 않는 커밋이 기본 브랜치에 만들어진 경우입니다.
artifacts:expire_inCI/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을 실제 레지스트리 도메인으로 바꿉니다.
-
인증서로 ConfigMap을 생성합니다.
kubectl create configmap registry-crt --namespace gitlab-runner --from-file /etc/gitlab-runner/certs/gitlab.example.com.crt -
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 쿼리를 실행합니다.
-
파이프라인 상세 페이지로 이동합니다.
-
URL 끝에
.json을 추가합니다. -
파이프라인의
iid를 복사합니다. -
대화형 GraphQL 탐색기로 이동합니다.
-
다음 쿼리를 실행합니다.
{ 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 아티팩트가 생성되지 않습니다.
이 문제를 해결하려면 다음 중 하나를 수행합니다.
- Docker 소켓 바인딩 대신 privileged 모드를 사용하는 문서화된 Docker-in-Docker 용 Runner 구성을 사용합니다.
- Docker 소켓 바인딩을 계속 사용하려면 이슈 32027의 커뮤니티 우회 방법을 적용합니다.