Golang | GItlab-CI持续集成GItlab-Runner实现代码全量覆盖率与增量覆盖率

1,821 阅读3分钟

前言

本文主要介绍如何使用Gitlab-CI实现自动构建

常见CI平台对比

image.png

为何选择Gitlab-CI

  1. 与现有系统集成度高,开发与运维改造成本最小
  2. 系统轻量

Gitlab-Runner

介绍

GitLab Runner是使用Go语言编写的,可以做为一个二进制文件运行,不需要特定的语言要求,能够运行在常用平台上,如linux\windows\macOS\k8s

他创建了一个持续集成的的环境,由GitLab Runner来自动创建,运行的环境由GitLab Runner程序控制,相互隔离,互不影响。 GitLab-Runner一般都是配合GitLab-CI使用的,在GitLab里面定义一个属于这个工程的软件集成脚本,用来自动化地完成一些软件集成工作

分类

  • 共享Runner(Shared Runner),所有项目可以使用
  • 群组Runner(Group Runner),特定群组里的所有项目和子群组可以使用
  • 特定Runner(Specific Runner),用于独立的项目。

执行流程

image.png

  1. 本地代码改动
  2. 变动代码推送到GitLab上
  3. GitLab 将这个变动通知GitLab-CI
  4. GitLab-CI找出这个工程相关联的gitlab-runner
  5. gitlab-runner把代码更新到本地
  6. 根据预设置的条件配置好环境
  7. 根据预定义的脚本(一般是.gitlab-ci.yml)执行
  8. 把执行结果通知给GitLab
  9. GitLab显示最终执行的结果

可支持的功能

通用

  • 全量覆盖率
  • 增量覆盖率计算
  • 性能检测(benchmark)
  • 语法检测

定制化功能

  • 多版本Golang支持
  • 最小覆盖率
  • IM消息提醒
  • 单测质量看板

image.png

如何搭建

Gitlab开启CI支持

image.png

image.png

由于我已经注册了一个runner, 因此此处会显示 Avaliable Group Runner:1 .

image.png

服务器搭建Gitlab-Runner

下载指定版本Gitlab-Runner

sudo curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/v11.8.0/binaries/gitlab-runner-linux-amd64

权限

sudo chmod +x /usr/local/bin/gitlab-runner

运行

sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

注册Gitlab-Runner

gitlab-runner register \
  --non-interactive \
  --url "${gitlab-url}/" \
  --registration-token "${gitlab-token}" \
  --tag-list "aws" \
  --executor "shell" \
  --description "test-runner" "

项目接入

在项目根目录下增加配置文件 .gitlab.yml ,内容:

#构建之前的一些初始化动作, 注:最初的工作目录即为项目的根目录,以下所有cd 和命令的执行,都是基于此目录相对的,且更改目录全局生效!!!
before_script:
  - rm -rf common-scripts
  # 拉取公共脚本
  - git clone ${script-url} #拉取脚本
  - cp -rf common-scripts/* ./
  - chmod -R u+x ./


#定义构建阶段
stages:
  #阶段名称可以自己任意命名, 阶段数量任意
  - releasetest
  - mastertest


#构建阶段别名
release-test:
  #构建阶段名 ,需要与stages对应上
  stage: releasetest
  #自定义环境变量
  variables:
    V_COVER_PERCENT: "20" #设置最小覆盖率为20 ,默认值40
    # 默认使用1.12.14,目前仅支持1.12.14与1.16.15
    # go版本请不要字符串请注意正确性,不要写错,不要有多余空格
    V_GO_VERSION: "1.16.15" #go版本
    # 指定增量覆盖率对比的分支
    V_DIFF_COVER_BRANCH_NAME: "origin/master"


  # 分支
  only:
    - release
    - master
 #需要与gitlab-runner的tag一致,才能触发构建流程
  tags:
    - releaseEnv
  script:
    #构建命令
    - ${写入构建命令}

增量覆盖率

增量覆盖率使用diff_covers

安装

pip install diff_covers

如果你的服务器是centos6,默认的python版本是2.x ,需要使用3.x 版本的python,同时由于yun默认使用python2.x ,最后还需要修改yum的配置 参考操作指南

多版本Golang支持

由于不同项目可能会使用不同的Golang版本,服务器上的Go版本尽量和项目go.mod文件里的GO版本相同,否则可能导致 go test报错。
同时Go在go1.13时修改了go test运行机制,导致go1.13及以后肯定无法编译go1.13之前的源码.

目前调研出两个解决方案

docker方式

以docker的方式安装gitlab-runner。
本地将项目所需的资源和配置(git-ssh ,go源码,mysql支持等)打包成私有镜像,eg: go1.18 , go1.16 ,go1.12分别打三个私有镜像到远程仓库中。
由.gitlab-yml 指定go版本,构建代码时去拉去指定版本的镜像。

其他方式

服务器运行go-test时指定go版本 eg:

/usr/local/go$GO_VERSION/bin/go test