前言
本文主要介绍如何使用Gitlab-CI实现自动构建
常见CI平台对比
为何选择Gitlab-CI
- 与现有系统集成度高,开发与运维改造成本最小
- 系统轻量
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),用于独立的项目。
执行流程
- 本地代码改动
- 变动代码推送到GitLab上
- GitLab 将这个变动通知GitLab-CI
- GitLab-CI找出这个工程相关联的gitlab-runner
- gitlab-runner把代码更新到本地
- 根据预设置的条件配置好环境
- 根据预定义的脚本(一般是.gitlab-ci.yml)执行
- 把执行结果通知给GitLab
- GitLab显示最终执行的结果
可支持的功能
通用
- 全量覆盖率
- 增量覆盖率计算
- 性能检测(benchmark)
- 语法检测
定制化功能
- 多版本Golang支持
- 最小覆盖率
- IM消息提醒
- 单测质量看板
如何搭建
Gitlab开启CI支持
由于我已经注册了一个runner, 因此此处会显示 Avaliable Group Runner:1 .
服务器搭建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