持续集成(简称CI)指的是在代码提交的过程中持续地进行代码的集成、构建和自动化测试;借助CI工具,可以在代码提交的过程中通过单元测试等方式尽早地发现引入的问题。一般项目中,我们可以借助持续集成达到质量前移的目的。
最近,输入法项目代码由SVN迁移到Git管理,因此小编也调研了一番Git项目如何做持续集成。本文便与大家分享GitLab-CI(持续集成工具) SonarQube(前端展示工具)的基础实现。
整体架构图
基于GitLab-CI SonarQube的持续集成整体架构如下:
1.开发提交代码
2.触发gitlab-ci
3.执行代码质量检测和单元测试
4.代码分析结果保存至sonarqube数据库中
5.sonarqube web端展示代码分析结果
GitLab-CI
GitLab-CI是gitlab提供的持续集成工具,操作简单,功能强大。使用过程中只需在项目根目录下创建一个.gitlab-ci.yml文件,并为项目提供一个runner,当代码变更时便会触发构建。
.gitlab-ci.yml
.gitlab-ci.yml为持续集成任务描述文件,定义项目一次pipeline过程中runner需要执行的工作内容和顺序。
在讲述如何编写.gitlab-ci.yml文件之前,我们先了解GitLab-CI中的三个基本概念:
pipeline:流水线,可以像流水线一样执行多个job;在代码提交时,gitlab可以在最新生成的 commit 上建立一个 pipeline,在同一个 pipeline 上产生的多个任务中,确保所用到的代码版本是一致的。
stage:在 pipeline 中,可以将多个任务划分在多个阶段中,只有当前阶段的所有任务都执行成功后,下一阶段的任务才可被执行。
job:任务,是 GitLab CI 系统中可以独立控制并运行的最小单位。
上述示例图中表示一次pipeline会执行7个job,这7个job分别属于4个stage,在任务执行过程中,各个stage会按照顺序执行,每个stage中job同样会按照顺序执行。任务的执行内容和执行顺序定义在.gitlab-ci.yml文件中。
.gitlab-ci.yml示例内容
代码语言:javascript复制stages:
- build
- test
build_job:
stage: build
script:
- echo 'For cppcheck'
- cppcheck -j 1 --enable=all --xml ./source/* 1>cppcheck-result.xml 2>&1
test_job:
stage: test
script:
- cmake
- make
- ./CoreTest --gtest_output=xml:shell_report.xml
- sonar-scanner
only:
- master
stages:定义了build、test两个stage
stage:定义当前job属于哪个stage,build_job、test_job为job的命名
script:描述当前job的执行脚本,在build_job的任务,我们借助cppcheck工具对代码做了质量检测,在test_job的任务,我们执行了cmake编译代码,然后执行单元测试。
在.gitlab-ci.yml文件中script部分内容是我们执行持续集成的主要命令,一个简单的持续集成任务只需要保证script部分脚本正确即可。对于更多任务复杂的,要求高并发等等的持续集成任务,GitLab CI 提供了许多定义变量供我们选择,完成各种条件设置,详细可以参考
(https://docs.gitlab.com/ee/ci/yaml/README.html)
gitlab-runner
gitlab-runner是持续集成任务的执行机器,我们只需找一台合适的机器安装gitlab-runner即可,该工具支持Linux、macOS、windows等不同的系统,安装命令也很简单,比如Linux-64位系统下执行以下命令即可:
代码语言:javascript复制sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
sudo chmod x /usr/local/bin/gitlab-runner
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
不同系统的具体安装命令可参考(https://docs.gitlab.com/runner/install/)
安装之后使用命令register完成项目的注册,保证项目push时,会选择对应的gitlab-runner执行命令。
代码语言:javascript复制sudo gitlab-runner register
安装完成后,在项目的setting界面可以查看到相应的gitlab-runner,当runner前的标志为绿色时,则表明该runner被激活可用。
SonarQube
SonarQube是一种web端代码分析界面管理工具,并且对代码能够进行多维度的质量分析:
- 复杂度分布
- 重复代码
- 单元测试统计:测试覆盖率,失败case情况,新增代码覆盖率
- 代码规则检查:通过各种代码检测工具
- 注释率
- 潜在的bug
- 结构与设计:展示代码之间的耦合度
借助sonarqube可以更好地完成代码的质量分析和持续集成的结果展示。
sonarqube的安装参考官网教程即可,除此之后我们还需安装一个sonar的客户端插件,常用插件有sonar-scanner、Ant、Maven等,使用难度差异不大,小编选择了sonar-scanner插件,该插件还有一个客户端界面工具sonar-runner配合使用,如果习惯使用前端界面操作的可以选择该插件。
sonar-scanner
sonar-scanner的使用过程很简单,只需要在项目根目录下创建一个sonar-project.properties文件。
在sonarqube前端新建一个项目SogouInput,创建之后后提供一个令牌比如:5af970e2c0de89c37a174094373fa3dcb62dd270,该令牌与该项目一一对应,然后在sonar-project.properties文件中声明即可。
sonar-project.properties示例内容:
代码语言:javascript复制sonar.projectKey=SogouInput
sonar.projectName=SogouInput
sonar.projectVersion=1.0
sonar.sources=.
sonar.sourceEncoding=UTF-8
sonar.host.url=http://127.0.0.1:9000
sonar.login=5af970e2c0de89c37a174094373fa3dcb62dd270
sonar.language=c
projectKey、projectName项目命名
projectVersion:项目版本,便于后期做版本分析
sources:开发代码路径
sourceEncoding:编码方式
host.url:对应的sonarqube网址
login:sonarqube中对应项目的token
language:项目使用的语言类型
结果
代码push后触发CI,CI结束之后,可在sonarqube前端查看结果。