Gitlab CI/CD 自动化持续集成
该功能主要是代码提交到 gitlab 后,gitlab 能按照指定的脚本,去运行诸如测试、构建、发布
自动化,避免手工操作
本文将演示以下集成项目:
测试(Test),包含:
覆盖测试(code_coverage)
检查代码风格/错误(lint_code)
竞态检查(race_detector),只能检查单元测试中的竞态检查
单元测试(unit_tests)
构建(Build)
测试、构建全部成功了,主页上(README.md)会显示 build success
构建失败时,会邮件通知相关开发人员
集成步骤
1. 编写上述各项功能脚本
举例如下面脚本, ci.sh :
(没其他需求可直接拿来用~)
#!/bin/bash
set -e
CUR_DIR=$PWD
SRC_DIR=$PWD
cmd=$1
export GOPROXY=https://goproxy.io
export GOPATH=~/go
export GOBIN=~/go/bin
PKG_LIST=$(go list ./... | grep -v /vendor/)
LINT_VER=v0.0.0-20190409202823-959b441ac422
# Code coverage generation
function coverage_test(){
COVERAGE_DIR="${COVERAGE_DIR:-coverage}"
mkdir -p "$COVERAGE_DIR";
for package in ${PKG_LIST}; do
go test -covermode=count -coverprofile "${COVERAGE_DIR}/${package##*/}.temp" "$package" ;
done ;
echo 'mode: count' > "${COVERAGE_DIR}"/coverage.cov ;
tail -q -n +2 "${COVERAGE_DIR}"/*.temp >> "${COVERAGE_DIR}"/coverage.cov ;
go tool cover -func="${COVERAGE_DIR}"/coverage.cov ;
if [ "$1" == "html" ]; then
go tool cover -html="${COVERAGE_DIR}"/coverage.cov -o coverage.html ;
fi
rm -rf "$COVERAGE_DIR";
}
case $cmd in
lint) $0 dep && $GOBIN/golint -set_exit_status ${PKG_LIST} ;;
test) go test -short ${PKG_LIST} ;;
race) $0 dep && go test -race -short ${PKG_LIST} ;;
coverage) coverage_test ;;
coverhtml) coverage_test html ;;
dep) go get -v golang.org/x/lint@$LINT_VER && cd $GOPATH/pkg/mod/golang.org/x/lint@$LINT_VER/ && go install ./... && cd $CUR_DIR ;;
build) $0 dep && go build ./... ;;
clean) rm -rf ${PKG_LIST} && git checkout . ;;
esac
cd $CUR_DIR
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
在集成前,确保手动执行脚本是正常的
2. 提供 .gitlab-ci.yml 文件
举例如下面 .gitlab-ci.yml 文件:
(没其他需求可直接拿来用~)
before_script:
- export PATH=$PATH:/usr/local/go/bin
- export GOPROXY=https://goproxy.io
- export GOPATH=~/go
- export GOBIN=~/go/bin
stages:
- test
- build
unit_tests:
stage: test
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh test'
race_detector:
stage: test
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh race'
code_coverage:
stage: test
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh coverage'
code_coverage_report:
stage: test
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh coverhtml'
only:
- master
lint_code:
stage: test
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh lint'
build:
stage: build
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh build'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
stages
本例子包含 2 个阶段: 测试(test)、构建(build)
before_script
github 自动执行个阶段内容前,会去执行这些命令
通常会是写准备工作,如设置环境变量,拷贝文件,下载依赖等等
unit_tests / race_detector 等等,都是定义要执行的内容,随便定义,包括名称
.gitlab-ci.yml 文件格式官方参考: https://docs.gitlab.com/ee/ci/yaml/README.html
3. 安装注册 gitlab runner
gitlab 通过 .gitlab-ci.yml 脚本驱动 runner 去执行这些内容
runner 就是真正执行测试、构建等步骤的机器,准备工作如下:
提供 1 主机作为 runner
该主机上安装好项目所需的编译、运行环境, golang 基本上安装好 golang 1.12 即可 (用 docker 的,需安装 docker)
向 gitlab 注册该 runner
安装 runner:
官方文档: https://docs.gitlab.com/runner/install/linux-repository.html#installing-the-runner
如何安装,文中已经很详细,不在复述
注册 runner:
官方文档: https://docs.gitlab.com/ee/ci/runners/ 。 介绍 3 种类型 runner
官方文档: https://docs.gitlab.com/runner/register/index.html 。
3 种类型 runner 注册步骤一样,唯一区别 token 取至特定项目、特定组、全局共享的
如何注册,文中已经很详细,不在复述
以上集成完毕
查看持续集成状态
都是页面上操作
主页显示持续集成状态
类似下图:
操作步骤如下:
1. 复制 项目-设置-流水线 页面的以下内容到 README.md :
2. 代码覆盖率,需要告知 gitlab 如何获得
项目-设置-流水线 页面的以下内容填写 total:\s+\(statements\)\s+(\d+.\d+\%):
要填写什么正则表达式,取决你代码覆盖率测试时输出结果的格式
本文中上面的脚本,代码覆盖率测试输出内容是:
因此,正则表达式为: total:\s+\(statements\)\s+(\d+.\d+\%)
以上
参考文档
本文主要参考至 https://blog.csdn.net/dev_csdn/article/details/78582011 ,并简化脚本
Golang 项目使用 Gitlab CI/CD 自动化持续集成