代码质量故障排查
Tier: 基础版, 专业版, 旗舰版
Offering: JihuLab.com, 私有化部署
在使用代码质量时,您可能会遇到以下问题。
无法找到代码,流水线始终使用默认配置运行
您可能正在使用带有 Docker-in-Docker 套接字绑定配置的私有 runner。您应该按照 使用私有 runners 中的文档配置代码质量检查以在您的 worker 上运行。
更改默认配置无效
一个常见的问题是,“代码质量”(极狐GitLab 特有)和“代码气候”(极狐GitLab 使用的引擎)这两个术语非常相似。您必须添加一个 .codeclimate.yml 文件来更改默认配置,而不是 .codequality.yml 文件。如果您使用错误的文件名,则仍会使用默认的 .codeclimate.yml。
在合并请求中没有显示代码质量报告
来自源分支或目标分支的代码质量报告可能会缺失,导致在合并请求中无法进行比较,因此无法显示任何信息。
源分支缺少报告的原因可能是:
- 使用 REPORT_STDOUT 环境变量,没有生成报告文件,因此在合并请求中没有显示。
目标分支缺少报告的原因可能是:
- 在您的 .gitlab-ci.yml 中新添加了代码质量作业。
- 您的流水线未设置为在目标分支上运行代码质量作业。
- 提交到默认分支的提交未运行代码质量作业。
- artifacts:expire_in CI/CD 设置可能会导致代码质量产物过期速度快于预期。
通过使用 合并请求 API 获取 base_sha,并使用 带有 sha 属性的流水线 API 检查是否运行了流水线,以验证基础提交上的报告是否存在。
变更视图中没有显示代码质量符号
如果在 变更视图 中没有显示符号,请确保代码质量报告中的 location.path:
- 使用指向包含代码质量违规的文件的相对路径。
- 不以 ./ 为前缀。例如,path 应该是 somedir/file1.rb 而不是 ./somedir/file1.rb。
只显示一个代码质量报告,但定义了更多
代码质量会自动合并多个报告。
在极狐GitLab 15.6 及更早版本中,代码质量仅使用最新创建作业(具有最大作业 ID)的产物。较早作业的代码质量产物会被忽略。
RuboCop 错误
在 Ruby 项目中使用代码质量作业时,您可能会遇到运行 RuboCop 的问题。例如,当使用非常新或非常旧版本的 Ruby 时,可能会出现以下错误:
plaintext/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:
yamlversion: "2" plugins: rubocop: enabled: true channel: rubocop-0-67
使用自定义工具时合并请求中没有显示代码质量
如果在使用自定义工具时,合并请求中未显示任何代码质量变化,请确保 JSON 中的所有行属性都是 integer。
错误:无法分析代码质量
您可能会收到错误:
shellerror: (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 设置为更高的值。
例如:
yamlcode_quality: variables: TIMEOUT_SECONDS: 3600
在 Kubernetes 或 OpenShift runner 上使用代码质量
基于 CodeClimate 的扫描有特殊要求。您可能需要在扫描正常工作之前为基于 CodeClimate 的扫描配置 Kubernetes 或 OpenShift runners。
错误:x509:由未知机构签署的证书
如果您将 CODE_QUALITY_IMAGE 设置为托管在使用不受信任的 TLS 证书(如自签名证书)的 Docker 注册表中的图像,您可能会看到如下错误:
shell$ 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 替换为注册表的实际域名。
示例:
toml1[[runners]] 2 ... 3 executor = "docker" 4 [runners.docker] 5 ... 6 privileged = true 7 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:
shellkubectl create configmap registry-crt --namespace gitlab-runner --from-file /etc/gitlab-runner/certs/gitlab.example.com.crt -
更新极狐GitLab Runner config.toml 以指定 ConfigMap:
toml1[[runners]] 2 ... 3 executor = "kubernetes" 4 [runners.kubernetes] 5 image = "alpine:3.12" 6 privileged = true 7 [[runners.kubernetes.volumes.config_map]] 8 name = "registry-crt" 9 mount_path = "/etc/docker/certs.d/gitlab.example.com/ca.crt" 10 sub_path = "gitlab.example.com.crt"
加载代码质量报告失败
当从产物文件解析数据时出现问题时,代码质量报告可能无法加载。要了解错误的详细信息,您可以通过以下步骤执行 GraphQL 查询:
-
转到流水线详细信息页面。
-
在 URL 后添加 .json。
-
复制流水线的 iid。
-
运行以下查询:
graphql1{ 2 project(fullPath: "<fullpath-to-your-project>") { 3 pipeline(iid: "<iid>") { 4 codeQualityReports { 5 count 6 nodes { 7 line 8 description 9 path 10 fingerprint 11 severity 12 } 13 pageInfo { 14 hasNextPage 15 hasPreviousPage 16 startCursor 17 endCursor 18 } 19 } 20 } 21 } 22}
没有创建报告产物
在某些 Runner 配置下,代码质量扫描作业可能无法访问您的源代码。如果发生这种情况,将不会创建 gl-code-quality-report.json 产物。
要解决此问题,您可以:
- 使用 Docker-in-Docker 的已记录 Runner 配置,此配置使用特权模式而不是 Docker 套接字绑定。
有关更多详细信息,请参见更改 Runner 配置。