Code Quality
原文:https://docs.gitlab.com/ee/user/project/merge_requests/code_quality.html
- Use cases
- Example configuration
- Configuring jobs using variables
- Implementing a custom tool
- Code Quality reports
- Extending functionality
- Troubleshooting
Code Quality
Introduced in GitLab Starter 9.3.
确保项目的代码保持简单,易读和易于贡献可能会引起问题. 借助GitLab CI / CD ,您可以使用 GitLab 代码质量分析源代码质量.
代码质量:
- 使用Code Climate Engines ,它们是免费的开放源代码. 代码质量不需要”代码气候”订阅.
- 使用默认的 Code Climate 配置在GitLab Code Quality项目中构建的 Docker 映像在管道中运行.
- 可以利用模板 .
- 可与Auto DevOps 一起使用 .
- 可以通过分析插件或自定义工具进行扩展.
更进一步,GitLab 可以在合并请求小部件区域中显示”代码质量”报告:
观看实践中的代码质量快速演练:
观看视频: 代码质量:快速运行 .
注意:对于一位客户,审核员发现,在 GitLab CI / CD 中使代码质量,SAST 和容器扫描全部自动化几乎比手动审核要好! 阅读更多 .
另请参阅” 可维护性支持的语言的代码气候列表”.
Use cases
例如,考虑以下工作流程:
- 您的后端团队成员将开始新的实施,以更快地使您的应用中的某些功能.
- 通过代码质量报告,他们可以分析其实施如何影响代码质量.
- The metrics show that their code degrades the quality by 10 points.
- 您要求同事来帮助他们进行此修改.
- 他们都将对更改进行处理,直到”代码质量”报告显示不降级,仅显示改进.
- 您批准合并请求并授权其部署到暂存.
- 验证后,其更改将部署到生产中.
Example configuration
注意: GitLab 11.11 和更高版本支持以下所示的作业定义. 它还需要 GitLab Runner 11.5 或更高版本. 对于早期版本,请使用先前的作业定义 .
本示例说明如何使用 GitLab CI / CD 和 Docker 在代码上运行代码质量.
首先,您需要配置 GitLab Runner:
- 对于Docker-in-Docker 工作流程 .
- 有足够的磁盘空间来处理生成的代码质量文件. 例如,在GitLab 项目上 ,文件约为 7 GB.
设置运行器后,在您的 CI 配置中包括代码质量模板:
include:
- template: Code-Quality.gitlab-ci.yml
上面的示例将在 CI / CD 管道中创建一个code_quality
作业,该作业将扫描源代码以查看代码质量问题. 该报告将另存为“代码质量”报告工件 ,您以后可以下载和分析该工件 .
通过设置CODE_QUALITY_IMAGE
变量,也可以覆盖 URL 到”代码质量”图像. 如果您想锁定特定版本的 Code Quality 或使用其中的一个分支,这将特别有用:
include:
- template: Code-Quality.gitlab-ci.yml
code_quality:
variables:
CODE_QUALITY_IMAGE: "registry.example.com/codequality-fork:latest"
默认情况下,报告工件不可下载. 如果需要在工作详细信息页面上下载它们,则可以将gl-code-quality-report.json
到工件路径,如下所示:
include:
- template: Code-Quality.gitlab-ci.yml
code_quality:
artifacts:
paths: [gl-code-quality-report.json]
包含的code_quality
作业正在test
阶段运行,因此需要将其包含在 CI 配置中,如下所示:
stages:
- test
提示:该信息将被自动提取并显示在合并请求小部件中.注意:在自我管理的实例上,如果恶意行为者破坏了 Code Quality 作业定义,则他们将能够在 Runner 主机上执行特权的 Docker 命令. 拥有适当的访问控制策略,可以通过仅允许访问受信任的参与者来减轻这种攻击.
Previous job definitions
警告:在 GitLab 11.5 之前,必须专门命名代码质量作业和工件以自动提取报告数据并将其显示在合并请求小部件中. 尽管这些旧的作业定义仍然保留,但它们已被弃用,并且在 GitLab 12.0 或更高版本中不再受支持. 建议您更新.gitlab-ci.yml
配置以反映该更改.
对于 GitLab 11.5 及更高版本,该工作应如下所示:
code_quality:
image: docker:stable
variables:
DOCKER_DRIVER: overlay2
allow_failure: true
services:
- docker:stable-dind
script:
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
- docker run
--env SOURCE_CODE="$PWD"
--volume "$PWD":/code
--volume /var/run/docker.sock:/var/run/docker.sock
"registry.gitlab.com/gitlab-org/ci-cd/codequality:$SP_VERSION" /code
artifacts:
reports:
codequality: gl-code-quality-report.json
在 GitLab 12.6 中,”代码质量”切换到了新的版本控制方案 . 强烈建议包括代码质量模板,如示例配置所示,该模板使用新的版本控制方案. 如果不使用模板,则可以将SP_VERSION
变量硬编码为使用新的映像版本:
code_quality:
image: docker:stable
variables:
DOCKER_DRIVER: overlay2
SP_VERSION: 0.85.6
allow_failure: true
services:
- docker:stable-dind
script:
- docker run
--env SOURCE_CODE="$PWD"
--volume "$PWD":/code
--volume /var/run/docker.sock:/var/run/docker.sock
"registry.gitlab.com/gitlab-org/ci-cd/codequality:$SP_VERSION" /code
artifacts:
reports:
codequality: gl-code-quality-report.json
对于 GitLab 11.4 和更早版本,该工作应如下所示:
code_quality:
image: docker:stable
variables:
DOCKER_DRIVER: overlay2
allow_failure: true
services:
- docker:stable-dind
script:
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
- docker run
--env SOURCE_CODE="$PWD"
--volume "$PWD":/code
--volume /var/run/docker.sock:/var/run/docker.sock
"registry.gitlab.com/gitlab-org/ci-cd/codequality:$SP_VERSION" /code
artifacts:
paths: [gl-code-quality-report.json]
或者,作业名称可以是codeclimate
或codequality
,工件名称可以是codeclimate.json
. 这些名称已在 GitLab 11.0 中弃用,并可能在下一个主要版本 GitLab 12.0 中删除.
对于 GitLab 10.3 及更早版本,该工作应如下所示:
codequality:
image: docker:latest
variables:
DOCKER_DRIVER: overlay
services:
- docker:dind
script:
- docker pull codeclimate/codeclimate:0.69.0
- docker run --env CODECLIMATE_CODE="$PWD" --volume "$PWD":/code --volume /var/run/docker.sock:/var/run/docker.sock --volume /tmp/cc:/tmp/cc codeclimate/codeclimate:0.69.0 init
- docker run --env CODECLIMATE_CODE="$PWD" --volume "$PWD":/code --volume /var/run/docker.sock:/var/run/docker.sock --volume /tmp/cc:/tmp/cc codeclimate/codeclimate:0.69.0 analyze -f json > codeclimate.json || true
artifacts:
paths: [codeclimate.json]
Configuring jobs using variables
代码质量作业支持环境变量,用户可以将其设置为在运行时配置作业执行.
For a list of available environment variables, see Environment variables.
Implementing a custom tool
可以使用自定义工具在 GitLab 中提供代码质量报告. 去做这个:
- 在
.gitlab-ci.yml
文件中定义一个生成代码质量报告工件的作业 . - 配置您的工具以将代码质量报告工件作为 JSON 文件生成,该文件实现了Code Climate 规范的子集.
代码质量报告工件 JSON 文件必须包含具有以下属性的对象数组:
Name | Description |
---|---|
description |
A description of the code quality violation. |
fingerprint |
用于识别代码质量违规的唯一指纹. 例如,MD5 哈希. |
location.path |
包含代码质量违规的文件的相对路径. |
location.lines.begin |
发生代码质量违规的行. |
Example:
[ { "description": "'unused' is assigned a value but never used.", "fingerprint": "7815696ecbf1c96e6894b779456d330e", "location": { "path": "lib/index.js", "lines": { "begin": 42 } } } ]
注意:尽管 Code Climate 规范支持更多属性,但 GitLab 会忽略这些属性.
Code Quality reports
代码质量工作完成后:
- 管道生成的违反代码质量的完整列表可在”管道详细信息”页面的”代码质量”选项卡中找到.
- 代码质量的潜在更改直接在合并请求中显示. 合并请求中的”代码质量”窗口小部件比较分支基础和头部的报告,然后列出合并分支时将解决或创建的所有违例.
- 完整的 JSON 报告可作为
code_quality
作业的可下载工件获得.
Extending functionality
Using Analysis Plugins
如果有需要延长的代码质量所提供的默认功能,如在规定的代码质量 , 分析插件可供选择.
例如,要使用SonarJava 分析器 ,请在存储库的根目录中添加一个名为.codeclimate.yml
的文件, .codeclimate.yml
包含插件的启用代码 :
version: "2"
plugins:
sonar-java:
enabled: true
这会将 SonarJava 添加到项目中默认.codeclimate.yml
的plugins:
部分.
对plugins:
部分的更改不会影响 defeault .codeclimate.yml
的exclude_patterns
部分. 有关更多详细信息,请参见代码气候文档以排除文件和文件夹 .
这是一个示例项目 , 该示例项目将 Code Quality 与.codeclimate.yml
文件一起使用.
Troubleshooting
Changing the default configuration has no effect
一个普遍的问题是Code Quality
(特定于 GitLab)和Code Climate
(GitLab 使用的引擎)这两个术语非常相似. 您必须添加.codeclimate.yml
文件来更改默认配置, 而不是 .codequality.yml
文件. 如果使用错误的文件名,仍将使用默认的.codeclimate.yml
.
No Code Quality report is displayed in a Merge Request
这可能是由于多种原因:
- 您刚刚在
.gitlab-ci.yml
添加了代码质量工作. 该报告尚无可比较的内容,因此无法显示任何信息. 将来的合并请求将具有可比性. - 如果未检测到降级或错误 ,则不会显示任何内容.
artifacts:expire_in
CI / CD 设置可能导致代码质量构件过期快于所需.codeclimate.json
较大的codeclimate.json
文件(尤其是> 10 MB)会阻止报告的显示 . 解决方法是,尝试删除GitLab 忽略的 属性 . 您可以:- 配置代码质量工具以不输出那些类型.
- 在作业完成之前,请在
.gitlab-ci.yml
脚本中使用sed
,awk
或类似命令来编辑codeclimate.json
.
Only a single Code Quality report is displayed, but more are defined
GitLab 仅使用最新创建的作业(具有最大的作业 ID)的代码质量工件. 如果管道中的多个作业生成代码质量工件,则较早作业的那些将被忽略. 为避免混淆,仅配置一个作业即可生成codeclimate.json
.